securial 0.4.2

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 (80) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +90 -0
  4. data/Rakefile +8 -0
  5. data/app/controllers/concerns/securial/identity.rb +67 -0
  6. data/app/controllers/securial/accounts_controller.rb +60 -0
  7. data/app/controllers/securial/application_controller.rb +18 -0
  8. data/app/controllers/securial/passwords_controller.rb +35 -0
  9. data/app/controllers/securial/role_assignments_controller.rb +49 -0
  10. data/app/controllers/securial/roles_controller.rb +44 -0
  11. data/app/controllers/securial/sessions_controller.rb +76 -0
  12. data/app/controllers/securial/status_controller.rb +9 -0
  13. data/app/controllers/securial/users_controller.rb +53 -0
  14. data/app/jobs/securial/application_job.rb +4 -0
  15. data/app/mailers/securial/application_mailer.rb +6 -0
  16. data/app/mailers/securial/securial_mailer.rb +17 -0
  17. data/app/models/concerns/securial/password_resettable.rb +47 -0
  18. data/app/models/securial/application_record.rb +18 -0
  19. data/app/models/securial/current.rb +6 -0
  20. data/app/models/securial/role.rb +10 -0
  21. data/app/models/securial/role_assignment.rb +6 -0
  22. data/app/models/securial/session.rb +27 -0
  23. data/app/models/securial/user.rb +54 -0
  24. data/app/views/layouts/securial/mailer.html.erb +13 -0
  25. data/app/views/layouts/securial/mailer.text.erb +1 -0
  26. data/app/views/securial/accounts/show.json.jbuilder +1 -0
  27. data/app/views/securial/passwords/_password.json.jbuilder +2 -0
  28. data/app/views/securial/passwords/index.json.jbuilder +1 -0
  29. data/app/views/securial/passwords/show.json.jbuilder +1 -0
  30. data/app/views/securial/role_assignments/show.json.jbuilder +1 -0
  31. data/app/views/securial/roles/_securial_role.json.jbuilder +9 -0
  32. data/app/views/securial/roles/index.json.jbuilder +6 -0
  33. data/app/views/securial/roles/show.json.jbuilder +1 -0
  34. data/app/views/securial/securial_mailer/reset_password.html.erb +5 -0
  35. data/app/views/securial/securial_mailer/reset_password.text.erb +4 -0
  36. data/app/views/securial/sessions/_session.json.jbuilder +15 -0
  37. data/app/views/securial/sessions/index.json.jbuilder +6 -0
  38. data/app/views/securial/sessions/show.json.jbuilder +1 -0
  39. data/app/views/securial/status/show.json.jbuilder +3 -0
  40. data/app/views/securial/users/_securial_user.json.jbuilder +14 -0
  41. data/app/views/securial/users/index.json.jbuilder +6 -0
  42. data/app/views/securial/users/show.json.jbuilder +1 -0
  43. data/bin/securial +58 -0
  44. data/config/routes.rb +41 -0
  45. data/db/migrate/20250515104930_create_securial_roles.rb +12 -0
  46. data/db/migrate/20250517155521_create_securial_users.rb +18 -0
  47. data/db/migrate/20250518122749_create_securial_role_assignments.rb +10 -0
  48. data/db/migrate/20250519075407_create_securial_sessions.rb +15 -0
  49. data/db/migrate/20250524210207_add_password_reset_fields_to_securial_users.rb +6 -0
  50. data/lib/generators/factory_bot/model/model_generator.rb +31 -0
  51. data/lib/generators/factory_bot/templates/factory.erb +7 -0
  52. data/lib/generators/securial/install/install_generator.rb +37 -0
  53. data/lib/generators/securial/install/templates/securial_initializer.erb +109 -0
  54. data/lib/generators/securial/jbuilder/jbuilder_generator.rb +52 -0
  55. data/lib/generators/securial/jbuilder/templates/_resource.json.erb +10 -0
  56. data/lib/generators/securial/jbuilder/templates/index.json.erb +7 -0
  57. data/lib/generators/securial/jbuilder/templates/show.json.erb +1 -0
  58. data/lib/generators/securial/scaffold/scaffold_generator.rb +146 -0
  59. data/lib/generators/securial/scaffold/templates/controller.erb +44 -0
  60. data/lib/generators/securial/scaffold/templates/request_spec.erb +61 -0
  61. data/lib/generators/securial/scaffold/templates/routes.erb +11 -0
  62. data/lib/generators/securial/scaffold/templates/routing_spec.erb +31 -0
  63. data/lib/securial/configuration.rb +35 -0
  64. data/lib/securial/engine.rb +89 -0
  65. data/lib/securial/errors/config_errors.rb +12 -0
  66. data/lib/securial/errors/session_errors.rb +6 -0
  67. data/lib/securial/factories/securial/role_assignments.rb +6 -0
  68. data/lib/securial/factories/securial/roles.rb +18 -0
  69. data/lib/securial/factories/securial/sessions.rb +12 -0
  70. data/lib/securial/factories/securial/users.rb +17 -0
  71. data/lib/securial/helpers/auth_helper.rb +46 -0
  72. data/lib/securial/helpers/normalizing_helper.rb +17 -0
  73. data/lib/securial/helpers/regex_helper.rb +17 -0
  74. data/lib/securial/logger.rb +71 -0
  75. data/lib/securial/middleware/request_logger_tag.rb +18 -0
  76. data/lib/securial/route_inspector.rb +50 -0
  77. data/lib/securial/version.rb +3 -0
  78. data/lib/securial.rb +94 -0
  79. data/lib/tasks/securial_tasks.rake +4 -0
  80. metadata +435 -0
