gatepass 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +58 -0
  3. data/Rakefile +8 -0
  4. data/app/assets/config/gatepass_manifest.js +1 -0
  5. data/app/assets/stylesheets/gatepass/application.css +15 -0
  6. data/app/controllers/gatepass/application_controller.rb +4 -0
  7. data/app/controllers/gatepass/authentication_controller.rb +68 -0
  8. data/app/controllers/gatepass/users_controller.rb +60 -0
  9. data/app/helpers/gatepass/application_helper.rb +4 -0
  10. data/app/helpers/gatepass/authentication_helper.rb +4 -0
  11. data/app/helpers/gatepass/users_helper.rb +4 -0
  12. data/app/jobs/gatepass/application_job.rb +4 -0
  13. data/app/mailers/gatepass/application_mailer.rb +6 -0
  14. data/app/models/gatepass/application_record.rb +5 -0
  15. data/app/models/gatepass/user.rb +5 -0
  16. data/app/views/gatepass/authentication/authenticate.html.erb +2 -0
  17. data/app/views/gatepass/authentication/login.html.erb +13 -0
  18. data/app/views/gatepass/authentication/logout.html.erb +2 -0
  19. data/app/views/gatepass/users/_form.html.erb +37 -0
  20. data/app/views/gatepass/users/_user.html.erb +22 -0
  21. data/app/views/gatepass/users/edit.html.erb +10 -0
  22. data/app/views/gatepass/users/index.html.erb +14 -0
  23. data/app/views/gatepass/users/new.html.erb +9 -0
  24. data/app/views/gatepass/users/show.html.erb +10 -0
  25. data/app/views/layouts/gatepass/application.html.erb +15 -0
  26. data/config/initializers/assets.rb +1 -0
  27. data/config/routes.rb +6 -0
  28. data/db/migrate/20230726110030_create_gatepass_users.rb +12 -0
  29. data/lib/gatepass/engine.rb +5 -0
  30. data/lib/gatepass/version.rb +3 -0
  31. data/lib/gatepass.rb +10 -0
  32. data/lib/tasks/gatepass_tasks.rake +4 -0
  33. metadata +102 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 6adfbc31cccc12d1786457c468667bcba579db0db4639aae68a01bb61a570e64
