securial 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +17 -26
  3. data/app/controllers/concerns/securial/identity.rb +4 -12
  4. data/app/controllers/securial/sessions_controller.rb +20 -8
  5. data/app/controllers/securial/status_controller.rb +1 -1
  6. data/app/models/concerns/securial/password_resettable.rb +15 -0
  7. data/app/models/securial/role.rb +1 -1
  8. data/app/models/securial/session.rb +2 -2
  9. data/app/models/securial/user.rb +3 -3
  10. data/app/views/securial/users/_securial_user.json.jbuilder +2 -0
  11. data/config/routes.rb +0 -1
  12. data/db/migrate/20250517155521_create_securial_users.rb +10 -7
  13. data/lib/generators/securial/install/templates/securial_initializer.erb +44 -14
  14. data/lib/generators/securial/install/views_generator.rb +25 -0
  15. data/lib/securial/auth/auth_encoder.rb +53 -0
  16. data/lib/securial/auth/errors.rb +15 -0
  17. data/lib/securial/auth/session_creator.rb +21 -0
  18. data/lib/securial/auth.rb +10 -0
  19. data/lib/securial/config/configuration.rb +50 -30
  20. data/lib/securial/config/errors.rb +2 -1
  21. data/lib/securial/config/validation.rb +96 -26
  22. data/lib/securial/config.rb +10 -0
  23. data/lib/securial/engine.rb +50 -35
  24. data/lib/securial/helpers/normalizing_helper.rb +11 -9
  25. data/lib/securial/helpers/regex_helper.rb +12 -10
  26. data/lib/securial/helpers.rb +9 -0
  27. data/lib/securial/inspectors/route_inspector.rb +11 -11
  28. data/lib/securial/inspectors.rb +8 -0
  29. data/lib/securial/key_transformer.rb +32 -0
  30. data/lib/securial/logger/broadcaster.rb +48 -0
  31. data/lib/securial/logger/builder.rb +60 -0
  32. data/lib/securial/logger/colors.rb +14 -0
  33. data/lib/securial/logger.rb +4 -67
  34. data/lib/securial/middlewares/request_logger_tag.rb +19 -0
  35. data/lib/securial/middlewares/transform_request_keys.rb +33 -0
  36. data/lib/securial/middlewares/transform_response_keys.rb +52 -0
  37. data/lib/securial/middlewares.rb +10 -0
  38. data/lib/securial/security/request_rate_limiter.rb +68 -0
  39. data/lib/securial/security.rb +8 -0
  40. data/lib/securial/version.rb +1 -1
  41. data/lib/securial/version_checker.rb +31 -0
  42. data/lib/securial.rb +12 -1
  43. metadata +38 -153
  44. data/db/migrate/20250524210207_add_password_reset_fields_to_securial_users.rb +0 -6
  45. data/lib/securial/config/_index.rb +0 -3
  46. data/lib/securial/helpers/_index.rb +0 -2
  47. data/lib/securial/inspectors/_index.rb +0 -1
  48. data/lib/securial/middleware/request_logger_tag.rb +0 -18
  49. data/lib/securial/sessions/_index.rb +0 -2
  50. data/lib/securial/sessions/errors.rb +0 -15
  51. data/lib/securial/sessions/session_encoder.rb +0 -56
@@ -1 +0,0 @@
1
- require_relative "route_inspector"
@@ -1,18 +0,0 @@
1
- module Securial
2
- module Middleware
3
- class RequestLoggerTag
4
- def initialize(app)
5
- @app = app
6
- end
7
-
8
- def call(env)
9
- request = ActionDispatch::Request.new(env)
10
- request_id = request.request_id || SecureRandom.uuid
11
-
12
- Securial::ENGINE_LOGGER.tagged("Securial", "RequestID:#{request_id}") do
13
- @app.call(env)
14
- end
15
- end
16
- end
17
- end
18
- end
@@ -1,2 +0,0 @@
1
- require_relative "errors"
2
- require_relative "session_encoder"
@@ -1,15 +0,0 @@
1
- module Securial
2
- module Sessions
3
- module Errors
4
- class BaseSessionError < StandardError
5
- def backtrace; []; end
6
- end
7
-
8
- class SessionEncodeError < BaseSessionError; end
9
- class SessionDecodeError < BaseSessionError; end
10
-
11
- class SessionRevokedError < BaseSessionError; end
12
- class SessionExpiredError < BaseSessionError; end
13
- end
14
- end
15
- end
@@ -1,56 +0,0 @@
1
- module Securial
2
- module Sessions
3
- module SessionEncoder
4
- class << self
5
- def encode(session)
6
- return nil unless session && session.class == Securial::Session
7
-
8
- base_payload = {
9
- jti: session.id,
10
- exp: expiry_duration.from_now.to_i,
11
- sub: "session-access-token",
12
- refresh_count: session.refresh_count,
13
- }
14
-
15
- session_payload = {
16
- ip: session.ip_address,
17
- agent: session.user_agent,
18
- }
19
-
20
- payload = base_payload.merge(session_payload)
21
- begin
22
- JWT.encode(payload, secret, algorithm, { kid: "hmac" })
23
- rescue JWT::EncodeError => e
24
- raise Errors::SessionEncodeError, "Failed to encode session: #{e.message}"
25
- end
26
- end
27
-
28
- def decode(token)
29
- begin
30
- decoded = JWT.decode(token, secret, true, { algorithm: algorithm, verify_jti: true, iss: "securial" })
31
- rescue JWT::DecodeError => e
32
- raise Securial::Sessions::Errors::SessionDecodeError, "Failed to decode session token: #{e.message}"
33
- end
34
- decoded.first
35
- end
36
-
37
- private
38
-
39
- def secret
40
- # Config::Validation.validate_session_secret!(Securial.configuration)
41
- Securial.configuration.session_secret
42
- end
43
-
44
- def algorithm
45
- # Config::Validation.validate_session_algorithm!(Securial.configuration)
46
- Securial.configuration.session_algorithm.to_s.upcase
47
- end
48
-
49
- def expiry_duration
50
- # Config::Validation.validate_session_expiry_duration!(Securial.configuration)
51
- Securial.configuration.session_expiration_duration
52
- end
53
- end
54
- end
55
- end
56
- end