@@ -0,0 +1,50 @@
1
+ module Securial
2
+ module RouteInspector
3
+ def self.print_routes(controller: nil)
4
+ filtered = Securial::Engine.routes.routes.select do |r|
5
+ ctrl = r.defaults[:controller]
6
+ controller.nil? || ctrl == "securial/#{controller}"
7
+ end
8
+
9
+ print_headers(filtered, controller)
10
+ print_details(filtered, controller)
11
+ true
12
+ end
13
+
14
+ class << self
15
+ private
16
+
17
+ # rubocop:disable Rails/Output
18
+ def print_headers(filtered, controller)
19
+ Securial::ENGINE_LOGGER.debug "Securial engine routes:"
20
+ Securial::ENGINE_LOGGER.debug "Total routes: #{filtered.size}"
21
+ Securial::ENGINE_LOGGER.debug "Filtered by controller: #{controller}" if controller
22
+ Securial::ENGINE_LOGGER.debug "Filtered routes: #{filtered.size}" if controller
23
+ Securial::ENGINE_LOGGER.debug "-" * 120
24
+ Securial::ENGINE_LOGGER.debug "#{'Verb'.ljust(8)} #{'Path'.ljust(45)} #{'Controller#Action'.ljust(40)} Name"
25
+ Securial::ENGINE_LOGGER.debug "-" * 120
26
+ end
27
+
28
+ def print_details(filtered, controller) # rubocop:disable Rails/Output
29
+ if filtered.empty?
30
+ if controller
31
+ Securial::ENGINE_LOGGER.debug "No routes found for controller: #{controller}"
32
+ else
33
+ Securial::ENGINE_LOGGER.debug "No routes found for Securial engine"
34
+ end
35
+ Securial::ENGINE_LOGGER.debug "-" * 120
36
+ return
37
+ end
38
+
39
+ Securial::ENGINE_LOGGER.debug filtered.map { |r|
40
+ name = r.name || ""
41
+ verb = r.verb.to_s.ljust(8)
42
+ path = r.path.spec.to_s.sub(/\(\.:format\)/, "").ljust(45)
43
+ ctrl_action = "#{r.defaults[:controller]}##{r.defaults[:action]}"
44
+ "#{verb} #{path} #{ctrl_action.ljust(40)} #{name}"
45
+ }.join("\n")
46
+ end
47
+ # rubocop:enable Rails/Output
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,3 @@
1
+ module Securial
2
+ VERSION = "0.4.2"
3
+ end
data/lib/securial.rb ADDED
@@ -0,0 +1,94 @@
1
+ require "securial/version"
2
+ require "securial/engine"
3
+
4
+ require "jbuilder"
5
+
6
+ module Securial
7
+ class << self
8
+ attr_writer :configuration
9
+
10
+ def configuration
11
+ @configuration ||= Configuration.new
12
+ end
13
+
14
+ def configure
15
+ yield(configuration)
16
+ validate_admin_role!
17
+ validate_session_expiry_duration!
18
+ validate_session_algorithm!
19
+ validate_session_secret!
20
+ validate_mailer_sender!
21
+ validate_password_config!
22
+ end
23
+
24
+ # Returns the pluralized form of the admin role.
25
+ # This behavior is intentional and aligns with the project's routing conventions.
26
+ def admin_namespace
27
+ configuration.admin_role.to_s.pluralize.downcase
28
+ end
29
+
30
+ def validate_admin_role!
31
+ error_message = "The admin role cannot be 'account' or 'accounts' as it conflicts with the default routes."
32
+
33
+ if configuration.admin_role.to_s.pluralize.downcase == "accounts"
34
+ Securial::ENGINE_LOGGER.error(error_message)
35
+ raise Securial::ConfigErrors::ConfigAdminRoleError, error_message
36
+ end
37
+ end
38
+
39
+ def validate_session_expiry_duration!
40
+ if configuration.session_expiration_duration.nil?
41
+ error_message = "Session expiration duration is not set."
42
+ Securial::ENGINE_LOGGER.error(error_message)
43
+ raise Securial::ConfigErrors::ConfigSessionExpirationDurationError, error_message
44
+ end
45
+ if configuration.session_expiration_duration.class != ActiveSupport::Duration
46
+ error_message = "Session expiration duration must be an ActiveSupport::Duration."
47
+ Securial::ENGINE_LOGGER.error(error_message)
48
+ raise Securial::ConfigErrors::ConfigSessionExpirationDurationError, error_message
49
+ end
50
+ if configuration.session_expiration_duration <= 0
51
+ Securial::ENGINE_LOGGER.error("Session expiration duration must be greater than 0.")
52
+ raise Securial::ConfigErrors::ConfigSessionExpirationDurationError, "Session expiration duration must be greater than 0."
53
+ end
54
+ end
55
+
56
+ def validate_session_algorithm!
57
+ valid_algorithms = [:hs256, :hs384, :hs512]
58
+ unless valid_algorithms.include?(configuration.session_algorithm)
59
+ error_message = "Invalid session algorithm. Valid options are: #{valid_algorithms.join(', ')}."
60
+ Securial::ENGINE_LOGGER.error(error_message)
61
+ raise Securial::ConfigErrors::ConfigSessionAlgorithmError, error_message
62
+ end
63
+ end
64
+
65
+ def validate_session_secret!
66
+ if configuration.session_secret.blank?
67
+ error_message = "Session secret is not set."
68
+ Securial::ENGINE_LOGGER.error(error_message)
69
+ raise Securial::ConfigErrors::ConfigSessionSecretError, error_message
70
+ end
71
+ end
72
+
73
+ def validate_mailer_sender!
74
+ if configuration.mailer_sender.blank?
75
+ error_message = "Mailer sender is not set."
76
+ Securial::ENGINE_LOGGER.error(error_message)
77
+ raise Securial::ConfigErrors::ConfigMailerSenderError, error_message
78
+ end
79
+ if configuration.mailer_sender !~ URI::MailTo::EMAIL_REGEXP
80
+ error_message = "Mailer sender is not a valid email address."
81
+ Securial::ENGINE_LOGGER.error(error_message)
82
+ raise Securial::ConfigErrors::ConfigMailerSenderError, error_message
83
+ end
84
+ end
85
+
86
+ def validate_password_config!
87
+ if configuration.password_reset_email_subject.blank?
88
+ error_message = "Password reset email subject is not set."
89
+ Securial::ENGINE_LOGGER.error(error_message)
90
+ raise Securial::ConfigErrors::ConfigMailerSenderError, error_message
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :securial do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,435 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: securial
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.2
5
+ platform: ruby
6
+ authors:
7
+ - Aly Badawy
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 2025-05-27 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: rails
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '8.0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '8.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: bcrypt
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '3.1'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '3.1'
40
+ - !ruby/object:Gem::Dependency
41
+ name: jbuilder
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '2.11'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '2.11'
54
+ - !ruby/object:Gem::Dependency
55
+ name: jwt
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '2.10'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '2.10'
68
+ - !ruby/object:Gem::Dependency
69
+ name: ostruct
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '0.6'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0.6'
82
+ - !ruby/object:Gem::Dependency
83
+ name: capybara
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '3.40'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '3.40'
96
+ - !ruby/object:Gem::Dependency
97
+ name: coveralls-lcov
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '1.7'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '1.7'
110
+ - !ruby/object:Gem::Dependency
111
+ name: database_cleaner
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '2.1'
117
+ type: :development
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '2.1'
124
+ - !ruby/object:Gem::Dependency
125
+ name: factory_bot_rails
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '6.4'
131
+ type: :development
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '6.4'
138
+ - !ruby/object:Gem::Dependency
139
+ name: faker
140
+ requirement: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '3.5'
145
+ type: :development
146
+ prerelease: false
147
+ version_requirements: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '3.5'
152
+ - !ruby/object:Gem::Dependency
153
+ name: generator_spec
154
+ requirement: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: '0.10'
159
+ type: :development
160
+ prerelease: false
161
+ version_requirements: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: '0.10'
166
+ - !ruby/object:Gem::Dependency
167
+ name: overcommit
168
+ requirement: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '0.67'
173
+ type: :development
174
+ prerelease: false
175
+ version_requirements: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: '0.67'
180
+ - !ruby/object:Gem::Dependency
181
+ name: rubocop
182
+ requirement: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - "~>"
185
+ - !ruby/object:Gem::Version
186
+ version: '1.75'
187
+ type: :development
188
+ prerelease: false
189
+ version_requirements: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - "~>"
192
+ - !ruby/object:Gem::Version
193
+ version: '1.75'
194
+ - !ruby/object:Gem::Dependency
195
+ name: rubocop-config-prettier
196
+ requirement: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - "~>"
199
+ - !ruby/object:Gem::Version
200
+ version: 0.1.13
201
+ type: :development
202
+ prerelease: false
203
+ version_requirements: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - "~>"
206
+ - !ruby/object:Gem::Version
207
+ version: 0.1.13
208
+ - !ruby/object:Gem::Dependency
209
+ name: rubocop-performance
210
+ requirement: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - "~>"
213
+ - !ruby/object:Gem::Version
214
+ version: '1.25'
215
+ type: :development
216
+ prerelease: false
217
+ version_requirements: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - "~>"
220
+ - !ruby/object:Gem::Version
221
+ version: '1.25'
222
+ - !ruby/object:Gem::Dependency
223
+ name: rubocop-rails
224
+ requirement: !ruby/object:Gem::Requirement
225
+ requirements:
226
+ - - "~>"
227
+ - !ruby/object:Gem::Version
228
+ version: '2.32'
229
+ type: :development
230
+ prerelease: false
231
+ version_requirements: !ruby/object:Gem::Requirement
232
+ requirements:
233
+ - - "~>"
234
+ - !ruby/object:Gem::Version
235
+ version: '2.32'
236
+ - !ruby/object:Gem::Dependency
237
+ name: rubocop-rails-omakase
238
+ requirement: !ruby/object:Gem::Requirement
239
+ requirements:
240
+ - - "~>"
241
+ - !ruby/object:Gem::Version
242
+ version: '1.1'
243
+ type: :development
244
+ prerelease: false
245
+ version_requirements: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - "~>"
248
+ - !ruby/object:Gem::Version
249
+ version: '1.1'
250
+ - !ruby/object:Gem::Dependency
251
+ name: rubocop-rspec
252
+ requirement: !ruby/object:Gem::Requirement
253
+ requirements:
254
+ - - "~>"
255
+ - !ruby/object:Gem::Version
256
+ version: '3.6'
257
+ type: :development
258
+ prerelease: false
259
+ version_requirements: !ruby/object:Gem::Requirement
260
+ requirements:
261
+ - - "~>"
262
+ - !ruby/object:Gem::Version
263
+ version: '3.6'
264
+ - !ruby/object:Gem::Dependency
265
+ name: rspec-rails
266
+ requirement: !ruby/object:Gem::Requirement
267
+ requirements:
268
+ - - "~>"
269
+ - !ruby/object:Gem::Version
270
+ version: '7.1'
271
+ type: :development
272
+ prerelease: false
273
+ version_requirements: !ruby/object:Gem::Requirement
274
+ requirements:
275
+ - - "~>"
276
+ - !ruby/object:Gem::Version
277
+ version: '7.1'
278
+ - !ruby/object:Gem::Dependency
279
+ name: shoulda-matchers
280
+ requirement: !ruby/object:Gem::Requirement
281
+ requirements:
282
+ - - "~>"
283
+ - !ruby/object:Gem::Version
284
+ version: '6.5'
285
+ type: :development
286
+ prerelease: false
287
+ version_requirements: !ruby/object:Gem::Requirement
288
+ requirements:
289
+ - - "~>"
290
+ - !ruby/object:Gem::Version
291
+ version: '6.5'
292
+ - !ruby/object:Gem::Dependency
293
+ name: simplecov
294
+ requirement: !ruby/object:Gem::Requirement
295
+ requirements:
296
+ - - "~>"
297
+ - !ruby/object:Gem::Version
298
+ version: '0.22'
299
+ type: :development
300
+ prerelease: false
301
+ version_requirements: !ruby/object:Gem::Requirement
302
+ requirements:
303
+ - - "~>"
304
+ - !ruby/object:Gem::Version
305
+ version: '0.22'
306
+ - !ruby/object:Gem::Dependency
307
+ name: simplecov-lcov
308
+ requirement: !ruby/object:Gem::Requirement
309
+ requirements:
310
+ - - "~>"
311
+ - !ruby/object:Gem::Version
312
+ version: 0.8.0
313
+ type: :development
314
+ prerelease: false
315
+ version_requirements: !ruby/object:Gem::Requirement
316
+ requirements:
317
+ - - "~>"
318
+ - !ruby/object:Gem::Version
319
+ version: 0.8.0
320
+ description: Securial is a mountable Rails engine that provides robust, extensible
321
+ authentication and access control for Rails applications. It supports JWT, API tokens,
322
+ session-based auth, and is designed for easy integration with modern web and mobile
323
+ apps.
324
+ email:
325
+ - 1198568+AlyBadawy@users.noreply.github.com
326
+ executables:
327
+ - securial
328
+ extensions: []
329
+ extra_rdoc_files: []
330
+ files:
331
+ - MIT-LICENSE
332
+ - README.md
333
+ - Rakefile
334
+ - app/controllers/concerns/securial/identity.rb
335
+ - app/controllers/securial/accounts_controller.rb
336
+ - app/controllers/securial/application_controller.rb
337
+ - app/controllers/securial/passwords_controller.rb
338
+ - app/controllers/securial/role_assignments_controller.rb
339
+ - app/controllers/securial/roles_controller.rb
340
+ - app/controllers/securial/sessions_controller.rb
341
+ - app/controllers/securial/status_controller.rb
342
+ - app/controllers/securial/users_controller.rb
343
+ - app/jobs/securial/application_job.rb
344
+ - app/mailers/securial/application_mailer.rb
345
+ - app/mailers/securial/securial_mailer.rb
346
+ - app/models/concerns/securial/password_resettable.rb
347
+ - app/models/securial/application_record.rb
348
+ - app/models/securial/current.rb
349
+ - app/models/securial/role.rb
350
+ - app/models/securial/role_assignment.rb
351
+ - app/models/securial/session.rb
352
+ - app/models/securial/user.rb
353
+ - app/views/layouts/securial/mailer.html.erb
354
+ - app/views/layouts/securial/mailer.text.erb
355
+ - app/views/securial/accounts/show.json.jbuilder
356
+ - app/views/securial/passwords/_password.json.jbuilder
357
+ - app/views/securial/passwords/index.json.jbuilder
358
+ - app/views/securial/passwords/show.json.jbuilder
359
+ - app/views/securial/role_assignments/show.json.jbuilder
360
+ - app/views/securial/roles/_securial_role.json.jbuilder
361
+ - app/views/securial/roles/index.json.jbuilder
362
+ - app/views/securial/roles/show.json.jbuilder
363
+ - app/views/securial/securial_mailer/reset_password.html.erb
364
+ - app/views/securial/securial_mailer/reset_password.text.erb
365
+ - app/views/securial/sessions/_session.json.jbuilder
366
+ - app/views/securial/sessions/index.json.jbuilder
367
+ - app/views/securial/sessions/show.json.jbuilder
368
+ - app/views/securial/status/show.json.jbuilder
369
+ - app/views/securial/users/_securial_user.json.jbuilder
370
+ - app/views/securial/users/index.json.jbuilder
371
+ - app/views/securial/users/show.json.jbuilder
372
+ - bin/securial
373
+ - config/routes.rb
374
+ - db/migrate/20250515104930_create_securial_roles.rb
375
+ - db/migrate/20250517155521_create_securial_users.rb
376
+ - db/migrate/20250518122749_create_securial_role_assignments.rb
377
+ - db/migrate/20250519075407_create_securial_sessions.rb
378
+ - db/migrate/20250524210207_add_password_reset_fields_to_securial_users.rb
379
+ - lib/generators/factory_bot/model/model_generator.rb
380
+ - lib/generators/factory_bot/templates/factory.erb
381
+ - lib/generators/securial/install/install_generator.rb
382
+ - lib/generators/securial/install/templates/securial_initializer.erb
383
+ - lib/generators/securial/jbuilder/jbuilder_generator.rb
384
+ - lib/generators/securial/jbuilder/templates/_resource.json.erb
385
+ - lib/generators/securial/jbuilder/templates/index.json.erb
386
+ - lib/generators/securial/jbuilder/templates/show.json.erb
387
+ - lib/generators/securial/scaffold/scaffold_generator.rb
388
+ - lib/generators/securial/scaffold/templates/controller.erb
389
+ - lib/generators/securial/scaffold/templates/request_spec.erb
390
+ - lib/generators/securial/scaffold/templates/routes.erb
391
+ - lib/generators/securial/scaffold/templates/routing_spec.erb
392
+ - lib/securial.rb
393
+ - lib/securial/configuration.rb
394
+ - lib/securial/engine.rb
395
+ - lib/securial/errors/config_errors.rb
396
+ - lib/securial/errors/session_errors.rb
397
+ - lib/securial/factories/securial/role_assignments.rb
398
+ - lib/securial/factories/securial/roles.rb
399
+ - lib/securial/factories/securial/sessions.rb
400
+ - lib/securial/factories/securial/users.rb
401
+ - lib/securial/helpers/auth_helper.rb
402
+ - lib/securial/helpers/normalizing_helper.rb
403
+ - lib/securial/helpers/regex_helper.rb
404
+ - lib/securial/logger.rb
405
+ - lib/securial/middleware/request_logger_tag.rb
406
+ - lib/securial/route_inspector.rb
407
+ - lib/securial/version.rb
408
+ - lib/tasks/securial_tasks.rake
409
+ homepage: https://github.com/AlyBadawy/Securial/wiki
410
+ licenses:
411
+ - MIT
412
+ metadata:
413
+ release_date: '2025-05-27'
414
+ allowed_push_host: https://rubygems.org
415
+ homepage_uri: https://github.com/AlyBadawy/Securial/wiki
416
+ source_code_uri: https://github.com/AlyBadawy/Securial
417
+ changelog_uri: https://github.com/AlyBadawy/Securial/blob/main/CHANGELOG.md
418
+ rdoc_options: []
419
+ require_paths:
420
+ - lib
421
+ required_ruby_version: !ruby/object:Gem::Requirement
422
+ requirements:
423
+ - - ">="
424
+ - !ruby/object:Gem::Version
425
+ version: 3.4.1
426
+ required_rubygems_version: !ruby/object:Gem::Requirement
427
+ requirements:
428
+ - - ">="
429
+ - !ruby/object:Gem::Version
430
+ version: '0'
431
+ requirements: []
432
+ rubygems_version: 3.6.7
433
+ specification_version: 4
434
+ summary: Authentication and access control Rails engine for your API.
435
+ test_files: []