4
+ data.tar.gz: 5e456e23ddcda822bc391601c88fb0286184abc9f164de6ad2cf35e1765b912d
5
+ SHA512:
6
+ metadata.gz: 10d45f2705514fbd230e72a336f13935e88d571b55d76431c1acedb942f47c34b84cb352c55c442842fe1df00d08641b21ac02444ded243149aba3a77f20e0c9
7
+ data.tar.gz: 200c1bf025039c8e889951d30afe355dc8b010087c8e66526d854ff38438887b6cb329ccefdb00f063baf4e3f5d4017346b45ba564160890ffc2b3e78a954304
data/README.md ADDED
@@ -0,0 +1,58 @@
1
+ # Gatepass
2
+ Short description and motivation.
3
+
4
+ ## Usage
5
+ How to use my plugin.
6
+
7
+ ## Installation
8
+ Add this line to your application's Gemfile:
9
+
10
+ ```ruby
11
+ gem "gatepass"
12
+ ```
13
+
14
+ And then execute:
15
+ ```bash
16
+ $ bundle
17
+ ```
18
+
19
+ Or install it yourself as:
20
+ ```bash
21
+ $ gem install gatepass
22
+ ```
23
+
24
+ Modify the application controller to include the Gatepass module and add the authentication check:
25
+ ```
26
+ class ApplicationController < ActionController::Base
27
+ include Gatepass
28
+ before_action :check_authenticated
29
+ end
30
+ ```
31
+
32
+ TODO - Configuration parameters
33
+
34
+ Create an initial user account with:
35
+ ```
36
+ $ rails c
37
+ u1 = Gatepass::User.new
38
+ u1.username = 'nitin'
39
+ u1.password = 'green'
40
+ u1.auth_type = 'local'
41
+ u1.save
42
+ ```
43
+
44
+ Login with the above account, and access the user account management page at:
45
+ http://localhost:3000/gatepass/users
46
+
47
+ ## Other Notes
48
+ The User model has the fields: username:string auth_type:string password_digest:string username_mapping:string
49
+
50
+ auth_type is `local` or `activedirectory`.
51
+
52
+ Use a dummy password for activedirectory users.
53
+
54
+ ## Contributing
55
+ Contribution directions go here.
56
+
57
+ ## License
58
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require "bundler/setup"
2
+
3
+ APP_RAKEFILE = File.expand_path("test/dummy/Rakefile", __dir__)
4
+ load "rails/tasks/engine.rake"
5
+
6
+ load "rails/tasks/statistics.rake"
7
+
8
+ require "bundler/gem_tasks"
@@ -0,0 +1 @@
1
+ //= link_directory ../stylesheets/gatepass .css
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
+ * files in this directory. Styles in this file should be added after the last require_* statement.
11
+ * It is generally better to create a new file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,4 @@
1
+ module Gatepass
2
+ class ApplicationController < ActionController::Base
3
+ end
4
+ end
@@ -0,0 +1,68 @@
1
+ module Gatepass
2
+ class AuthenticationController < ApplicationController
3
+ def login
4
+ end
5
+
6
+ def logout
7
+ session.delete :user
8
+ redirect_to :action => :login
9
+ end
10
+
11
+ def authenticate
12
+ username = params[:username]
13
+ password = params[:password]
14
+
15
+ user = User.find_by(username: username)
16
+ if user.auth_type == 'local'
17
+ user_obj = user.authenticate(password)
18
+
19
+ if user_obj === false
20
+ redirect_to ({ controller: 'gatepass/authentication', action: 'login' })
21
+ else
22
+ session[:user] = user_obj
23
+ redirect_to main_app.root_url
24
+ end
25
+ elsif user.auth_type == 'activedirectory' # 'ldap'
26
+ require 'net/ldap'
27
+
28
+ server_address = Rails.application.config.ldap_server_hostname # 'ad.nitinkatkam.mdbrecruit.net'
29
+ server_port = Rails.application.config.ldap_server_port
30
+ ca_certificate = Rails.application.config.ldap_ca_cert
31
+
32
+ ldap = Net::LDAP.new :host => server_address,
33
+ :port => server_port, # 636, # 389,
34
+ :encryption => {
35
+ method: :simple_tls,
36
+ tls_options: {
37
+ ca_file: ca_certificate # '/Users/nitin.katkam/Downloads/nitinkatkam-ad-ca.cer',
38
+ # verify_mode: OpenSSL::SSL::VERIFY_NONE
39
+ }
40
+ },
41
+ :auth => {
42
+ :method => :simple,
43
+ :username => user.username_mapping,
44
+ :password => password
45
+ }
46
+
47
+ filter = Net::LDAP::Filter.eq("distinguishedname", user.username_mapping)
48
+ treebase = Rails.application.config.ldap_base # "dc=nitinkatkam, dc=mdbrecruit, dc=net"
49
+
50
+ search_result_count = 0
51
+ ldap.search(:base => treebase, :filter => filter) do |entry|
52
+ search_result_count += 1
53
+ # puts "DN: #{entry.dn}" # CN=bindUser1,CN=Users,DC=nitinkatkam,DC=mdbrecruit,DC=net
54
+ # puts "memberOf: #{entry.memberof}" #["CN=peopleOfNitinKatkam,CN=Users,DC=nitinkatkam,DC=mdbrecruit,DC=net", "CN=Administrators,CN=Builtin,DC=nitinkatkam,DC=mdbrecruit,DC=net"]
55
+
56
+ if ldap.get_operation_result.code == 49 or search_result_count == 0
57
+ redirect_to({ controller: 'gatepass/authentication', action: 'login' })
58
+ elsif search_result_count == 1
59
+ session[:user] = user # entry # user_obj
60
+ redirect_to main_app.root_url
61
+ else
62
+ redirect_to({ controller: 'gatepass/authentication', action: 'login' })
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,60 @@
1
+ module Gatepass
2
+ class UsersController < ApplicationController
3
+ before_action :set_user, only: %i[ show edit update destroy ]
4
+
5
+ # GET /users
6
+ def index
7
+ @users = User.all
8
+ end
9
+
10
+ # GET /users/1
11
+ def show
12
+ end
13
+
14
+ # GET /users/new
15
+ def new
16
+ @user = User.new
17
+ end
18
+
19
+ # GET /users/1/edit
20
+ def edit
21
+ end
22
+
23
+ # POST /users
24
+ def create
25
+ @user = User.new(user_params)
26
+
27
+ if @user.save
28
+ redirect_to @user, notice: "User was successfully created."
29
+ else
30
+ render :new, status: :unprocessable_entity
31
+ end
32
+ end
33
+
34
+ # PATCH/PUT /users/1
35
+ def update
36
+ if @user.update(user_params)
37
+ redirect_to @user, notice: "User was successfully updated."
38
+ else
39
+ render :edit, status: :unprocessable_entity
40
+ end
41
+ end
42
+
43
+ # DELETE /users/1
44
+ def destroy
45
+ @user.destroy
46
+ redirect_to users_url, notice: "User was successfully destroyed.", status: :see_other
47
+ end
48
+
49
+ private
50
+ # Use callbacks to share common setup or constraints between actions.
51
+ def set_user
52
+ @user = User.find(params[:id])
53
+ end
54
+
55
+ # Only allow a list of trusted parameters through.
56
+ def user_params
57
+ params.require(:user).permit(:username, :auth_type, :password_digest, :username_mapping)
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,4 @@
1
+ module Gatepass
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Gatepass
2
+ module AuthenticationHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Gatepass
2
+ module UsersHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Gatepass
2
+ class ApplicationJob < ActiveJob::Base
3
+ end
4
+ end
@@ -0,0 +1,6 @@
1
+ module Gatepass
2
+ class ApplicationMailer < ActionMailer::Base
3
+ default from: "from@example.com"
4
+ layout "mailer"
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ module Gatepass
2
+ class ApplicationRecord < ActiveRecord::Base
3
+ self.abstract_class = true
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module Gatepass
2
+ class User < ApplicationRecord
3
+ has_secure_password
4
+ end
5
+ end
@@ -0,0 +1,2 @@
1
+ <h1>Authentication#authenticate</h1>
2
+ <p>Find me in app/views/authentication/authenticate.html.erb</p>
@@ -0,0 +1,13 @@
1
+ <h1>Authentication#login</h1>
2
+
3
+ <%= form_with url: { action: :authenticate } do |form| %>
4
+ <%= form.label :username %>
5
+ <%= form.text_field :username %>
6
+ <br />
7
+
8
+ <%= form.label :password %>
9
+ <%= form.password_field :password %>
10
+ <br />
11
+
12
+ <%= form.submit 'Login' %>
13
+ <% end %>
@@ -0,0 +1,2 @@
1
+ <h1>Authentication#logout</h1>
2
+ <p>Find me in app/views/gatepass/authentication/logout.html.erb</p>
@@ -0,0 +1,37 @@
1
+ <%= form_with(model: user) do |form| %>
2
+ <% if user.errors.any? %>
3
+ <div style="color: red">
4
+ <h2><%= pluralize(user.errors.count, "error") %> prohibited this user from being saved:</h2>
5
+
6
+ <ul>
7
+ <% user.errors.each do |error| %>
8
+ <li><%= error.full_message %></li>
9
+ <% end %>
10
+ </ul>
11
+ </div>
12
+ <% end %>
13
+
14
+ <div>
15
+ <%= form.label :username, style: "display: block" %>
16
+ <%= form.text_field :username %>
17
+ </div>
18
+
19
+ <div>
20
+ <%= form.label :auth_type, style: "display: block" %>
21
+ <%= form.text_field :auth_type %>
22
+ </div>
23
+
24
+ <div>
25
+ <%= form.label :password_digest, style: "display: block" %>
26
+ <%= form.text_field :password_digest %>
27
+ </div>
28
+
29
+ <div>
30
+ <%= form.label :username_mapping, style: "display: block" %>
31
+ <%= form.text_field :username_mapping %>
32
+ </div>
33
+
34
+ <div>
35
+ <%= form.submit %>
36
+ </div>
37
+ <% end %>
@@ -0,0 +1,22 @@
1
+ <div id="<%= dom_id user %>">
2
+ <p>
3
+ <strong>Username:</strong>
4
+ <%= user.username %>
5
+ </p>
6
+
7
+ <p>
8
+ <strong>Auth type:</strong>
9
+ <%= user.auth_type %>
10
+ </p>
11
+
12
+ <p>
13
+ <strong>Password digest:</strong>
14
+ <%= user.password_digest %>
15
+ </p>
16
+
17
+ <p>
18
+ <strong>Username mapping:</strong>
19
+ <%= user.username_mapping %>
20
+ </p>
21
+
22
+ </div>
@@ -0,0 +1,10 @@
1
+ <h1>Editing user</h1>
2
+
3
+ <%= render "form", user: @user %>
4
+
5
+ <br>
6
+
7
+ <div>
8
+ <%= link_to "Show this user", @user %> |
9
+ <%= link_to "Back to users", users_path %>
10
+ </div>
@@ -0,0 +1,14 @@
1
+ <p style="color: green"><%= notice %></p>
2
+
3
+ <h1>Users</h1>
4
+
5
+ <div id="users">
6
+ <% @users.each do |user| %>
7
+ <%= render user %>
8
+ <p>
9
+ <%= link_to "Show this user", user %>
10
+ </p>
11
+ <% end %>
12
+ </div>
13
+
14
+ <%= link_to "New user", new_user_path %>
@@ -0,0 +1,9 @@
1
+ <h1>New user</h1>
2
+
3
+ <%= render "form", user: @user %>
4
+
5
+ <br>
6
+
7
+ <div>
8
+ <%= link_to "Back to users", users_path %>
9
+ </div>
@@ -0,0 +1,10 @@
1
+ <p style="color: green"><%= notice %></p>
2
+
3
+ <%= render @user %>
4
+
5
+ <div>
6
+ <%= link_to "Edit this user", edit_user_path(@user) %> |
7
+ <%= link_to "Back to users", users_path %>
8
+
9
+ <%= button_to "Destroy this user", @user, method: :delete %>
10
+ </div>
@@ -0,0 +1,15 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Gatepass</title>
5
+ <%= csrf_meta_tags %>
6
+ <%= csp_meta_tag %>
7
+
8
+ <%= stylesheet_link_tag "gatepass/application", media: "all" %>
9
+ </head>
10
+ <body>
11
+
12
+ <%= yield %>
13
+
14
+ </body>
15
+ </html>
@@ -0,0 +1 @@
1
+ Rails.application.config.assets.precompile += %w( gatepass/application.css gatepass/application.js )
data/config/routes.rb ADDED
@@ -0,0 +1,6 @@
1
+ Gatepass::Engine.routes.draw do
2
+ get 'authentication/login'
3
+ get 'authentication/logout'
4
+ post 'authentication/authenticate'
5
+ resources :users
6
+ end
@@ -0,0 +1,12 @@
1
+ class CreateGatepassUsers < ActiveRecord::Migration[7.0]
2
+ def change
3
+ create_table :gatepass_users do |t|
4
+ t.string :username
5
+ t.string :auth_type
6
+ t.string :password_digest
7
+ t.string :username_mapping
8
+
9
+ t.timestamps
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,5 @@
1
+ module Gatepass
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace Gatepass
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ module Gatepass
2
+ VERSION = "0.1.0"
3
+ end
data/lib/gatepass.rb ADDED
@@ -0,0 +1,10 @@
1
+ require "gatepass/version"
2
+ require "gatepass/engine"
3
+
4
+ module Gatepass
5
+ def check_authenticated
6
+ if session[:user].nil?
7
+ redirect_to user_auth.authentication_login_path ({ :controller => 'gatepass/authentication', :action => :login })
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :gatepass do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,102 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gatepass
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Nitin Reddy
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-07-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 7.0.6
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 7.0.6
27
+ - !ruby/object:Gem::Dependency
28
+ name: bcrypt
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 3.1.19
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 3.1.19
41
+ description: This Rails plugin enables you to authenticate users against the local
42
+ database as well as against an ActiveDirectory server
43
+ email:
44
+ - 82951937+nitredd@users.noreply.github.com
45
+ executables: []
46
+ extensions: []
47
+ extra_rdoc_files: []
48
+ files:
49
+ - README.md
50
+ - Rakefile
51
+ - app/assets/config/gatepass_manifest.js
52
+ - app/assets/stylesheets/gatepass/application.css
53
+ - app/controllers/gatepass/application_controller.rb
54
+ - app/controllers/gatepass/authentication_controller.rb
55
+ - app/controllers/gatepass/users_controller.rb
56
+ - app/helpers/gatepass/application_helper.rb
57
+ - app/helpers/gatepass/authentication_helper.rb
58
+ - app/helpers/gatepass/users_helper.rb
59
+ - app/jobs/gatepass/application_job.rb
60
+ - app/mailers/gatepass/application_mailer.rb
61
+ - app/models/gatepass/application_record.rb
62
+ - app/models/gatepass/user.rb
63
+ - app/views/gatepass/authentication/authenticate.html.erb
64
+ - app/views/gatepass/authentication/login.html.erb
65
+ - app/views/gatepass/authentication/logout.html.erb
66
+ - app/views/gatepass/users/_form.html.erb
67
+ - app/views/gatepass/users/_user.html.erb
68
+ - app/views/gatepass/users/edit.html.erb
69
+ - app/views/gatepass/users/index.html.erb
70
+ - app/views/gatepass/users/new.html.erb
71
+ - app/views/gatepass/users/show.html.erb
72
+ - app/views/layouts/gatepass/application.html.erb
73
+ - config/initializers/assets.rb
74
+ - config/routes.rb
75
+ - db/migrate/20230726110030_create_gatepass_users.rb
76
+ - lib/gatepass.rb
77
+ - lib/gatepass/engine.rb
78
+ - lib/gatepass/version.rb
79
+ - lib/tasks/gatepass_tasks.rake
80
+ homepage:
81
+ licenses: []
82
+ metadata: {}
83
+ post_install_message:
84
+ rdoc_options: []
85
+ require_paths:
86
+ - lib
87
+ required_ruby_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ required_rubygems_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ requirements: []
98
+ rubygems_version: 3.4.10
99
+ signing_key:
100
+ specification_version: 4
101
+ summary: An ActiveDirectory and local user authentication plugin for Rails
102
+ test_files: []