no_password_auth 0.2.1

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 (68) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README-ES.md +230 -0
  4. data/README.md +230 -0
  5. data/Rakefile +18 -0
  6. data/app/assets/config/no_password/manifest.js +4 -0
  7. data/app/assets/config/no_password/tailwind.config.js +61 -0
  8. data/app/assets/images/no_password/aoo.svg +1 -0
  9. data/app/assets/javascripts/no_password/application.js +4 -0
  10. data/app/assets/javascripts/no_password/controllers/alert_controller.js +31 -0
  11. data/app/assets/javascripts/no_password/controllers/application.js +10 -0
  12. data/app/assets/javascripts/no_password/controllers/index.js +11 -0
  13. data/app/assets/stylesheets/no_password/application.css +15 -0
  14. data/app/assets/stylesheets/no_password/application.tailwind.css +34 -0
  15. data/app/controllers/concerns/no_password/controller_helpers.rb +45 -0
  16. data/app/controllers/concerns/no_password/web_tokens.rb +33 -0
  17. data/app/controllers/no_password/application_controller.rb +4 -0
  18. data/app/controllers/no_password/session_confirmations_controller.rb +46 -0
  19. data/app/controllers/no_password/sessions_controller.rb +49 -0
  20. data/app/helpers/no_password/application_helper.rb +4 -0
  21. data/app/helpers/no_password/no_password_helper.rb +13 -0
  22. data/app/jobs/no_password/application_job.rb +4 -0
  23. data/app/mailers/no_password/application_mailer.rb +6 -0
  24. data/app/mailers/no_password/sessions_mailer.rb +16 -0
  25. data/app/models/no_password/application_record.rb +5 -0
  26. data/app/models/no_password/session.rb +20 -0
  27. data/app/use_cases/no_password/session_manager.rb +51 -0
  28. data/app/views/layouts/no_password/application.html.erb +26 -0
  29. data/app/views/layouts/no_password/mailer.html.erb +106 -0
  30. data/app/views/layouts/no_password/mailer.text.erb +6 -0
  31. data/app/views/no_password/application/_notification.html.erb +55 -0
  32. data/app/views/no_password/session_confirmations/_form.html.erb +19 -0
  33. data/app/views/no_password/session_confirmations/edit.html.erb +15 -0
  34. data/app/views/no_password/session_confirmations/update.turbo_stream.erb +3 -0
  35. data/app/views/no_password/sessions/_form.html.erb +16 -0
  36. data/app/views/no_password/sessions/create.turbo_stream.erb +3 -0
  37. data/app/views/no_password/sessions/new.html.erb +15 -0
  38. data/app/views/no_password/sessions_mailer/send_token.html.erb +14 -0
  39. data/app/views/no_password/sessions_mailer/send_token.text.erb +12 -0
  40. data/config/initializers/importmap.rb +17 -0
  41. data/config/locales/en/flash.en.yml +11 -0
  42. data/config/locales/en/forms.en.yml +9 -0
  43. data/config/locales/en/mailers.en.yml +21 -0
  44. data/config/locales/en/views.en.yml +12 -0
  45. data/config/locales/es/flash.es.yml +11 -0
  46. data/config/locales/es/forms.es.yml +9 -0
  47. data/config/locales/es/mailers.es.yml +18 -0
  48. data/config/locales/es/views.es.yml +13 -0
  49. data/config/locales/models.en.yml +8 -0
  50. data/config/locales/models.es.yml +8 -0
  51. data/config/locales/models.yml +8 -0
  52. data/config/routes.rb +7 -0
  53. data/db/migrate/20211202211706_create_no_password_sessions.rb +16 -0
  54. data/docs/aoorora-demo.gif +0 -0
  55. data/docs/dummy-app.png +0 -0
  56. data/lib/generators/no_password/install_generator.rb +30 -0
  57. data/lib/generators/no_password/install_templates_generator.rb +27 -0
  58. data/lib/generators/no_password/tailwind_config_generator.rb +9 -0
  59. data/lib/generators/no_password/templates/app/assets/config/no_password/tailwind.config.js.tt +57 -0
  60. data/lib/generators/no_password/templates/config/initializers/no_password.rb +10 -0
  61. data/lib/no_password/engine.rb +11 -0
  62. data/lib/no_password/railtie.rb +7 -0
  63. data/lib/no_password/version.rb +3 -0
  64. data/lib/no_password.rb +42 -0
  65. data/lib/tasks/install.rake +17 -0
  66. data/lib/tasks/no_password_tasks.rake +4 -0
  67. data/lib/tasks/tailwind.rake +23 -0
  68. metadata +227 -0
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "no_password"
4
+
5
+ NoPassword.configuration.importmap.draw do
6
+ # Stimulus & Turbo
7
+ pin "@hotwired/turbo-rails", to: "turbo.min.js", preload: true
8
+ pin "@hotwired/stimulus", to: "stimulus.min.js", preload: true
9
+ pin "@hotwired/stimulus-loading", to: "stimulus-loading.js", preload: true
10
+ pin "stimulus-use", to: "https://ga.jspm.io/npm:stimulus-use@0.50.0-2/dist/index.js"
11
+ pin "hotkeys-js", to: "https://ga.jspm.io/npm:hotkeys-js@3.8.7/dist/hotkeys.esm.js"
12
+
13
+ # NoPassword entrypoint
14
+ pin "application", to: "no_password/application.js", preload: true
15
+
16
+ pin_all_from NoPassword::Engine.root.join("app/assets/javascripts/no_password/controllers"), under: "controllers", to: "no_password/controllers"
17
+ end
@@ -0,0 +1,11 @@
1
+ en:
2
+ flash:
3
+ update:
4
+ invalid_code:
5
+ alert:
6
+ title: Token in invalid
7
+ description: Check your token, it maybe expired. Request a new one if you are unable to start a session.
8
+ session:
9
+ alert:
10
+ title: Unauthorized
11
+ description: Start a session to continue.
@@ -0,0 +1,9 @@
1
+ en:
2
+ form:
3
+ placeholders:
4
+ email: ana@my-email.com
5
+ token: 4646-39103-0867
6
+ labels:
7
+ token: Received token
8
+ submit:
9
+ login: Continue
@@ -0,0 +1,21 @@
1
+ en:
2
+ layouts:
3
+ no_password:
4
+ mailer:
5
+ service: Service provided by
6
+ platform: The banking core platform on which to run your financial business.
7
+ from: no-reply@aoorora.com
8
+ mailer:
9
+ from: no-reply@aoorora.com
10
+
11
+ mailers:
12
+ default_from: no-reply@aoorora.com
13
+
14
+ send_token:
15
+ subject: Here is your temporary login token
16
+ greetings: Hello!
17
+ instructions_1: You requested a login token to start a new session. Here is your code. You can copy/paste the code into our website. Please don't share this code to anyone.
18
+ instructions_2: Or use this button to start a new session. It will open a new browser window.
19
+ instructions_2_text: Or use the follwing link to start a new session. Copy and paste it your browser.
20
+ start_session: Continue to your session
21
+ instructions_3: If you did not request this email, please ignore and delete it. Do not resend or share it with other people.
@@ -0,0 +1,12 @@
1
+ en:
2
+ no_password:
3
+ sessions:
4
+ new:
5
+ title: New session
6
+ description: Enter your email below to receive a code and a link to log in.
7
+
8
+ session_confirmations:
9
+ edit:
10
+ title: Confirm your session
11
+ description: We sent you an email. Use the code on it to continue or use the link provided. Check your spam folder if you can't find our email in your inbox.
12
+ request_token: Request new token
@@ -0,0 +1,11 @@
1
+ es:
2
+ flash:
3
+ update:
4
+ invalid_code:
5
+ alert:
6
+ title: Código inválido
7
+ description: Revise su código no es válido o ya expiró. Puede solicitar uno nuevo.
8
+ session:
9
+ alert:
10
+ title: No existe sesión activa
11
+ description: Inicie una sesión para continuar.
@@ -0,0 +1,9 @@
1
+ es:
2
+ form:
3
+ placeholders:
4
+ email: "ana@mi-correo.com"
5
+ token: "4646-39103-0867"
6
+ labels:
7
+ token: "Código"
8
+ submit:
9
+ login: "Continuar"
@@ -0,0 +1,18 @@
1
+ es:
2
+ layouts:
3
+ no_password:
4
+ mailer:
5
+ service: Servicio de Aoorora
6
+ platform: La plataforma de core bancario sobre la cual ejecutar tu negocio financiero.
7
+
8
+ mailers:
9
+ default_from: no-reply@aoorora.com
10
+
11
+ send_token:
12
+ subject: Su código de sesión temporal está aquí.
13
+ greetings: Hola!
14
+ instructions_1: Usted solicitó un código de acceso a nuestro servicio. Su código temporal es el siguiente. Copie y pegue el código en nuestro sition. Por favor no comparta el código con otras personas.
15
+ instructions_2: O puede iniciar sesión automáticamente con el siguiente botón. Se abrirá una nueva ventana en su navegador.
16
+ instructions_2_text: O puede iniciar sesión automáticamente con el siguiente vínculo. Cópielo y péguelo en su navegador.
17
+ instructions_3: Si usted no solicitó este correo, por favor haga caso omiso de él y eliminelo. No lo reenvie o comparta con otras personas.
18
+ start_session: Continuar a su sessión
@@ -0,0 +1,13 @@
1
+ es:
2
+ no_password:
3
+ sessions:
4
+ new:
5
+ title: Nueva sesión
6
+ description: Introduzca su correo electrónico para recibir un código y un enlace mágico para iniciar sesión.
7
+
8
+ session_confirmations:
9
+ edit:
10
+ title: Iniciar sesión
11
+ description: Utilice el código o la URL que recibió en su correo. Si no lo encuentra, búsquelo en la bandeja de Spam.
12
+ submit: Iniciar sesión
13
+ request_token: Solicitar nuevo código
@@ -0,0 +1,8 @@
1
+ en:
2
+ activerecord:
3
+ models:
4
+ no_password/session: Session
5
+ attributes:
6
+ no_password/session:
7
+ email: Your email
8
+
@@ -0,0 +1,8 @@
1
+ es:
2
+ activerecord:
3
+ models:
4
+ no_password/session: Sessión
5
+ attributes:
6
+ no_password/session:
7
+ email: Su correo electrónico
8
+
@@ -0,0 +1,8 @@
1
+ en:
2
+ activerecord:
3
+ models:
4
+ no_password/session: Session
5
+ attributes:
6
+ no_password/session:
7
+ email: Your email
8
+
data/config/routes.rb ADDED
@@ -0,0 +1,7 @@
1
+ NoPassword::Engine.routes.draw do
2
+ resource :session, only: [:new, :create, :destroy]
3
+
4
+ get "/confirmations/:token", to: "session_confirmations#edit", as: :session_confirmation
5
+ get "/confirmations", to: "session_confirmations#edit", as: :edit_session_confirmations
6
+ resource :session_confirmations, path: :confirmations, only: [:edit, :update]
7
+ end
@@ -0,0 +1,16 @@
1
+ class CreateNoPasswordSessions < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :no_password_sessions, if_not_exists: true do |t|
4
+
5
+ t.timestamp :expires_at
6
+ t.timestamp :claimed_at
7
+ t.string :token, null: false
8
+ t.string :user_agent, null: false
9
+ t.string :remote_addr, null: false
10
+ t.string :return_url
11
+ t.string :email, null: false
12
+
13
+ t.timestamps
14
+ end
15
+ end
16
+ end
Binary file
Binary file
@@ -0,0 +1,30 @@
1
+ module NoPassword
2
+ class InstallGenerator < Rails::Generators::Base
3
+ source_root File.expand_path("../templates", __FILE__)
4
+
5
+ def create_initializer_file
6
+ template "config/initializers/no_password.rb"
7
+ end
8
+
9
+ def add_route
10
+ return if Rails.application.routes.routes.detect { |route| route.app.app == NoPassword::Engine }
11
+ route %(mount NoPassword::Engine => "/p")
12
+ end
13
+
14
+ def add_concerns
15
+ inject_into_file "app/controllers/application_controller.rb", after: "ActionController::Base" do
16
+ <<~EOF
17
+ \n include NoPassword::ControllerHelpers
18
+ EOF
19
+ end
20
+ end
21
+
22
+ def copy_migrations
23
+ rake "no_password:install:migrations"
24
+ end
25
+
26
+ def build_tailwind
27
+ rake "no_password:tailwindcss:build"
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,27 @@
1
+ module NoPassword
2
+ class InstallTemplatesGenerator < Rails::Generators::Base
3
+ source_root File.expand_path("../../../app/views", __FILE__)
4
+
5
+ def copy_layout
6
+ empty_directory "app/views/layouts/no_password"
7
+ directory File.join(engine_views_path, "layouts", "no_password"),
8
+ File.join(app_views_path, "layouts", "no_password")
9
+ end
10
+
11
+ def copy_views
12
+ empty_directory "app/views/no_password"
13
+ directory File.join(engine_views_path, "no_password"),
14
+ File.join(app_views_path, "no_password")
15
+ end
16
+
17
+ private
18
+
19
+ def engine_views_path
20
+ @engine_views_path ||= File.join(NoPassword::Engine.root, "app", "views")
21
+ end
22
+
23
+ def app_views_path
24
+ @app_views_path ||= File.join(Rails.root, "app", "views")
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,9 @@
1
+ module NoPassword
2
+ class TailwindConfigGenerator < Rails::Generators::Base
3
+ source_root File.expand_path("../templates", __FILE__)
4
+
5
+ def create_tailwind_config_file
6
+ template "app/assets/config/no_password/tailwind.config.js"
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,57 @@
1
+ const defaultTheme = require('tailwindcss/defaultTheme')
2
+
3
+ function withOpacityValue(variableName) {
4
+ return ({opacityValue}) => {
5
+ opacityValue = opacityValue ?? 1;
6
+ return `rgba(var(${variableName}), ${opacityValue})`
7
+ }
8
+ };
9
+
10
+ module.exports = {
11
+ content: [
12
+ <%= NoPassword.configuration.tailwind_content.map{|path| "'#{path}'"}.join(",\n") %>
13
+ ],
14
+ theme: {
15
+ extend: {
16
+ fontFamily: {
17
+ sans: ['Inter var', ...defaultTheme.fontFamily.sans],
18
+ },
19
+ textColor: {
20
+ skin: {
21
+ inverted: withOpacityValue('--color-inverted'),
22
+ accented: withOpacityValue('--color-accented'),
23
+ 'accented-hover': withOpacityValue('--color-accented-hover'),
24
+ base: withOpacityValue('--color-base'),
25
+ muted: withOpacityValue('--color-muted'),
26
+ dimmed: withOpacityValue('--color-dimmed'),
27
+ error: withOpacityValue('--color-error'),
28
+ }
29
+ },
30
+ backgroundColor: {
31
+ skin: {
32
+ 'button-accented': withOpacityValue('--color-accented'),
33
+ 'button-accented-hover': withOpacityValue('--color-accented-hover'),
34
+ 'button-inverted': withOpacityValue('--color-inverted'),
35
+ 'button-inverted-hover': withOpacityValue('--color-inverted-hover'),
36
+ muted: withOpacityValue('--color-muted'),
37
+ dimmed: withOpacityValue('--color-dimmed'),
38
+ accent: withOpacityValue('--color-accent'),
39
+ }
40
+ },
41
+ ringColor: {
42
+ skin: {
43
+ accented: withOpacityValue('--color-border-accented'),
44
+ }
45
+ },
46
+ borderColor: {
47
+ skin: {
48
+ base: withOpacityValue('--color-border-base'),
49
+ accented: withOpacityValue('--color-border-accented'),
50
+ }
51
+ }
52
+ },
53
+ },
54
+ plugins: [
55
+ require('@tailwindcss/forms')
56
+ ],
57
+ }
@@ -0,0 +1,10 @@
1
+ NoPassword.configure do |config|
2
+ # Session expiration time
3
+ # config.session_expiration = 2.hours
4
+ #
5
+ # Token expiration time
6
+ # config.token_expiration = 15.minutes
7
+ #
8
+ # Secret key to cypher tokens, if none, then Rails secret key is used
9
+ # config.secret_key = nil
10
+ end
@@ -0,0 +1,11 @@
1
+ require "importmap-rails"
2
+
3
+ module NoPassword
4
+ class Engine < ::Rails::Engine
5
+ isolate_namespace NoPassword
6
+
7
+ initializer "no_password.importmap", before: "importmap" do |app|
8
+ app.config.importmap.paths << Engine.root.join("config/initializers/importmap.rb")
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ module NoPassword
2
+ class Railtie < Rails::Railtie
3
+ initializer "no_password.assets.precompile" do |app|
4
+ app.config.assets.precompile += %w[no_password/manifest]
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ module NoPassword
2
+ VERSION = "0.2.1"
3
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "no_password/version"
4
+ require "no_password/engine"
5
+ require "no_password/railtie"
6
+ require "importmap-rails"
7
+
8
+ module NoPassword
9
+ class << self
10
+ attr_accessor :configuration
11
+ end
12
+
13
+ class Configuration
14
+ attr_accessor :session_expiration, :token_expiration, :secret_key, :tailwind_content, :importmap
15
+
16
+ def initialize
17
+ @session_expiration = 2.hours
18
+ @token_expiration = 15.minutes
19
+ @secret_key = nil
20
+ @importmap = Importmap::Map.new
21
+
22
+ @tailwind_content = [
23
+ "#{NoPassword::Engine.root}/app/views/**/*",
24
+ "#{NoPassword::Engine.root}/app/helpers/**/*",
25
+ "#{NoPassword::Engine.root}/app/controllers/**/*",
26
+ "#{NoPassword::Engine.root}/app/javascript/**/*.js",
27
+ "#{NoPassword::Engine.root}/app/assets/**/application.tailwind.css"
28
+ ]
29
+ end
30
+ end
31
+
32
+ def self.init_config
33
+ self.configuration ||= Configuration.new
34
+ end
35
+
36
+ def self.configure
37
+ init_config
38
+ yield(configuration)
39
+ end
40
+ end
41
+
42
+ NoPassword.init_config
@@ -0,0 +1,17 @@
1
+ namespace :no_password do
2
+ desc "Install No Password"
3
+ task install: :environment do
4
+ ActiveRecord::Base.connection
5
+ rescue ActiveRecord::NoDatabaseError
6
+ puts "ERROR: database does not exist, run 'rails db:create' first"
7
+ else
8
+ Rails::Command.invoke :generate, ["no_password:install"]
9
+ end
10
+
11
+ namespace :install do
12
+ desc "Copy templates from no_password to application"
13
+ task copy_templates: :environment do
14
+ Rails::Command.invoke :generate, ["no_password:install_templates"]
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :no_password do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,23 @@
1
+ require "tailwindcss-rails"
2
+
3
+ NO_PASSWORD_TAILWIND_COMPILE_COMMAND = "#{Tailwindcss::Engine.root.join("exe/tailwindcss")} -i #{NoPassword::Engine.root.join("app/assets/stylesheets/no_password/application.tailwind.css")} -o #{Rails.root.join("app/assets/builds", "no_password/tailwind.css")} -c #{Rails.root.join("app/assets/config/no_password/tailwind.config.js")}"
4
+
5
+ namespace :no_password do
6
+ namespace :tailwindcss do
7
+ desc "Build your Tailwind CSS"
8
+ task :build do
9
+ Rails::Generators.invoke("no_password:tailwind_config", ["--force"])
10
+ system NO_PASSWORD_TAILWIND_COMPILE_COMMAND
11
+ end
12
+
13
+ desc "Watch and build your Tailwind CSS"
14
+ task :watch do
15
+ Rails::Generators.invoke("no_password:tailwind_config", ["--force"])
16
+ system "#{NO_PASSWORD_TAILWIND_COMPILE_COMMAND} -w"
17
+ end
18
+ end
19
+ end
20
+
21
+ if Rake::Task.task_defined?("assets:precompile")
22
+ Rake::Task["assets:precompile"].enhance(["no_password:tailwindcss:build"])
23
+ end