neeto-jwt-engine 1.1.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 (112) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +89 -0
  3. data/Rakefile +20 -0
  4. data/app/controllers/concerns/neeto_jwt_engine/api_exceptions.rb +77 -0
  5. data/app/controllers/concerns/neeto_jwt_engine/authenticatable.rb +20 -0
  6. data/app/controllers/neeto_jwt_engine/application_controller.rb +7 -0
  7. data/app/controllers/neeto_jwt_engine/configurations_controller.rb +54 -0
  8. data/app/models/concerns/neeto_jwt_engine/incinerable_concern.rb +26 -0
  9. data/app/models/neeto_jwt_engine/application_record.rb +7 -0
  10. data/app/models/neeto_jwt_engine/configuration.rb +24 -0
  11. data/app/models/neeto_jwt_engine/onetime_link.rb +19 -0
  12. data/app/services/neeto_jwt_engine/elliptic_key_generator_service.rb +44 -0
  13. data/app/views/layouts/neeto_jwt_engine/application.html.erb +15 -0
  14. data/config/brakeman.ignore +5 -0
  15. data/config/locales/en.yml +1 -0
  16. data/config/routes.rb +7 -0
  17. data/db/migrate/20250329064017_create_neeto_jwt_engine_configurations.rb +14 -0
  18. data/db/migrate/20250716075611_create_neeto_jwt_engine_onetime_links.rb +13 -0
  19. data/lib/neeto-jwt-engine.rb +5 -0
  20. data/lib/neeto_jwt_engine/engine.rb +7 -0
  21. data/lib/neeto_jwt_engine/exceptions.rb +5 -0
  22. data/lib/neeto_jwt_engine/version.rb +5 -0
  23. data/lib/omniauth/strategies/jwt.rb +93 -0
  24. data/test/controllers/neeto_jwt_engine/configurations_controller_test.rb +58 -0
  25. data/test/dummy/Rakefile +8 -0
  26. data/test/dummy/app/assets/config/manifest.js +3 -0
  27. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  28. data/test/dummy/app/channels/application_cable/channel.rb +6 -0
  29. data/test/dummy/app/channels/application_cable/connection.rb +6 -0
  30. data/test/dummy/app/controllers/application_controller.rb +5 -0
  31. data/test/dummy/app/controllers/concerns/sso_helpers.rb +20 -0
  32. data/test/dummy/app/helpers/application_helper.rb +4 -0
  33. data/test/dummy/app/javascript/packs/application.js +19 -0
  34. data/test/dummy/app/jobs/application_job.rb +9 -0
  35. data/test/dummy/app/mailers/application_mailer.rb +6 -0
  36. data/test/dummy/app/models/application_record.rb +5 -0
  37. data/test/dummy/app/models/organization.rb +10 -0
  38. data/test/dummy/app/models/user.rb +11 -0
  39. data/test/dummy/app/services/sample_data/common/admin_service.rb +26 -0
  40. data/test/dummy/app/services/sample_data/common/base.rb +43 -0
  41. data/test/dummy/app/services/sample_data/common/database_cleanup_service.rb +11 -0
  42. data/test/dummy/app/services/sample_data/common/loader_service.rb +34 -0
  43. data/test/dummy/app/services/sample_data/common/organization_service.rb +27 -0
  44. data/test/dummy/app/services/sample_data/loaders_list.rb +14 -0
  45. data/test/dummy/app/services/sample_data/user_service.rb +26 -0
  46. data/test/dummy/app/views/home/index.html.erb +1 -0
  47. data/test/dummy/app/views/layouts/application.html.erb +15 -0
  48. data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
  49. data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
  50. data/test/dummy/app/views/users/index.json.jbuilder +19 -0
  51. data/test/dummy/bin/rails +6 -0
  52. data/test/dummy/bin/rake +6 -0
  53. data/test/dummy/bin/setup +37 -0
  54. data/test/dummy/bin/webpacker +16 -0
  55. data/test/dummy/bin/webpacker-dev-server +19 -0
  56. data/test/dummy/config/application.rb +29 -0
  57. data/test/dummy/config/boot.rb +7 -0
  58. data/test/dummy/config/cable.yml +10 -0
  59. data/test/dummy/config/database.yml +17 -0
  60. data/test/dummy/config/database.yml.ci +17 -0
  61. data/test/dummy/config/database.yml.postgresql +17 -0
  62. data/test/dummy/config/environment.rb +7 -0
  63. data/test/dummy/config/environments/development.rb +70 -0
  64. data/test/dummy/config/environments/production.rb +116 -0
  65. data/test/dummy/config/environments/test.rb +63 -0
  66. data/test/dummy/config/initializers/application_controller_renderer.rb +9 -0
  67. data/test/dummy/config/initializers/backtrace_silencers.rb +10 -0
  68. data/test/dummy/config/initializers/content_security_policy.rb +29 -0
  69. data/test/dummy/config/initializers/cookies_serializer.rb +7 -0
  70. data/test/dummy/config/initializers/inflections.rb +17 -0
  71. data/test/dummy/config/initializers/mime_types.rb +5 -0
  72. data/test/dummy/config/initializers/permissions_policy.rb +12 -0
  73. data/test/dummy/config/initializers/strong_migrations.rb +4 -0
  74. data/test/dummy/config/initializers/wrap_parameters.rb +16 -0
  75. data/test/dummy/config/locales/en.yml +33 -0
  76. data/test/dummy/config/puma.rb +45 -0
  77. data/test/dummy/config/routes.rb +13 -0
  78. data/test/dummy/config/storage.yml +34 -0
  79. data/test/dummy/config/webpack/development.js +5 -0
  80. data/test/dummy/config/webpack/environment.js +13 -0
  81. data/test/dummy/config/webpack/production.js +5 -0
  82. data/test/dummy/config/webpack/resolve.js +11 -0
  83. data/test/dummy/config/webpack/test.js +5 -0
  84. data/test/dummy/config/webpack/webpack.config.js +20 -0
  85. data/test/dummy/config/webpacker.yml +73 -0
  86. data/test/dummy/config.ru +8 -0
  87. data/test/dummy/db/migrate/20220419104218_create_organizations.rb +15 -0
  88. data/test/dummy/db/migrate/20220419114209_create_users.rb +20 -0
  89. data/test/dummy/db/migrate/20240607032904_add_deactivated_at_to_organizations.rb +7 -0
  90. data/test/dummy/db/schema.rb +68 -0
  91. data/test/dummy/lib/tasks/setup.rake +48 -0
  92. data/test/dummy/log/development.log +71 -0
  93. data/test/dummy/log/test.log +5189 -0
  94. data/test/dummy/public/404.html +67 -0
  95. data/test/dummy/public/422.html +67 -0
  96. data/test/dummy/public/500.html +66 -0
  97. data/test/dummy/public/apple-touch-icon-precomposed.png +0 -0
  98. data/test/dummy/public/apple-touch-icon.png +0 -0
  99. data/test/dummy/public/favicon.ico +0 -0
  100. data/test/dummy/tmp/local_secret.txt +1 -0
  101. data/test/dummy/tmp/restart.txt +0 -0
  102. data/test/factories/neeto_jwt_engine/configuration.rb +7 -0
  103. data/test/factories/neeto_jwt_engine/onetime_link.rb +7 -0
  104. data/test/factories/organization.rb +8 -0
  105. data/test/factories/user.rb +13 -0
  106. data/test/models/neeto_jwt_engine/configuration_test.rb +23 -0
  107. data/test/models/neeto_jwt_engine/onetime_link_test.rb +27 -0
  108. data/test/neeto_jwt_engine_test.rb +12 -0
  109. data/test/services/neeto_jwt_engine/elliptic_key_generator_service_test.rb +30 -0
  110. data/test/support/assertion_support.rb +9 -0
  111. data/test/test_helper.rb +30 -0
  112. metadata +168 -0
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This file is auto-generated from the current state of the database. Instead
4
+ # of editing this file, please use the migrations feature of Active Record to
5
+ # incrementally modify your database, and then regenerate this schema definition.
6
+ #
7
+ # This file is the source Rails uses to define your schema when running `bin/rails
8
+ # db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to
9
+ # be faster and is potentially less error prone than running all of your
10
+ # migrations from scratch. Old migrations may fail to apply correctly if those
11
+ # migrations use external dependencies or application code.
12
+ #
13
+ # It's strongly recommended that you check this file into your version control system.
14
+
15
+ ActiveRecord::Schema[7.1].define(version: 2025_07_16_075611) do
16
+ # These are extensions that must be enabled in order to support this database
17
+ enable_extension "pgcrypto"
18
+ enable_extension "plpgsql"
19
+
20
+ create_table "neeto_jwt_engine_configurations", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
21
+ t.text "public_key", null: false
22
+ t.text "private_key", null: false
23
+ t.boolean "enabled", default: true, null: false
24
+ t.uuid "organization_id", null: false
25
+ t.datetime "created_at", null: false
26
+ t.datetime "updated_at", null: false
27
+ t.index ["organization_id"], name: "index_neeto_jwt_engine_configurations_on_organization_id"
28
+ end
29
+
30
+ create_table "neeto_jwt_engine_onetime_links", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
31
+ t.string "link", null: false
32
+ t.boolean "expired", default: false, null: false
33
+ t.uuid "configuration_id", null: false
34
+ t.datetime "created_at", null: false
35
+ t.datetime "updated_at", null: false
36
+ t.index ["configuration_id"], name: "index_neeto_jwt_engine_onetime_links_on_configuration_id"
37
+ t.index ["link"], name: "index_neeto_jwt_engine_onetime_links_on_link", unique: true
38
+ end
39
+
40
+ create_table "organizations", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
41
+ t.string "name", null: false
42
+ t.string "subdomain", null: false
43
+ t.datetime "created_at", null: false
44
+ t.datetime "updated_at", null: false
45
+ t.datetime "deactivated_at"
46
+ t.index ["subdomain"], name: "index_organizations_on_subdomain", unique: true
47
+ end
48
+
49
+ create_table "users", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
50
+ t.string "first_name", null: false
51
+ t.string "last_name"
52
+ t.string "email", null: false
53
+ t.integer "experience"
54
+ t.string "timezone", null: false
55
+ t.text "permissions", array: true
56
+ t.jsonb "dates"
57
+ t.jsonb "duration"
58
+ t.uuid "organization_id", null: false
59
+ t.datetime "created_at", null: false
60
+ t.datetime "updated_at", null: false
61
+ t.index ["email"], name: "index_users_on_email", unique: true
62
+ t.index ["organization_id"], name: "index_users_on_organization_id"
63
+ end
64
+
65
+ add_foreign_key "neeto_jwt_engine_configurations", "organizations", on_delete: :cascade
66
+ add_foreign_key "neeto_jwt_engine_onetime_links", "neeto_jwt_engine_configurations", column: "configuration_id"
67
+ add_foreign_key "users", "organizations", on_delete: :cascade
68
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ desc "drops the db, creates db, migrates db and populates sample data"
4
+ task setup: [:environment, "db:drop", "db:create", "db:migrate"] do
5
+ Rake::Task[:setup_engine_migarations].invoke
6
+ Rake::Task["reset_and_populate_sample_data"].invoke if Rails.env.development?
7
+ end
8
+
9
+ task setup_engine_migarations: [:environment] do
10
+ sh "cd ../../ && bundle exec rails db:migrate"
11
+ end
12
+
13
+ desc "Check if perform_on_every_deploy should be executed or not"
14
+ task act_on_every_heroku_deployment: [:environment] do
15
+ if Rails.env.development? || Rails.env.heroku?
16
+ Rake::Task["reset_and_populate_sample_data"].invoke
17
+ end
18
+ end
19
+
20
+ desc "Populates sample data without resetting the database first"
21
+ task populate_sample_data: [:environment] do
22
+ puts "== Adding Sample Data ".ljust(79, "=")
23
+ SampleData::Common::LoaderService.new.process!
24
+ puts "== Adding Sample Data: Done ".ljust(79, "=")
25
+ end
26
+
27
+ desc "Populates sample data without after resetting the database"
28
+ task reset_and_populate_sample_data: [:environment] do
29
+ if Rails.env.production? || Rails.env.staging?
30
+ puts "Skipping deleting and populating sample data"
31
+ else
32
+ Rake::Task["populate_sample_data"].invoke
33
+ end
34
+ end
35
+
36
+ #
37
+ # DO NOT CHANGE ANYTHING IN THIS METHOD
38
+ # This is last layer of defense against deleting data in production
39
+ # If you need to delete data in staging or in production
40
+ # please execute the command manually and do not change this method
41
+ #
42
+ def delete_all_records_from_all_tables
43
+ if Rails.env.production?
44
+ raise "deleting all records in production is not allowed"
45
+ else
46
+ Rake::Task["db:schema:load"].invoke
47
+ end
48
+ end
@@ -0,0 +1,71 @@
1
+  (0.1ms) SELECT pg_try_advisory_lock(2004589700309690025)
2
+ ActiveRecord::SchemaMigration Load (0.9ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
3
+ ActiveRecord::InternalMetadata Load (0.9ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
4
+ Migrating to CreateNeetoJwtEngineOnetimeLinks (20250716075611)
5
+ TRANSACTION (0.1ms) BEGIN
6
+  (6.6ms) CREATE TABLE "neeto_jwt_engine_onetime_links" ("id" bigserial primary key, "link" character varying NOT NULL, "expired" boolean DEFAULT FALSE NOT NULL, "created_at" timestamp(6) NOT NULL, "updated_at" timestamp(6) NOT NULL)
7
+  (1.6ms) CREATE UNIQUE INDEX "index_neeto_jwt_engine_onetime_links_on_link" ON "neeto_jwt_engine_onetime_links" ("link")
8
+ ActiveRecord::SchemaMigration Create (0.3ms) INSERT INTO "schema_migrations" ("version") VALUES ('20250716075611') RETURNING "version"
9
+ TRANSACTION (0.7ms) COMMIT
10
+  (0.7ms) SELECT pg_advisory_unlock(2004589700309690025)
11
+ ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
12
+ ActiveRecord::SchemaMigration Load (1.4ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
13
+ ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
14
+ ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
15
+  (0.2ms) SELECT pg_try_advisory_lock(2004589700309690025)
16
+ ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
17
+ Migrating to CreateNeetoJwtEngineOnetimeLinks (20250716075611)
18
+ TRANSACTION (0.1ms) BEGIN
19
+  (4.2ms) DROP TABLE "neeto_jwt_engine_onetime_links"
20
+ ActiveRecord::SchemaMigration Destroy (0.6ms) DELETE FROM "schema_migrations" WHERE "schema_migrations"."version" = '20250716075611'
21
+ TRANSACTION (2.1ms) COMMIT
22
+  (0.2ms) SELECT pg_advisory_unlock(2004589700309690025)
23
+ ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
24
+  (0.1ms) SELECT pg_try_advisory_lock(2004589700309690025)
25
+ ActiveRecord::SchemaMigration Load (0.9ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
26
+ ActiveRecord::InternalMetadata Load (1.3ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
27
+ Migrating to CreateNeetoJwtEngineOnetimeLinks (20250716075611)
28
+ TRANSACTION (0.2ms) BEGIN
29
+  (8.2ms) CREATE TABLE "neeto_jwt_engine_onetime_links" ("id" uuid DEFAULT gen_random_uuid() NOT NULL PRIMARY KEY, "link" character varying NOT NULL, "expired" boolean DEFAULT FALSE NOT NULL, "configuration_id" uuid NOT NULL, "created_at" timestamp(6) NOT NULL, "updated_at" timestamp(6) NOT NULL, CONSTRAINT "fk_rails_f95784e1da"
30
+ FOREIGN KEY ("configuration_id")
31
+ REFERENCES "neeto_jwt_engine_configurations" ("id")
32
+ )
33
+  (0.9ms) CREATE UNIQUE INDEX "index_neeto_jwt_engine_onetime_links_on_link" ON "neeto_jwt_engine_onetime_links" ("link")
34
+  (1.2ms) CREATE INDEX "index_neeto_jwt_engine_onetime_links_on_configuration_id" ON "neeto_jwt_engine_onetime_links" ("configuration_id")
35
+ ActiveRecord::SchemaMigration Create (0.2ms) INSERT INTO "schema_migrations" ("version") VALUES ('20250716075611') RETURNING "version"
36
+ TRANSACTION (0.8ms) COMMIT
37
+  (0.2ms) SELECT pg_advisory_unlock(2004589700309690025)
38
+ ActiveRecord::SchemaMigration Load (0.3ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
39
+ ActiveRecord::SchemaMigration Load (1.3ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
40
+ ActiveRecord::SchemaMigration Load (0.3ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
41
+ ActiveRecord::SchemaMigration Load (0.3ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
42
+  (0.2ms) SELECT pg_try_advisory_lock(2004589700309690025)
43
+ ActiveRecord::SchemaMigration Load (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
44
+ Migrating to CreateNeetoJwtEngineOnetimeLinks (20250716075611)
45
+ TRANSACTION (0.2ms) BEGIN
46
+  (4.0ms) DROP TABLE "neeto_jwt_engine_onetime_links"
47
+ ActiveRecord::SchemaMigration Destroy (0.4ms) DELETE FROM "schema_migrations" WHERE "schema_migrations"."version" = '20250716075611'
48
+ TRANSACTION (1.6ms) COMMIT
49
+  (0.3ms) SELECT pg_advisory_unlock(2004589700309690025)
50
+ ActiveRecord::SchemaMigration Load (0.3ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
51
+  (0.2ms) SELECT pg_try_advisory_lock(2004589700309690025)
52
+ ActiveRecord::SchemaMigration Load (1.4ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
53
+ ActiveRecord::InternalMetadata Load (1.3ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
54
+ Migrating to CreateNeetoJwtEngineOnetimeLinks (20250716075611)
55
+ TRANSACTION (0.2ms) BEGIN
56
+  (9.6ms) CREATE TABLE "neeto_jwt_engine_onetime_links" ("id" uuid DEFAULT gen_random_uuid() NOT NULL PRIMARY KEY, "link" character varying NOT NULL, "expired" boolean DEFAULT FALSE NOT NULL, "configuration_id" uuid NOT NULL, "created_at" timestamp(6) NOT NULL, "updated_at" timestamp(6) NOT NULL, CONSTRAINT "fk_rails_f95784e1da"
57
+ FOREIGN KEY ("configuration_id")
58
+ REFERENCES "neeto_jwt_engine_configurations" ("id")
59
+ )
60
+  (1.9ms) CREATE UNIQUE INDEX "index_neeto_jwt_engine_onetime_links_on_link" ON "neeto_jwt_engine_onetime_links" ("link")
61
+  (1.9ms) CREATE INDEX "index_neeto_jwt_engine_onetime_links_on_configuration_id" ON "neeto_jwt_engine_onetime_links" ("configuration_id")
62
+ ActiveRecord::SchemaMigration Create (0.3ms) INSERT INTO "schema_migrations" ("version") VALUES ('20250716075611') RETURNING "version"
63
+ TRANSACTION (0.5ms) COMMIT
64
+  (0.3ms) SELECT pg_advisory_unlock(2004589700309690025)
65
+ ActiveRecord::SchemaMigration Load (0.6ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
66
+ NeetoDataSync: Missing required configuration: AWS access key ID, AWS secret access key, Queue URL. The gem will be disabled.
67
+ NeetoDataSync: Missing required configuration: AWS access key ID, AWS secret access key, Queue URL. The gem will be disabled.
68
+ NeetoJwtEngine::OnetimeLink Load (2.9ms) SELECT "neeto_jwt_engine_onetime_links".* FROM "neeto_jwt_engine_onetime_links" WHERE "neeto_jwt_engine_onetime_links"."expired" = $1 ORDER BY "neeto_jwt_engine_onetime_links"."id" ASC LIMIT $2 [["expired", false], ["LIMIT", 1]]
69
+ NeetoJwtEngine::OnetimeLink Load (0.4ms) SELECT "neeto_jwt_engine_onetime_links".* FROM "neeto_jwt_engine_onetime_links" ORDER BY "neeto_jwt_engine_onetime_links"."id" ASC LIMIT $1 [["LIMIT", 1]]
70
+ [dotenv] Set NEETO_JWT_X_TOKEN
71
+ [dotenv] Loaded .env