incline 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +13 -0
- data/Gemfile +17 -0
- data/Gemfile.lock +186 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +208 -0
- data/Rakefile +37 -0
- data/app/assets/fonts/incline/.keep +0 -0
- data/app/assets/images/incline/.keep +0 -0
- data/app/assets/images/incline/barcode-B.svg +181 -0
- data/app/assets/javascripts/incline/activate_classed_items.js +11 -0
- data/app/assets/javascripts/incline/application.js +30 -0
- data/app/assets/javascripts/incline/bootstrap-datepicker.js +1800 -0
- data/app/assets/javascripts/incline/datatables.js +22193 -0
- data/app/assets/javascripts/incline/escapeHtml.js +10 -0
- data/app/assets/javascripts/incline/inline_actions.js +479 -0
- data/app/assets/javascripts/incline/jquery.doubleScroll.js +112 -0
- data/app/assets/javascripts/incline/jquery.number.js +764 -0
- data/app/assets/javascripts/incline/regexMask.js +27 -0
- data/app/assets/javascripts/incline/select2/i18n/en.js +3 -0
- data/app/assets/javascripts/incline/select2/select2.full.js +6436 -0
- data/app/assets/stylesheets/incline/application.css +18 -0
- data/app/assets/stylesheets/incline/bootstrap-theme.min.css +5 -0
- data/app/assets/stylesheets/incline/custom.scss +279 -0
- data/app/assets/stylesheets/incline/datatables.css +494 -0
- data/app/assets/stylesheets/incline/datepicker3.css +790 -0
- data/app/assets/stylesheets/incline/select2.css +484 -0
- data/app/controllers/incline/access_groups_controller.rb +127 -0
- data/app/controllers/incline/access_test_controller.rb +30 -0
- data/app/controllers/incline/account_activations_controller.rb +28 -0
- data/app/controllers/incline/application_controller.rb +11 -0
- data/app/controllers/incline/contact_controller.rb +34 -0
- data/app/controllers/incline/password_resets_controller.rb +113 -0
- data/app/controllers/incline/security_controller.rb +100 -0
- data/app/controllers/incline/sessions_controller.rb +50 -0
- data/app/controllers/incline/users_controller.rb +304 -0
- data/app/controllers/incline/welcome_controller.rb +19 -0
- data/app/helpers/incline/.keep +0 -0
- data/app/mailers/incline/application_mailer_base.rb +11 -0
- data/app/mailers/incline/contact_form.rb +19 -0
- data/app/mailers/incline/user_mailer.rb +45 -0
- data/app/models/incline/access_group.rb +121 -0
- data/app/models/incline/access_group_group_member.rb +12 -0
- data/app/models/incline/access_group_user_member.rb +10 -0
- data/app/models/incline/action_group.rb +12 -0
- data/app/models/incline/action_security.rb +222 -0
- data/app/models/incline/contact_message.rb +37 -0
- data/app/models/incline/disable_info.rb +20 -0
- data/app/models/incline/password_reset.rb +14 -0
- data/app/models/incline/password_reset_request.rb +14 -0
- data/app/models/incline/user.rb +437 -0
- data/app/models/incline/user_login_history.rb +30 -0
- data/app/views/incline/access_groups/_details.json.jbuilder +10 -0
- data/app/views/incline/access_groups/_form.html.erb +19 -0
- data/app/views/incline/access_groups/_list.html.erb +60 -0
- data/app/views/incline/access_groups/_messages.json.jbuilder +6 -0
- data/app/views/incline/access_groups/edit.html.erb +2 -0
- data/app/views/incline/access_groups/index.html.erb +6 -0
- data/app/views/incline/access_groups/index.json.jbuilder +16 -0
- data/app/views/incline/access_groups/new.html.erb +2 -0
- data/app/views/incline/access_groups/show.html.erb +9 -0
- data/app/views/incline/access_groups/show.json.jbuilder +11 -0
- data/app/views/incline/contact/new.html.erb +22 -0
- data/app/views/incline/contact_form/contact.html.erb +16 -0
- data/app/views/incline/contact_form/contact.text.erb +13 -0
- data/app/views/incline/password_resets/edit.html.erb +16 -0
- data/app/views/incline/password_resets/new.html.erb +12 -0
- data/app/views/incline/security/_details.json.jbuilder +7 -0
- data/app/views/incline/security/_form.html.erb +20 -0
- data/app/views/incline/security/_list.html.erb +89 -0
- data/app/views/incline/security/_messages.json.jbuilder +6 -0
- data/app/views/incline/security/edit.html.erb +2 -0
- data/app/views/incline/security/index.html.erb +6 -0
- data/app/views/incline/security/index.json.jbuilder +16 -0
- data/app/views/incline/security/show.html.erb +31 -0
- data/app/views/incline/security/show.json.jbuilder +11 -0
- data/app/views/incline/sessions/new.html.erb +26 -0
- data/app/views/incline/user_mailer/account_activation.html.erb +7 -0
- data/app/views/incline/user_mailer/account_activation.text.erb +6 -0
- data/app/views/incline/user_mailer/invalid_password_reset.html.erb +3 -0
- data/app/views/incline/user_mailer/invalid_password_reset.text.erb +5 -0
- data/app/views/incline/user_mailer/password_reset.html.erb +8 -0
- data/app/views/incline/user_mailer/password_reset.text.erb +7 -0
- data/app/views/incline/users/_details.json.jbuilder +32 -0
- data/app/views/incline/users/_form.html.erb +21 -0
- data/app/views/incline/users/_list.html.erb +102 -0
- data/app/views/incline/users/_messages.json.jbuilder +6 -0
- data/app/views/incline/users/disable_confirm.html.erb +19 -0
- data/app/views/incline/users/edit.html.erb +5 -0
- data/app/views/incline/users/index.html.erb +6 -0
- data/app/views/incline/users/index.json.jbuilder +16 -0
- data/app/views/incline/users/new.html.erb +5 -0
- data/app/views/incline/users/show.html.erb +12 -0
- data/app/views/incline/users/show.json.jbuilder +11 -0
- data/app/views/incline/welcome/home.html.erb +5 -0
- data/app/views/layouts/application.html.erb +1 -0
- data/app/views/layouts/incline/_account_menu.html.erb +18 -0
- data/app/views/layouts/incline/_app_menu_anon.html.erb +1 -0
- data/app/views/layouts/incline/_app_menu_authenticated.html.erb +1 -0
- data/app/views/layouts/incline/_footer.html.erb +13 -0
- data/app/views/layouts/incline/_header.html.erb +21 -0
- data/app/views/layouts/incline/_html_mailer.html.erb +5 -0
- data/app/views/layouts/incline/_incline_app.html.erb +25 -0
- data/app/views/layouts/incline/_messages.html.erb +3 -0
- data/app/views/layouts/incline/_shim.html.erb +3 -0
- data/app/views/layouts/incline/_text_mailer.text.erb +1 -0
- data/app/views/layouts/incline/application.html.erb +1 -0
- data/app/views/layouts/mailer.html.erb +2 -0
- data/app/views/layouts/mailer.text.erb +2 -0
- data/bin/rails +12 -0
- data/bin/test_scaffold.sh +10 -0
- data/config/routes.rb +61 -0
- data/db/migrate/20170511230126_create_incline_users.rb +26 -0
- data/db/migrate/20170515003052_create_incline_access_groups.rb +10 -0
- data/db/migrate/20170515003221_create_incline_user_login_histories.rb +12 -0
- data/db/migrate/20170515150908_create_incline_access_group_user_members.rb +11 -0
- data/db/migrate/20170515151058_create_incline_access_group_group_members.rb +11 -0
- data/db/migrate/20170517193432_add_comments_to_incline_user.rb +5 -0
- data/db/migrate/20170622132700_create_incline_action_securities.rb +16 -0
- data/db/migrate/20170622172712_create_incline_action_groups.rb +11 -0
- data/db/migrate/20170622195742_add_non_standard_to_action_security.rb +5 -0
- data/db/migrate/20170622230422_add_visible_to_action_security.rb +5 -0
- data/db/seeds.rb +81 -0
- data/exe/new_incline_app +42 -0
- data/lib/generators/incline/install_generator.rb +259 -0
- data/lib/generators/incline/templates/_app_menu_anon.html.erb +1 -0
- data/lib/generators/incline/templates/_app_menu_authenticated.html.erb +1 -0
- data/lib/generators/incline/templates/incline_application.css +17 -0
- data/lib/generators/incline/templates/incline_application.html.erb +1 -0
- data/lib/generators/incline/templates/incline_application.js +12 -0
- data/lib/generators/incline/templates/incline_database.yml +25 -0
- data/lib/generators/incline/templates/incline_email.yml +20 -0
- data/lib/generators/incline/templates/incline_mailer.html.erb +2 -0
- data/lib/generators/incline/templates/incline_mailer.text.erb +2 -0
- data/lib/generators/incline/templates/incline_users.yml +64 -0
- data/lib/generators/incline/templates/incline_version.rb +3 -0
- data/lib/incline/auth_engine_base.rb +52 -0
- data/lib/incline/data_tables_request.rb +336 -0
- data/lib/incline/date_time_formats.rb +6 -0
- data/lib/incline/engine.rb +212 -0
- data/lib/incline/errors.rb +15 -0
- data/lib/incline/extensions/action_controller_base.rb +526 -0
- data/lib/incline/extensions/action_mailer_base.rb +66 -0
- data/lib/incline/extensions/action_view_base.rb +489 -0
- data/lib/incline/extensions/active_record_base.rb +308 -0
- data/lib/incline/extensions/application.rb +137 -0
- data/lib/incline/extensions/application_configuration.rb +50 -0
- data/lib/incline/extensions/connection_adapter.rb +55 -0
- data/lib/incline/extensions/date_time_value.rb +123 -0
- data/lib/incline/extensions/date_value.rb +77 -0
- data/lib/incline/extensions/decimal_value.rb +55 -0
- data/lib/incline/extensions/erb_scaffold_generator.rb +31 -0
- data/lib/incline/extensions/float_value.rb +59 -0
- data/lib/incline/extensions/form_builder.rb +617 -0
- data/lib/incline/extensions/integer_value.rb +54 -0
- data/lib/incline/extensions/jbuilder_generator.rb +38 -0
- data/lib/incline/extensions/jbuilder_template.rb +39 -0
- data/lib/incline/extensions/main_app.rb +40 -0
- data/lib/incline/extensions/numeric.rb +63 -0
- data/lib/incline/extensions/object.rb +31 -0
- data/lib/incline/extensions/resource_route_generator.rb +53 -0
- data/lib/incline/extensions/session.rb +113 -0
- data/lib/incline/extensions/string.rb +50 -0
- data/lib/incline/extensions/test_case.rb +764 -0
- data/lib/incline/extensions/time_zone_converter.rb +40 -0
- data/lib/incline/global_status.rb +236 -0
- data/lib/incline/helpers/route_hash_formatter.rb +46 -0
- data/lib/incline/json_log_formatter.rb +96 -0
- data/lib/incline/json_logger.rb +17 -0
- data/lib/incline/log.rb +153 -0
- data/lib/incline/number_formats.rb +17 -0
- data/lib/incline/recaptcha.rb +346 -0
- data/lib/incline/user_manager.rb +212 -0
- data/lib/incline/validators/email_validator.rb +45 -0
- data/lib/incline/validators/ip_address_validator.rb +32 -0
- data/lib/incline/validators/recaptcha_validator.rb +37 -0
- data/lib/incline/validators/safe_name_validator.rb +31 -0
- data/lib/incline/version.rb +3 -0
- data/lib/incline/work_path.rb +75 -0
- data/lib/incline.rb +197 -0
- data/lib/tasks/incline_tasks.rake +4 -0
- data/lib/templates/erb/scaffold/_form.html.erb +43 -0
- data/lib/templates/erb/scaffold/_list.html.erb +81 -0
- data/lib/templates/erb/scaffold/edit.html.erb +1 -0
- data/lib/templates/erb/scaffold/index.html.erb +6 -0
- data/lib/templates/erb/scaffold/new.html.erb +1 -0
- data/lib/templates/erb/scaffold/show.html.erb +34 -0
- data/lib/templates/jbuilder/scaffold/_details.json.jbuilder +20 -0
- data/lib/templates/jbuilder/scaffold/index.json.jbuilder +16 -0
- data/lib/templates/jbuilder/scaffold/show.json.jbuilder +16 -0
- data/lib/templates/rails/scaffold_controller/controller.rb +128 -0
- data/test/controllers/incline/access_groups_controller_test.rb +65 -0
- data/test/controllers/incline/access_test_controller_test.rb +53 -0
- data/test/controllers/incline/contact_controller_test.rb +32 -0
- data/test/controllers/incline/security_controller_test.rb +39 -0
- data/test/controllers/incline/welcome_controller_test.rb +16 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/images/.keep +0 -0
- data/test/dummy/app/assets/javascripts/application.js +12 -0
- data/test/dummy/app/assets/stylesheets/application.css +17 -0
- data/test/dummy/app/controllers/application_controller.rb +5 -0
- data/test/dummy/app/controllers/concerns/.keep +0 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/mailers/.keep +0 -0
- data/test/dummy/app/models/.keep +0 -0
- data/test/dummy/app/models/concerns/.keep +0 -0
- data/test/dummy/app/views/layouts/application.html.erb +1 -0
- data/test/dummy/app/views/layouts/incline/_app_menu_anon.html.erb +1 -0
- data/test/dummy/app/views/layouts/incline/_app_menu_authenticated.html.erb +1 -0
- data/test/dummy/app/views/layouts/mailer.html.erb +2 -0
- data/test/dummy/app/views/layouts/mailer.text.erb +2 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/bin/setup +29 -0
- data/test/dummy/config/application.rb +38 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/database.yml +34 -0
- data/test/dummy/config/email.yml +24 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +45 -0
- data/test/dummy/config/environments/production.rb +85 -0
- data/test/dummy/config/environments/test.rb +44 -0
- data/test/dummy/config/initializers/assets.rb +11 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/to_time_preserves_timezone.rb +10 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +6 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/db/schema.rb +108 -0
- data/test/dummy/lib/assets/.keep +0 -0
- data/test/dummy/log/.keep +0 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/extensions/action_controller_base_extensions_test.rb +21 -0
- data/test/extensions/action_mailer_base_extensions_test.rb +20 -0
- data/test/extensions/action_view_base_extensions_test.rb +267 -0
- data/test/extensions/active_record_extensions_test.rb +173 -0
- data/test/extensions/application_configuration_extensions_test.rb +46 -0
- data/test/extensions/application_extensions_test.rb +23 -0
- data/test/extensions/connection_adapter_extensions_test.rb +54 -0
- data/test/extensions/date_time_value_extensions_test.rb +104 -0
- data/test/extensions/date_value_extensions_test.rb +102 -0
- data/test/extensions/decimal_value_extensions_test.rb +85 -0
- data/test/extensions/erb_scaffold_generator_extensions_test.rb +17 -0
- data/test/extensions/float_value_extensions_test.rb +78 -0
- data/test/extensions/form_builder_extensions_test.rb +28 -0
- data/test/extensions/integer_value_extensions_test.rb +78 -0
- data/test/extensions/jbuilder_generator_extensions_test.rb +21 -0
- data/test/extensions/jbuilder_template_extensions_test.rb +47 -0
- data/test/extensions/main_app_extensions_test.rb +55 -0
- data/test/extensions/numeric_extensions_test.rb +76 -0
- data/test/extensions/object_extensions_test.rb +104 -0
- data/test/extensions/session_extensions_test.rb +69 -0
- data/test/extensions/string_extensions_test.rb +32 -0
- data/test/extensions/test_case_extensions_test.rb +538 -0
- data/test/extensions/time_zone_converter_extensions_test.rb +10 -0
- data/test/fixtures/incline/access_group_group_members.yml +1 -0
- data/test/fixtures/incline/access_group_user_members.yml +1 -0
- data/test/fixtures/incline/access_groups.yml +13 -0
- data/test/fixtures/incline/action_groups.yml +6 -0
- data/test/fixtures/incline/action_securities.yml +18 -0
- data/test/fixtures/incline/user_login_histories.yml +1 -0
- data/test/fixtures/incline/users.yml +64 -0
- data/test/incline_test.rb +63 -0
- data/test/integration/incline/users_edit_test.rb +180 -0
- data/test/integration/incline/users_login_test.rb +105 -0
- data/test/integration/incline/users_signup_test.rb +147 -0
- data/test/integration/navigation_test.rb +11 -0
- data/test/lib/data_tables_request_test.rb +245 -0
- data/test/lib/date_time_formats_test.rb +111 -0
- data/test/lib/global_status_test.rb +89 -0
- data/test/lib/json_log_formatter_test.rb +43 -0
- data/test/lib/log_test.rb +36 -0
- data/test/lib/recaptcha_test.rb +75 -0
- data/test/lib/user_manager_test.rb +47 -0
- data/test/lib/work_path_test.rb +18 -0
- data/test/models/incline/access_group_group_member_test.rb +30 -0
- data/test/models/incline/access_group_test.rb +60 -0
- data/test/models/incline/access_group_user_member_test.rb +29 -0
- data/test/models/incline/action_group_test.rb +27 -0
- data/test/models/incline/action_security_test.rb +176 -0
- data/test/models/incline/contact_message_test.rb +66 -0
- data/test/models/incline/disable_info_test.rb +29 -0
- data/test/models/incline/password_reset_request_test.rb +35 -0
- data/test/models/incline/password_reset_test.rb +51 -0
- data/test/models/incline/user_login_history_test.rb +31 -0
- data/test/models/incline/user_test.rb +91 -0
- data/test/test_helper.rb +42 -0
- data/test/validators/email_validator_test.rb +102 -0
- data/test/validators/ip_address_validator_test.rb +107 -0
- data/test/validators/recaptcha_validator_test.rb +57 -0
- data/test/validators/safe_name_validator_test.rb +101 -0
- metadata +584 -0
@@ -0,0 +1,25 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title><%= full_title(yield(:title)) %></title>
|
5
|
+
<%= stylesheet_link_tag 'application', media: 'all' %>
|
6
|
+
<%= yield :styles %>
|
7
|
+
<script type="text/javascript">
|
8
|
+
var application_root_offset='<%= (root_url[-1] == '/' ? root_url[0...-1] : root_url).gsub("'", "\\'") %>';
|
9
|
+
</script>
|
10
|
+
<%= javascript_include_tag 'application' %>
|
11
|
+
<%= yield :scripts %>
|
12
|
+
<%= csrf_meta_tags %>
|
13
|
+
<%= render 'layouts/incline/shim' %>
|
14
|
+
</head>
|
15
|
+
<body>
|
16
|
+
<%= render 'layouts/incline/header' %>
|
17
|
+
<div id="incline_body_container" class="container">
|
18
|
+
<%= render 'layouts/incline/messages' %>
|
19
|
+
<%= yield %>
|
20
|
+
</div>
|
21
|
+
<div id="incline_dynamic_alerts"></div>
|
22
|
+
<%= render 'layouts/incline/footer' %>
|
23
|
+
<%= Incline::Recaptcha.script_block %>
|
24
|
+
</body>
|
25
|
+
</html>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= yield %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= render 'layouts/incline/incline_app' %>
|
data/bin/rails
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# This command will automatically be run when you run "rails" with Rails 4 gems installed from the root of your application.
|
3
|
+
|
4
|
+
ENGINE_ROOT = File.expand_path('../..', __FILE__)
|
5
|
+
ENGINE_PATH = File.expand_path('../../lib/incline/engine', __FILE__)
|
6
|
+
|
7
|
+
# Set up gems listed in the Gemfile.
|
8
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
|
9
|
+
require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
|
10
|
+
|
11
|
+
require 'rails/all'
|
12
|
+
require 'rails/engine/commands'
|
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
ORIG_PATH=$PWD
|
4
|
+
cd test/dummy
|
5
|
+
rails generate scaffold some_item name:string item_type:string quantity:integer is_used:boolean last_received:date
|
6
|
+
rake db:migrate
|
7
|
+
rails server
|
8
|
+
rake db:rollback
|
9
|
+
rails destroy scaffold some_item
|
10
|
+
cd $ORIG_PATH
|
data/config/routes.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
Incline::Engine.routes.draw do
|
2
|
+
|
3
|
+
# user management
|
4
|
+
get 'signup' => 'users#new'
|
5
|
+
post 'signup' => 'users#create'
|
6
|
+
resources :users, except: [ :new, :create ] do
|
7
|
+
member do
|
8
|
+
get 'disable', action: :disable_confirm
|
9
|
+
match 'disable', via: [ :put, :patch ]
|
10
|
+
match 'enable', via: [ :put, :patch ]
|
11
|
+
match 'promote', via: [ :put, :patch ]
|
12
|
+
match 'demote', via: [ :put, :patch ]
|
13
|
+
post 'locate'
|
14
|
+
end
|
15
|
+
collection do
|
16
|
+
match 'api', via: [ :get, :post ]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# login/logout
|
21
|
+
get 'login' => 'sessions#new'
|
22
|
+
post 'login' => 'sessions#create'
|
23
|
+
delete 'logout' => 'sessions#destroy'
|
24
|
+
|
25
|
+
# account activation route
|
26
|
+
get 'activate/:id' => 'account_activations#edit', as: :edit_account_activation
|
27
|
+
|
28
|
+
# password reset routes
|
29
|
+
resources :password_resets, only: [ :new, :create, :edit, :update ]
|
30
|
+
|
31
|
+
# contact routes
|
32
|
+
get 'contact' => 'contact#new'
|
33
|
+
post 'contact' => 'contact#create'
|
34
|
+
|
35
|
+
# access groups
|
36
|
+
resources :access_groups do
|
37
|
+
member do
|
38
|
+
post 'locate'
|
39
|
+
end
|
40
|
+
collection do
|
41
|
+
match 'api', via: [ :get, :post ]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# security
|
46
|
+
get 'security' => 'security#index', as: :index_security
|
47
|
+
get 'security/:id' => 'security#show', as: :security
|
48
|
+
match 'security/:id' => 'security#update', via: [ :patch, :put ]
|
49
|
+
get 'security/:id/edit' => 'security#edit', as: :edit_security
|
50
|
+
post 'security/:id/locate' => 'security#locate', as: :locate_security
|
51
|
+
match 'security/api' => 'security#api', via: [ :get, :post ], as: :api_security
|
52
|
+
|
53
|
+
if Rails.env.test?
|
54
|
+
get 'test/require_anon' => 'access_test#test_require_anon', as: :test_require_anon
|
55
|
+
get 'test/allow_anon' => 'access_test#test_allow_anon', as: :test_allow_anon
|
56
|
+
get 'test/require_admin' => 'access_test#test_require_admin', as: :test_require_admin
|
57
|
+
get 'test/require_user' => 'access_test#test_require_user', as: :test_require_user
|
58
|
+
get 'test/require_group' => 'access_test#test_require_group', as: :test_require_group
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class CreateInclineUsers < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :incline_users do |t|
|
4
|
+
t.string :name, null: false, limit: 100
|
5
|
+
t.string :email, null: false, limit: 250
|
6
|
+
t.boolean :activated, null: false, default: false
|
7
|
+
t.boolean :enabled, null: false, default: true
|
8
|
+
t.boolean :system_admin, null: false, default: false
|
9
|
+
t.string :activation_digest, limit: 100
|
10
|
+
t.string :password_digest, limit: 100
|
11
|
+
t.string :remember_digest, limit: 100
|
12
|
+
t.string :reset_digest, limit: 100
|
13
|
+
t.datetime :activated_at
|
14
|
+
t.datetime :reset_sent_at
|
15
|
+
t.string :disabled_by, limit: 250
|
16
|
+
t.datetime :disabled_at
|
17
|
+
t.string :disabled_reason, limit: 200
|
18
|
+
t.datetime :last_login_at
|
19
|
+
t.string :last_login_ip, limit: 64
|
20
|
+
|
21
|
+
t.timestamps null: false
|
22
|
+
end
|
23
|
+
add_index :incline_users, :email, unique: true, name: 'ux_incline_users_email'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class CreateInclineAccessGroups < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :incline_access_groups do |t|
|
4
|
+
t.string :name, null: false, limit: 100
|
5
|
+
|
6
|
+
t.timestamps null: false
|
7
|
+
end
|
8
|
+
add_index :incline_access_groups, :name, unique: true, name: 'ux_incline_access_groups_name'
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class CreateInclineUserLoginHistories < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :incline_user_login_histories do |t|
|
4
|
+
t.belongs_to :user, null: false, index: true, foreign_key: true
|
5
|
+
t.string :ip_address, null: false, limit: 64
|
6
|
+
t.boolean :successful
|
7
|
+
t.string :message, limit: 200
|
8
|
+
|
9
|
+
t.timestamps null: false
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class CreateInclineAccessGroupUserMembers < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :incline_access_group_user_members do |t|
|
4
|
+
t.integer :group_id, null: false, index: true
|
5
|
+
t.integer :member_id, null: false, index: true
|
6
|
+
|
7
|
+
t.timestamps null: false
|
8
|
+
end
|
9
|
+
add_index :incline_access_group_user_members, [ :group_id, :member_id ], unique: true, name: 'ux_incline_access_group_user_members'
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class CreateInclineAccessGroupGroupMembers < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :incline_access_group_group_members do |t|
|
4
|
+
t.integer :group_id, null: false, index: true
|
5
|
+
t.integer :member_id, null: false, index: true
|
6
|
+
|
7
|
+
t.timestamps null: false
|
8
|
+
end
|
9
|
+
add_index :incline_access_group_group_members, [ :group_id, :member_id ], unique: true, name: 'ux_incline_access_group_group_members'
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class CreateInclineActionSecurities < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :incline_action_securities do |t|
|
4
|
+
t.string :controller_name, null: false, limit: 200
|
5
|
+
t.string :action_name, null: false, limit: 200
|
6
|
+
t.text :path, null: false
|
7
|
+
t.boolean :allow_anon
|
8
|
+
t.boolean :require_anon
|
9
|
+
t.boolean :require_admin
|
10
|
+
t.boolean :unknown_controller
|
11
|
+
|
12
|
+
t.timestamps null: false
|
13
|
+
end
|
14
|
+
add_index :incline_action_securities, [:controller_name, :action_name ], unique: true, name: 'ux_incline_action_securities'
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class CreateInclineActionGroups < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :incline_action_groups do |t|
|
4
|
+
t.belongs_to :action_security, null: false, index: true, foreign_key: true
|
5
|
+
t.belongs_to :access_group, null: false, index: true, foreign_key: true
|
6
|
+
|
7
|
+
t.timestamps null: false
|
8
|
+
end
|
9
|
+
add_index :incline_action_groups, [ :action_security_id, :access_group_id ], unique: true, name: 'ux_incline_action_groups'
|
10
|
+
end
|
11
|
+
end
|
data/db/seeds.rb
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'securerandom'
|
2
|
+
|
3
|
+
Incline::Recaptcha::pause_for do
|
4
|
+
|
5
|
+
Incline::User::ensure_admin_exists!
|
6
|
+
|
7
|
+
# For development purposes, we want to add a bunch of enabled users and a handful of disabled users.
|
8
|
+
if Rails.env.development?
|
9
|
+
admin_user = Incline::User.where(system_admin: true, enabled: true).first
|
10
|
+
unless Incline::User.where(enabled: true).count >= 100
|
11
|
+
print "Creating enabled test users...\n"
|
12
|
+
100.times do |n|
|
13
|
+
name = Faker::Name.name
|
14
|
+
email = "user-#{n+1}@example.com"
|
15
|
+
password = 'password'
|
16
|
+
r = SecureRandom.random_number
|
17
|
+
activated = (r < 0.8) ? (5 + (r * 25).to_i).days.ago : nil
|
18
|
+
created = (activated ? activated : (5 + (r * 25).to_i).days.ago) - 1.hour
|
19
|
+
|
20
|
+
u = Incline::User.create!(
|
21
|
+
name: name,
|
22
|
+
email: email,
|
23
|
+
password: password,
|
24
|
+
password_confirmation: password,
|
25
|
+
activated: !!activated,
|
26
|
+
activated_at: activated,
|
27
|
+
created_at: created,
|
28
|
+
recaptcha: 'na'
|
29
|
+
)
|
30
|
+
if activated
|
31
|
+
hist =
|
32
|
+
if SecureRandom.random_number < 0.25
|
33
|
+
:fail
|
34
|
+
elsif SecureRandom.random_number < 0.5
|
35
|
+
:mix
|
36
|
+
else
|
37
|
+
:success
|
38
|
+
end
|
39
|
+
|
40
|
+
r += 0.2 if r < 0.2
|
41
|
+
while activated < Time.now
|
42
|
+
|
43
|
+
success,message = if hist == :fail
|
44
|
+
[ false, 'Invalid email or password.' ]
|
45
|
+
elsif hist == :success
|
46
|
+
[ true, 'User logged in successfully.' ]
|
47
|
+
elsif SecureRandom.random_number <= 0.5
|
48
|
+
[ false, 'Invalid email or password.' ]
|
49
|
+
else
|
50
|
+
[ true, 'User logged in successfully.' ]
|
51
|
+
end
|
52
|
+
|
53
|
+
u.login_histories.create!(ip_address: '127.0.0.1', successful: success, message: message, created_at: activated)
|
54
|
+
|
55
|
+
activated += r.days
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
unless Incline::User.where(enabled: false).count >= 5
|
61
|
+
print "Creating disabled test users...\n"
|
62
|
+
5.times do |n|
|
63
|
+
name = Faker::Name.name
|
64
|
+
email = "disabled-#{n+1}@example.com"
|
65
|
+
password = 'password'
|
66
|
+
u = Incline::User.create!(
|
67
|
+
name: name,
|
68
|
+
email: email,
|
69
|
+
password: password,
|
70
|
+
password_confirmation: password,
|
71
|
+
enabled: false,
|
72
|
+
disabled_by: admin_user.email,
|
73
|
+
disabled_at: ((n * 2.5).to_i + 1).days.ago,
|
74
|
+
disabled_reason: 'For testing',
|
75
|
+
recaptcha: 'na'
|
76
|
+
)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
data/exe/new_incline_app
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
##
|
4
|
+
# Script to generate a new rails app using the Incline gem.
|
5
|
+
|
6
|
+
if Object.const_defined?(:Rails)
|
7
|
+
|
8
|
+
## Template for 'rails new' ##
|
9
|
+
require 'incline/version'
|
10
|
+
|
11
|
+
# Add the incline gem.
|
12
|
+
gem 'incline', "~> #{Incline::VERSION}"
|
13
|
+
|
14
|
+
# Install the gem.
|
15
|
+
run 'bundle install'
|
16
|
+
|
17
|
+
# Add a root route.
|
18
|
+
route "root 'incline/welcome#home'"
|
19
|
+
|
20
|
+
# Perform the Incline install.
|
21
|
+
generate 'incline:install'
|
22
|
+
|
23
|
+
# Create & migrate the db.
|
24
|
+
run 'rake db:migrate', capture: true
|
25
|
+
|
26
|
+
# Initialize git repo and push to github.
|
27
|
+
run 'git init', capture: true
|
28
|
+
run 'git add -A', capture: true
|
29
|
+
run 'git commit -m "Initialize repo"', capture: true
|
30
|
+
|
31
|
+
else
|
32
|
+
|
33
|
+
if ARGV.count < 1
|
34
|
+
puts "Usage: $0 app_name [rails-options]\n"
|
35
|
+
else
|
36
|
+
args = %w(rails new)
|
37
|
+
args += ARGV.to_a
|
38
|
+
args += [ '-m', File.expand_path(__FILE__), '--skip-turbolinks', '--skip-spring', '--skip-bundle' ]
|
39
|
+
Kernel.exec *args
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,259 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
|
3
|
+
module Incline
|
4
|
+
|
5
|
+
class InstallGenerator < ::Rails::Generators::Base
|
6
|
+
|
7
|
+
desc "This generator will update your application for use with the Incline gem."
|
8
|
+
|
9
|
+
class_option :mount_path, type: :string, default: 'incline', desc: 'Determines where the Incline engine will mount its routes.'
|
10
|
+
class_option :force_copy, type: :boolean, default: true, desc: 'Determines if certain files will be forcibly copied.'
|
11
|
+
class_option :json_logger, type: :boolean, default: true, desc: 'Determines if the JSON logger should be enabled.'
|
12
|
+
|
13
|
+
source_root File.expand_path('../templates', __FILE__)
|
14
|
+
|
15
|
+
def install_module
|
16
|
+
|
17
|
+
mount_path = options[:mount_path] || 'incline'
|
18
|
+
# trim off leading '/', './', or '../'.
|
19
|
+
# also trim off trailing '/'.
|
20
|
+
mount_path = mount_path.to_s.gsub('\\','/').gsub(/^\.*\//, '').gsub(/\/+$/, '')
|
21
|
+
mount_path = 'incline' if mount_path.blank?
|
22
|
+
@mount_path = '/' + mount_path
|
23
|
+
|
24
|
+
copy_files
|
25
|
+
add_version
|
26
|
+
config_app
|
27
|
+
config_logger if options[:json_logger]
|
28
|
+
config_routes
|
29
|
+
config_gitignore
|
30
|
+
config_secrets
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def copy_files
|
38
|
+
# We just copy these files outright because they override the default behaviors and shouldn't need modification
|
39
|
+
force = options[:force_copy] ? { force: true } : { skip: true }
|
40
|
+
{
|
41
|
+
'incline_application.js' => 'app/assets/javascripts/application.js',
|
42
|
+
'incline_application.css' => 'app/assets/stylesheets/application.css',
|
43
|
+
'incline_application.html.erb' => 'app/views/layouts/application.html.erb',
|
44
|
+
'incline_mailer.html.erb' => 'app/views/layouts/mailer.html.erb',
|
45
|
+
'incline_mailer.text.erb' => 'app/views/layouts/mailer.text.erb',
|
46
|
+
'incline_users.yml' => 'test/fixtures/incline/users.yml',
|
47
|
+
}.each do |source,destination|
|
48
|
+
copy_file source, destination, force
|
49
|
+
end
|
50
|
+
|
51
|
+
# We copy these files if they don't exist.
|
52
|
+
{
|
53
|
+
'incline_email.yml' => 'config/email.yml',
|
54
|
+
'incline_database.yml' => 'config/database.yml',
|
55
|
+
'_app_menu_anon.html.erb' => 'app/views/layouts/incline/_app_menu_anon.html.erb',
|
56
|
+
'_app_menu_authenticated.html.erb' => 'app/views/layouts/incline/_app_menu_authenticated.html.erb',
|
57
|
+
}.each do |source,destination|
|
58
|
+
copy_file source, destination, skip: true
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def config_app
|
63
|
+
if File.exist?('config/application.rb')
|
64
|
+
contents = File.read('config/application.rb')
|
65
|
+
changed = false
|
66
|
+
unless contents =~ /def\s+app_name\s/ && contents =~ /def\s+app_version\s/
|
67
|
+
match = (/module\s+([a-z0-9_:]*)\s+class\s+application/i).match(File.read('config/application.rb'))
|
68
|
+
if match
|
69
|
+
new_data = ''
|
70
|
+
unless contents =~ /def\s+app_name\s/
|
71
|
+
new_data += <<-EOD
|
72
|
+
|
73
|
+
# This is your application name. Set it as appropriate.
|
74
|
+
def app_name
|
75
|
+
"#{match[1]}"
|
76
|
+
end
|
77
|
+
|
78
|
+
EOD
|
79
|
+
end
|
80
|
+
unless contents =~ /def\s+app_version\s/
|
81
|
+
new_data += <<-EOD
|
82
|
+
|
83
|
+
# This is your application version. Change it in 'version.rb'.
|
84
|
+
def app_version
|
85
|
+
#{match[1]}::VERSION
|
86
|
+
end
|
87
|
+
|
88
|
+
EOD
|
89
|
+
end
|
90
|
+
changed = true
|
91
|
+
insert_into_file 'config/application.rb', new_data, after: /class\s+Application\s+<\s+(::)?Rails::Application\n/m
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
unless contents =~ /require_relative\s*['"]\.\/version['"]/
|
96
|
+
changed = true
|
97
|
+
prepend_to_file 'config/application.rb', "require_relative './version'\n"
|
98
|
+
end
|
99
|
+
|
100
|
+
unless changed
|
101
|
+
say_status :ok, 'config/application.rb', :blue
|
102
|
+
end
|
103
|
+
else
|
104
|
+
say_status :missing, 'config/application.rb', :red
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def add_version
|
109
|
+
# Make sure a version.rb file exists.
|
110
|
+
template 'incline_version.rb', 'config/version.rb', skip: true
|
111
|
+
end
|
112
|
+
|
113
|
+
def config_logger
|
114
|
+
# Change the production environment to use JsonLogFormatter instead of Logger::Formatter
|
115
|
+
# NOTE: We are switching to using Incline::JsonLogger but we will leave this gsub in place
|
116
|
+
# to keep the options open for the end user (if they want to change loggers, but use the same formatter).
|
117
|
+
# The log formatter must be set after the logger.
|
118
|
+
gsub_file 'config/environments/production.rb', /\n\s*config\.log_formatter\s*=\s*(::)?Logger::Formatter.new/m, <<-EOS
|
119
|
+
|
120
|
+
# config.log_formatter = ::Logger::Formatter.new
|
121
|
+
|
122
|
+
# Incline::JsonLogFormatter also includes the PID and timestamp, plus it makes the log easier to parse.
|
123
|
+
# If you want to revert to using the standard formatter above, uncomment that line and comment out this line instead.
|
124
|
+
config.log_formatter = ::Incline::JsonLogFormatter.new
|
125
|
+
EOS
|
126
|
+
|
127
|
+
%w(config/environments/development.rb config/environments/test.rb config/environments/production.rb).each do |cfg|
|
128
|
+
if File.exist?(cfg)
|
129
|
+
contents = File.read(cfg)
|
130
|
+
|
131
|
+
if contents =~ /\n\s*config.logger\s*=/m
|
132
|
+
# a logger is already explicitly configured.
|
133
|
+
say_status :ok, cfg, :blue
|
134
|
+
elsif contents =~ /\n\s*config.log_formatter\s*=/m
|
135
|
+
# a log formatter is configured, so configure a logger with rotation and use the existing formatter.
|
136
|
+
gsub_file cfg, /\n\s*config.log_formatter\s*=([^\n]*)/m, <<-EOS
|
137
|
+
|
138
|
+
config.logger = ::ActiveSupport::Logger(config.paths['log'].first, 2, 5.megabytes)
|
139
|
+
config.logger.formatter =\\1
|
140
|
+
EOS
|
141
|
+
else
|
142
|
+
# no log formatter or logger is configured, so configure a JsonLogger with rotation.
|
143
|
+
insert_into_file cfg, "\n config.logger = ::Incline::JsonLogger.new(config.paths['log'].first, 2, 5.megabytes)\n", before: /end\s*\Z/m
|
144
|
+
end
|
145
|
+
else
|
146
|
+
say_status :missing, cfg, :red
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def config_routes
|
152
|
+
if File.exist?('config/routes.rb')
|
153
|
+
contents = File.read('config/routes.rb')
|
154
|
+
if contents =~ /mount\s*(::)?Incline::Engine/
|
155
|
+
say_status :ok, 'config/routes.rb', :blue
|
156
|
+
else
|
157
|
+
insert_into_file 'config/routes.rb', "\n mount ::Incline::Engine => #{@mount_path.inspect}\n", after: /routes\.draw\s*(do|\{)/
|
158
|
+
end
|
159
|
+
else
|
160
|
+
say_status :missing, 'config/routes.rb', :red
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def config_gitignore
|
165
|
+
if File.exist?('.gitignore')
|
166
|
+
contents = File.read('.gitignore')
|
167
|
+
changed = false
|
168
|
+
|
169
|
+
unless contents =~ /^\*\*\/\.byebug\*$/
|
170
|
+
changed = true
|
171
|
+
append_to_file '.gitignore', "\n**/.byebug*\n"
|
172
|
+
end
|
173
|
+
|
174
|
+
unless contents =~ /^config\/secrets\.yml$/
|
175
|
+
changed = true
|
176
|
+
append_to_file '.gitignore', "\nconfig/secrets.yml\n"
|
177
|
+
end
|
178
|
+
|
179
|
+
unless changed
|
180
|
+
say_status :ok, '.gitignore', :blue
|
181
|
+
end
|
182
|
+
else
|
183
|
+
unless options[:pretend]
|
184
|
+
File.write '.gitignore', <<-EOF
|
185
|
+
**/.byebug*
|
186
|
+
.bundle/
|
187
|
+
config/secrets.yml
|
188
|
+
db/*.sqlite3
|
189
|
+
db/*.sqlite3-journal
|
190
|
+
log/*.log
|
191
|
+
tmp/
|
192
|
+
vendor/bundle/
|
193
|
+
EOF
|
194
|
+
end
|
195
|
+
say_status :create, '.gitignore', :green
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
def config_secrets
|
200
|
+
if File.exist?('config/secrets.yml')
|
201
|
+
contents = File.read('config/secrets.yml')
|
202
|
+
changed = false
|
203
|
+
missing_alias = /^(default:\s*\n)/m
|
204
|
+
valid_alias = /^default:\s+&default\s*\n/m
|
205
|
+
|
206
|
+
unless contents =~ valid_alias
|
207
|
+
if contents =~ missing_alias
|
208
|
+
# section exists, but is missing the &default label
|
209
|
+
flag = $1
|
210
|
+
changed = true
|
211
|
+
contents.gsub! /^#{flag}/, "default: &default\n"
|
212
|
+
else
|
213
|
+
# section does not exist.
|
214
|
+
changed = true
|
215
|
+
to_insert = <<-EOF
|
216
|
+
default: &default
|
217
|
+
# define your recaptcha keys.
|
218
|
+
recaptcha_public:
|
219
|
+
recaptcha_private:
|
220
|
+
# define your email credentials.
|
221
|
+
email:
|
222
|
+
user: no-reply@example.com
|
223
|
+
password: MySecretPassword
|
224
|
+
|
225
|
+
EOF
|
226
|
+
|
227
|
+
contents = to_insert + contents
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
# now ensure the three environments are set to inherit from default.
|
232
|
+
%w(development test production).each do |section|
|
233
|
+
missing_alias = /^(#{section}:\s*\n)/m
|
234
|
+
valid_alias = /^#{section}:\s*\n <<:\s*\*default\s*\n/m
|
235
|
+
unless contents =~ valid_alias
|
236
|
+
if contents =~ missing_alias
|
237
|
+
flag = $1
|
238
|
+
changed = true
|
239
|
+
contents.gsub! /^#{flag}/, "\\0 <<: *default\n"
|
240
|
+
else
|
241
|
+
say_status :missing, "config/secrets.yml [#{section}]", :red
|
242
|
+
end
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
if changed
|
247
|
+
unless options[:pretend]
|
248
|
+
File.write 'config/secrets.yml', contents
|
249
|
+
end
|
250
|
+
say_status :modify, 'config/secrets.yml', :green
|
251
|
+
else
|
252
|
+
say_status :ok, 'config/secrets.yml', :blue
|
253
|
+
end
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
|
258
|
+
end
|
259
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
<!-- add list items <li> to build the menu for anonymous and authenticated users -->
|
@@ -0,0 +1 @@
|
|
1
|
+
<!-- add list items <li> to build the menu for authenticated users -->
|