Module: Otto::ResponseHelpers
- Defined in:
- lib/otto/helpers/response.rb
Instance Attribute Summary collapse
-
#request ⇒ Object
Returns the value of attribute request.
Instance Method Summary collapse
- #cookie_security_headers ⇒ Object
- #send_secure_cookie(name, value, ttl, opts = {}) ⇒ Object
- #send_session_cookie(name, value, opts = {}) ⇒ Object
Instance Attribute Details
#request ⇒ Object
Returns the value of attribute request.
5 6 7 |
# File 'lib/otto/helpers/response.rb', line 5 def request @request end |
Instance Method Details
#cookie_security_headers ⇒ Object
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/otto/helpers/response.rb', line 61 def # Add security headers that complement cookie security headers = {} # Prevent MIME type sniffing headers['x-content-type-options'] = 'nosniff' # Add referrer policy headers['referrer-policy'] = 'strict-origin-when-cross-origin' # Add frame options headers['x-frame-options'] = 'DENY' # Add XSS protection headers['x-xss-protection'] = '1; mode=block' headers end |
#send_secure_cookie(name, value, ttl, opts = {}) ⇒ Object
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/otto/helpers/response.rb', line 7 def (name, value, ttl, opts = {}) # Default security options defaults = { secure: true, httponly: true, same_site: :strict, path: '/', } # Merge with provided options = defaults.merge(opts) # Set expiration using max-age (preferred) and expires (fallback) if ttl&.positive? [:max_age] = ttl [:expires] = (Time.now.utc + ttl + 10) elsif ttl&.negative? # For deletion, set both to past date [:max_age] = 0 [:expires] = Time.now.utc - 86_400 end # Set the cookie value [:value] = value # Validate SameSite attribute valid_same_site = [:strict, :lax, :none, 'Strict', 'Lax', 'None'] [:same_site] = :strict unless valid_same_site.include?([:same_site]) # If SameSite=None, Secure must be true [:secure] = true if [:same_site].to_s.downcase == 'none' name, end |
#send_session_cookie(name, value, opts = {}) ⇒ Object
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# File 'lib/otto/helpers/response.rb', line 42 def (name, value, opts = {}) # Session cookies don't have expiration session_opts = opts.merge( secure: true, httponly: true, samesite: :strict, ) # Remove expiration-related options for session cookies session_opts.delete(:max_age) session_opts.delete(:expires) # Adjust secure flag for local development session_opts[:secure] = false if request.local? session_opts[:value] = value name, session_opts end |