lib/tynn/session.rb in tynn-1.0.0.rc2 vs lib/tynn/session.rb in tynn-1.0.0.rc3

- old
+ new

@@ -1,87 +1,85 @@ class Tynn - # Adds simple cookie based session management. If a secret token is - # given, it signs the cookie data to ensure that it cannot be altered - # by unauthorized means. + # Public: Adds simple cookie based session management. You can pass a secret + # token to sign the cookie data, thus unauthorized means can't alter it. # - # ``` - # require "tynn" - # require "tynn/session" + # Examples # - # Tynn.helpers(Tynn::Session, secret: "__change_me__") + # require "tynn" + # require "tynn/session" # - # Tynn.define do - # root do - # res.write(sprintf("hei %s", session[:username])) - # end + # Tynn.helpers(Tynn::Session, secret: "__change_me__") # - # on(:username) do |username| - # session[:username] = username + # Tynn.define do + # root do + # res.write(sprintf("hei %s", session[:username])) + # end + # + # on(:username) do |username| + # session[:username] = username + # end # end - # end - # ``` # # The following command generates a cryptographically secure secret ready # to use: # - # ``` - # $ ruby -r securerandom -e "puts SecureRandom.hex(64)" - # ``` + # $ ruby -r securerandom -e "puts SecureRandom.hex(64)" # # It's important to keep the token secret. Knowing the token allows an # attacker to tamper the data. So, it's recommended to load the token # from the environment. # - # ``` - # Tynn.helpers(Tynn::Session, secret: ENV["SESSION_SECRET"]) - # ``` + # Examples # - # Under the hood, Tynn::Session uses the [Rack::Session::Cookie][rack-session] - # middleware. Thus, supports all the options available for this middleware. + # Tynn.helpers(Tynn::Session, secret: ENV["SESSION_SECRET"]) # - # * `:key` - the name of the cookie. Defaults to `"rack.session"`. - # * `:expire_after` - sets the lifespan of the cookie. If `nil`, - # the cookie will be deleted after the user close the browser. - # Defaults to `nil`. - # * `:httponly` - if `true`, sets the [HttpOnly][cookie-httponly] attribute. - # This mitigates the risk of client side scripting accessing the cookie. - # Defaults to `true`. - # * `:secure` - if `true`, sets the [Secure][cookie-secure] attribute. - # This tells the browser to only transmit the cookie over HTTPS. Defaults - # to `false`. + # Under the hood, Tynn::Session uses the +Rack::Session::Cookie+ middleware. + # Thus, supports all the options available for this middleware: # - # ``` - # Tynn.helpers( - # Tynn::Session, - # key: "app", - # secret: ENV["SESSION_SECRET"], - # expire_after: 36_000, # seconds - # httponly: true, - # secure: true - # ) - # ``` + # key - The name of the cookie. Defaults to <tt>"rack.session"</tt>. # - # [cookie-httponly]: https://www.owasp.org/index.php/Session_Management_Cheat_Sheet#HttpOnly_Attribute - # [cookie-secure]: https://www.owasp.org/index.php/Session_Management_Cheat_Sheet#Secure_Attribute - # [rack-session]: http://www.rubydoc.info/gems/rack/Rack/Session/Cookie + # httponly - If +true+, sets the +HttpOnly+ flag. This mitigates the + # risk of client side scripting accessing the cookie. Defaults + # to +true+. # + # secure - If +true+, sets the +Secure+ flag. This tells the browser + # to only transmit the cookie over HTTPS. Defaults to `false`. + # + # expire_after - The lifespan of the cookie. If +nil+, the session cookie + # is temporary and is no retained after the browser is + # closed. Defaults to +nil+. + # + # Examples + # + # Tynn.helpers( + # Tynn::Session, + # key: "app", + # secret: ENV["SESSION_SECRET"], + # expire_after: 36_000, # seconds + # httponly: true, + # secure: true + # ) + # module Session - RACK_SESSION = "rack.session".freeze # :nodoc: + # Internal: Configures Rack::Session::Cookie middleware. + def self.setup(app, options = {}) + defaults = { secure: app.settings[:ssl] } - def self.setup(app, options = {}) # :nodoc: - app.use(Rack::Session::Cookie, options) + app.use(Rack::Session::Cookie, defaults.merge(options)) end - # Returns the session hash. - # - # ``` - # session # => {} - # - # session[:foo] = "foo" - # session[:foo] # => "foo" - # ``` - # - def session - return env[RACK_SESSION] + module InstanceMethods + # Public: Returns the session hash. + # + # Examples + # + # session # => {} + # + # session[:foo] = "foo" + # session[:foo] # => "foo" + # + def session + return env["rack.session".freeze] + end end end end