ucb_rails_user 0.9.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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +166 -0
- data/Rakefile +36 -0
- data/app/assets/config/ucb_rails_user_manifest.js +0 -0
- data/app/assets/javascripts/ucb_rails_user/datatables.js +15441 -0
- data/app/assets/javascripts/ucb_rails_user/scripts.js +15 -0
- data/app/assets/javascripts/ucb_rails_user/ucb_rails_user.js +39 -0
- data/app/assets/stylesheets/ucb_rails_user/components/_add_users_search_results_table.sass +2 -0
- data/app/assets/stylesheets/ucb_rails_user/components/_loader.sass +46 -0
- data/app/assets/stylesheets/ucb_rails_user/components/_users_table.sass +10 -0
- data/app/assets/stylesheets/ucb_rails_user/datatables.css +201 -0
- data/app/assets/stylesheets/ucb_rails_user/main.sass +2 -0
- data/app/assets/stylesheets/ucb_rails_user/styles.css +19 -0
- data/app/controllers/ucb_rails_user/concerns/controller_methods.rb +92 -0
- data/app/controllers/ucb_rails_user/concerns/home_controller.rb +17 -0
- data/app/controllers/ucb_rails_user/concerns/sessions_controller.rb +68 -0
- data/app/controllers/ucb_rails_user/concerns/users_controller.rb +132 -0
- data/app/controllers/ucb_rails_user/home_controller.rb +10 -0
- data/app/controllers/ucb_rails_user/sessions_controller.rb +9 -0
- data/app/controllers/ucb_rails_user/users_controller.rb +8 -0
- data/app/helpers/ucb_rails_user/users_helper.rb +18 -0
- data/app/helpers/ucb_rails_user_helper.rb +17 -0
- data/app/models/concerns/user_concerns.rb +53 -0
- data/app/models/ucb_rails_user/configuration/cas.rb +53 -0
- data/app/models/ucb_rails_user/configuration/configuration.rb +72 -0
- data/app/models/ucb_rails_user/configuration/email.rb +73 -0
- data/app/models/ucb_rails_user/configuration/exception_notification.rb +21 -0
- data/app/models/ucb_rails_user/configuration/ldap.rb +50 -0
- data/app/models/ucb_rails_user/ldap_person/entry.rb +62 -0
- data/app/models/ucb_rails_user/ldap_person/finder.rb +87 -0
- data/app/models/ucb_rails_user/ldap_person/test_finder.rb +57 -0
- data/app/models/ucb_rails_user/user_ldap_service.rb +65 -0
- data/app/models/ucb_rails_user/user_session_manager/active_in_user_table.rb +29 -0
- data/app/models/ucb_rails_user/user_session_manager/admin_in_user_table.rb +13 -0
- data/app/models/ucb_rails_user/user_session_manager/base.rb +54 -0
- data/app/models/ucb_rails_user/user_session_manager/in_people_ou.rb +27 -0
- data/app/models/ucb_rails_user/user_session_manager/in_people_ou_add_to_users_table.rb +21 -0
- data/app/models/ucb_rails_user/user_session_manager/ldap_person_user_wrapper.rb +29 -0
- data/app/models/user.rb +8 -0
- data/app/views/ucb_rails_user/home/logged_in.html.haml +5 -0
- data/app/views/ucb_rails_user/home/not_logged_in.html.haml +5 -0
- data/app/views/ucb_rails_user/lps/_form.html.haml +19 -0
- data/app/views/ucb_rails_user/lps/_modal.html.haml +9 -0
- data/app/views/ucb_rails_user/lps/_results.html.haml +34 -0
- data/app/views/ucb_rails_user/lps/search.js.haml +3 -0
- data/app/views/ucb_rails_user/users/_form.html.haml +14 -0
- data/app/views/ucb_rails_user/users/_search_results.html.haml +24 -0
- data/app/views/ucb_rails_user/users/_user.html.haml +12 -0
- data/app/views/ucb_rails_user/users/edit.html.haml +3 -0
- data/app/views/ucb_rails_user/users/index.html.haml +23 -0
- data/app/views/ucb_rails_user/users/new.html.haml +16 -0
- data/app/views/ucb_rails_user/users/search.js.haml +4 -0
- data/config/initializers/simple_form.rb +171 -0
- data/config/initializers/simple_form_bootstrap.rb +154 -0
- data/config/locales/simple_form.en.yml +31 -0
- data/config/routes.rb +20 -0
- data/db/migrate/20170324221936_create_users.rb +29 -0
- data/lib/tasks/ucb_rails_user_tasks.rake +4 -0
- data/lib/templates/erb/scaffold/_form.html.erb +13 -0
- data/lib/ucb_rails_user.rb +21 -0
- data/lib/ucb_rails_user/engine.rb +28 -0
- data/lib/ucb_rails_user/version.rb +3 -0
- metadata +277 -0
@@ -0,0 +1,15 @@
|
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
2
|
+
// listed below.
|
3
|
+
//
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, or any plugin's
|
5
|
+
// vendor/assets/javascripts directory can be referenced here using a relative path.
|
6
|
+
//
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
8
|
+
// compiled file. JavaScript code in this file should be added after the last require_* statement.
|
9
|
+
//
|
10
|
+
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
|
11
|
+
// about supported directives.
|
12
|
+
//
|
13
|
+
//= require rails-ujs
|
14
|
+
//= require_tree .
|
15
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
// the users table has width set to auto, but the pagination tries to stretch to full width - this
|
2
|
+
// forces the pagination to match the table
|
3
|
+
var resizePagination = function () {
|
4
|
+
var paginationDiv = $('.dataTables_info').parents('.row').first()
|
5
|
+
paginationDiv.width($('.dataTable').width())
|
6
|
+
}
|
7
|
+
|
8
|
+
var addDatatablesToSearchResults = function () {
|
9
|
+
$('.add-user-search-results-table').dataTable({
|
10
|
+
searching: false,
|
11
|
+
order: [[ 2, "asc" ]],
|
12
|
+
columnDefs: [ {
|
13
|
+
targets: 3,
|
14
|
+
orderable: false
|
15
|
+
}]
|
16
|
+
})
|
17
|
+
resizePagination()
|
18
|
+
}
|
19
|
+
|
20
|
+
var addDatatablesToUsersTable = function () {
|
21
|
+
$('.ucb-rails-users-table').dataTable({
|
22
|
+
searching: true,
|
23
|
+
order: [[ 3, "asc" ]],
|
24
|
+
columnDefs: [ {
|
25
|
+
targets: [8, 9],
|
26
|
+
orderable: false
|
27
|
+
}]
|
28
|
+
})
|
29
|
+
}
|
30
|
+
|
31
|
+
$( window ).on("load", function() {
|
32
|
+
// the datatable calling was failing intermittently, but adding the timeout
|
33
|
+
// seemed to fix it, so ¯\_(ツ)_/¯
|
34
|
+
window.setTimeout(addDatatablesToUsersTable, 100)
|
35
|
+
|
36
|
+
$('.user-search-form').on('submit', function() {
|
37
|
+
$('.ucb-rails-user-loader').show()
|
38
|
+
})
|
39
|
+
})
|
@@ -0,0 +1,46 @@
|
|
1
|
+
.ucb-rails-user-loader,
|
2
|
+
.ucb-rails-user-loader:after
|
3
|
+
border-radius: 50%
|
4
|
+
width: 6em
|
5
|
+
height: 6em
|
6
|
+
|
7
|
+
.ucb-rails-user-loader
|
8
|
+
display: none
|
9
|
+
margin: 60px auto
|
10
|
+
font-size: 10px
|
11
|
+
position: relative
|
12
|
+
text-indent: -9999em
|
13
|
+
border-top: .8em solid rgba(0,50,97, 0.2)
|
14
|
+
border-right: .8em solid rgba(0,50,97, 0.2)
|
15
|
+
border-bottom: .8em solid rgba(0,50,97, 0.2)
|
16
|
+
border-left: .8em solid #003261
|
17
|
+
-webkit-transform: translateZ(0)
|
18
|
+
-ms-transform: translateZ(0)
|
19
|
+
transform: translateZ(0)
|
20
|
+
-webkit-animation: load8 1.1s infinite linear
|
21
|
+
animation: load8 1.1s infinite linear
|
22
|
+
|
23
|
+
@-webkit-keyframes load8
|
24
|
+
0%
|
25
|
+
-webkit-transform: rotate(0deg)
|
26
|
+
transform: rotate(0deg)
|
27
|
+
|
28
|
+
100%
|
29
|
+
-webkit-transform: rotate(360deg)
|
30
|
+
transform: rotate(360deg)
|
31
|
+
|
32
|
+
|
33
|
+
@keyframes load8
|
34
|
+
0%
|
35
|
+
-webkit-transform: rotate(0deg)
|
36
|
+
transform: rotate(0deg)
|
37
|
+
|
38
|
+
100%
|
39
|
+
-webkit-transform: rotate(360deg)
|
40
|
+
transform: rotate(360deg)
|
41
|
+
|
42
|
+
.ucb-rails-user-loader-small
|
43
|
+
margin: 16px
|
44
|
+
font-size: 6px
|
45
|
+
|
46
|
+
|
@@ -0,0 +1,201 @@
|
|
1
|
+
/*
|
2
|
+
* This combined file was created by the DataTables downloader builder:
|
3
|
+
* https://datatables.net/download
|
4
|
+
*
|
5
|
+
* To rebuild or modify this file with the latest versions of the included
|
6
|
+
* software please visit:
|
7
|
+
* https://datatables.net/download/#bs/dt-1.10.16
|
8
|
+
*
|
9
|
+
* Included libraries:
|
10
|
+
* DataTables 1.10.16
|
11
|
+
*/
|
12
|
+
|
13
|
+
table.dataTable {
|
14
|
+
clear: both;
|
15
|
+
margin-top: 6px !important;
|
16
|
+
margin-bottom: 6px !important;
|
17
|
+
max-width: none !important;
|
18
|
+
border-collapse: separate !important;
|
19
|
+
}
|
20
|
+
table.dataTable td,
|
21
|
+
table.dataTable th {
|
22
|
+
-webkit-box-sizing: content-box;
|
23
|
+
box-sizing: content-box;
|
24
|
+
}
|
25
|
+
table.dataTable td.dataTables_empty,
|
26
|
+
table.dataTable th.dataTables_empty {
|
27
|
+
text-align: center;
|
28
|
+
}
|
29
|
+
table.dataTable.nowrap th,
|
30
|
+
table.dataTable.nowrap td {
|
31
|
+
white-space: nowrap;
|
32
|
+
}
|
33
|
+
|
34
|
+
div.dataTables_wrapper div.dataTables_length label {
|
35
|
+
font-weight: normal;
|
36
|
+
text-align: left;
|
37
|
+
white-space: nowrap;
|
38
|
+
}
|
39
|
+
div.dataTables_wrapper div.dataTables_length select {
|
40
|
+
width: 75px;
|
41
|
+
display: inline-block;
|
42
|
+
}
|
43
|
+
div.dataTables_wrapper div.dataTables_filter {
|
44
|
+
text-align: right;
|
45
|
+
}
|
46
|
+
div.dataTables_wrapper div.dataTables_filter label {
|
47
|
+
font-weight: normal;
|
48
|
+
white-space: nowrap;
|
49
|
+
text-align: left;
|
50
|
+
}
|
51
|
+
div.dataTables_wrapper div.dataTables_filter input {
|
52
|
+
margin-left: 0.5em;
|
53
|
+
display: inline-block;
|
54
|
+
width: auto;
|
55
|
+
}
|
56
|
+
div.dataTables_wrapper div.dataTables_info {
|
57
|
+
padding-top: 8px;
|
58
|
+
white-space: nowrap;
|
59
|
+
}
|
60
|
+
div.dataTables_wrapper div.dataTables_paginate {
|
61
|
+
margin: 0;
|
62
|
+
white-space: nowrap;
|
63
|
+
text-align: right;
|
64
|
+
}
|
65
|
+
div.dataTables_wrapper div.dataTables_paginate ul.pagination {
|
66
|
+
margin: 2px 0;
|
67
|
+
white-space: nowrap;
|
68
|
+
}
|
69
|
+
div.dataTables_wrapper div.dataTables_processing {
|
70
|
+
position: absolute;
|
71
|
+
top: 50%;
|
72
|
+
left: 50%;
|
73
|
+
width: 200px;
|
74
|
+
margin-left: -100px;
|
75
|
+
margin-top: -26px;
|
76
|
+
text-align: center;
|
77
|
+
padding: 1em 0;
|
78
|
+
}
|
79
|
+
|
80
|
+
table.dataTable thead > tr > th.sorting_asc, table.dataTable thead > tr > th.sorting_desc, table.dataTable thead > tr > th.sorting,
|
81
|
+
table.dataTable thead > tr > td.sorting_asc,
|
82
|
+
table.dataTable thead > tr > td.sorting_desc,
|
83
|
+
table.dataTable thead > tr > td.sorting {
|
84
|
+
padding-right: 30px;
|
85
|
+
}
|
86
|
+
table.dataTable thead > tr > th:active,
|
87
|
+
table.dataTable thead > tr > td:active {
|
88
|
+
outline: none;
|
89
|
+
}
|
90
|
+
table.dataTable thead .sorting,
|
91
|
+
table.dataTable thead .sorting_asc,
|
92
|
+
table.dataTable thead .sorting_desc,
|
93
|
+
table.dataTable thead .sorting_asc_disabled,
|
94
|
+
table.dataTable thead .sorting_desc_disabled {
|
95
|
+
cursor: pointer;
|
96
|
+
position: relative;
|
97
|
+
}
|
98
|
+
table.dataTable thead .sorting:after,
|
99
|
+
table.dataTable thead .sorting_asc:after,
|
100
|
+
table.dataTable thead .sorting_desc:after,
|
101
|
+
table.dataTable thead .sorting_asc_disabled:after,
|
102
|
+
table.dataTable thead .sorting_desc_disabled:after {
|
103
|
+
position: absolute;
|
104
|
+
bottom: 8px;
|
105
|
+
right: 8px;
|
106
|
+
display: block;
|
107
|
+
font-family: 'Glyphicons Halflings';
|
108
|
+
opacity: 0.5;
|
109
|
+
}
|
110
|
+
table.dataTable thead .sorting:after {
|
111
|
+
opacity: 0.2;
|
112
|
+
content: "\e150";
|
113
|
+
/* sort */
|
114
|
+
}
|
115
|
+
table.dataTable thead .sorting_asc:after {
|
116
|
+
content: "\e155";
|
117
|
+
/* sort-by-attributes */
|
118
|
+
}
|
119
|
+
table.dataTable thead .sorting_desc:after {
|
120
|
+
content: "\e156";
|
121
|
+
/* sort-by-attributes-alt */
|
122
|
+
}
|
123
|
+
table.dataTable thead .sorting_asc_disabled:after,
|
124
|
+
table.dataTable thead .sorting_desc_disabled:after {
|
125
|
+
color: #eee;
|
126
|
+
}
|
127
|
+
|
128
|
+
div.dataTables_scrollHead table.dataTable {
|
129
|
+
margin-bottom: 0 !important;
|
130
|
+
}
|
131
|
+
|
132
|
+
div.dataTables_scrollBody > table {
|
133
|
+
border-top: none;
|
134
|
+
margin-top: 0 !important;
|
135
|
+
margin-bottom: 0 !important;
|
136
|
+
}
|
137
|
+
div.dataTables_scrollBody > table > thead .sorting:after,
|
138
|
+
div.dataTables_scrollBody > table > thead .sorting_asc:after,
|
139
|
+
div.dataTables_scrollBody > table > thead .sorting_desc:after {
|
140
|
+
display: none;
|
141
|
+
}
|
142
|
+
div.dataTables_scrollBody > table > tbody > tr:first-child > th,
|
143
|
+
div.dataTables_scrollBody > table > tbody > tr:first-child > td {
|
144
|
+
border-top: none;
|
145
|
+
}
|
146
|
+
|
147
|
+
div.dataTables_scrollFoot > .dataTables_scrollFootInner {
|
148
|
+
box-sizing: content-box;
|
149
|
+
}
|
150
|
+
div.dataTables_scrollFoot > .dataTables_scrollFootInner > table {
|
151
|
+
margin-top: 0 !important;
|
152
|
+
border-top: none;
|
153
|
+
}
|
154
|
+
|
155
|
+
@media screen and (max-width: 767px) {
|
156
|
+
div.dataTables_wrapper div.dataTables_length,
|
157
|
+
div.dataTables_wrapper div.dataTables_filter,
|
158
|
+
div.dataTables_wrapper div.dataTables_info,
|
159
|
+
div.dataTables_wrapper div.dataTables_paginate {
|
160
|
+
text-align: center;
|
161
|
+
}
|
162
|
+
}
|
163
|
+
table.dataTable.table-condensed > thead > tr > th {
|
164
|
+
padding-right: 20px;
|
165
|
+
}
|
166
|
+
table.dataTable.table-condensed .sorting:after,
|
167
|
+
table.dataTable.table-condensed .sorting_asc:after,
|
168
|
+
table.dataTable.table-condensed .sorting_desc:after {
|
169
|
+
top: 6px;
|
170
|
+
right: 6px;
|
171
|
+
}
|
172
|
+
|
173
|
+
table.table-bordered.dataTable th,
|
174
|
+
table.table-bordered.dataTable td {
|
175
|
+
border-left-width: 0;
|
176
|
+
}
|
177
|
+
table.table-bordered.dataTable th:last-child, table.table-bordered.dataTable th:last-child,
|
178
|
+
table.table-bordered.dataTable td:last-child,
|
179
|
+
table.table-bordered.dataTable td:last-child {
|
180
|
+
border-right-width: 0;
|
181
|
+
}
|
182
|
+
table.table-bordered.dataTable tbody th,
|
183
|
+
table.table-bordered.dataTable tbody td {
|
184
|
+
border-bottom-width: 0;
|
185
|
+
}
|
186
|
+
|
187
|
+
div.dataTables_scrollHead table.table-bordered {
|
188
|
+
border-bottom-width: 0;
|
189
|
+
}
|
190
|
+
|
191
|
+
div.table-responsive > div.dataTables_wrapper > div.row {
|
192
|
+
margin: 0;
|
193
|
+
}
|
194
|
+
div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:first-child {
|
195
|
+
padding-left: 0;
|
196
|
+
}
|
197
|
+
div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:last-child {
|
198
|
+
padding-right: 0;
|
199
|
+
}
|
200
|
+
|
201
|
+
|
@@ -0,0 +1,19 @@
|
|
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 vendor/assets/stylesheets of plugins, if any, 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 top of the
|
9
|
+
* compiled file, but it's generally better to create a new file per style scope.
|
10
|
+
*
|
11
|
+
*= require_self
|
12
|
+
*
|
13
|
+
************************
|
14
|
+
* UCB: don't import stylesheets here - use ucb_rails_user.sass to take full advantage of Sass imports
|
15
|
+
* http://www.mattboldt.com/organizing-css-and-sass-rails/
|
16
|
+
*
|
17
|
+
*= require ucb_rails_user/main
|
18
|
+
*/
|
19
|
+
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module UcbRailsUser::Concerns::ControllerMethods
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
|
4
|
+
included do
|
5
|
+
rescue_from UcbRailsUser::LdapPerson::Finder::BlankSearchTermsError do
|
6
|
+
render :js => %(alert("Enter search terms"))
|
7
|
+
end
|
8
|
+
|
9
|
+
before_action :ensure_authenticated_user
|
10
|
+
before_action :log_request
|
11
|
+
|
12
|
+
after_action :remove_user_settings
|
13
|
+
|
14
|
+
helper_method :superuser?, :current_ldap_person, :current_user, :logged_in?
|
15
|
+
end
|
16
|
+
|
17
|
+
def superuser?
|
18
|
+
current_user.try(:superuser?)
|
19
|
+
end
|
20
|
+
|
21
|
+
def current_user
|
22
|
+
@current_user ||= begin
|
23
|
+
logger.debug 'recalc of current_user'
|
24
|
+
user_session_manager.current_user(session[:uid])
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Returns +true+ if there is a logged in user
|
29
|
+
#
|
30
|
+
# @return [true] if user logged in
|
31
|
+
# @return [false] if user not logged in
|
32
|
+
def logged_in?
|
33
|
+
current_user.present?
|
34
|
+
end
|
35
|
+
|
36
|
+
def log_request
|
37
|
+
UcbRailsUser::UserSessionManager::Base.current_user = current_user
|
38
|
+
user_session_manager.log_request(current_user)
|
39
|
+
end
|
40
|
+
|
41
|
+
def remove_user_settings
|
42
|
+
UcbRailsUser::UserSessionManager::Base.current_user = nil
|
43
|
+
end
|
44
|
+
|
45
|
+
# Returns an instance of UCB::LDAP::Person if there is a logged in user
|
46
|
+
#
|
47
|
+
# @return [UCB::LDAP::Person] if user logged in
|
48
|
+
# @return [nil] if user not logged in
|
49
|
+
def current_ldap_person
|
50
|
+
if logged_in?
|
51
|
+
@current_ldap_person ||= begin
|
52
|
+
logger.debug 'recalc of current_ldap_person'
|
53
|
+
user_session_manager.people_ou_entry(session[:uid])
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def ensure_admin_user
|
59
|
+
superuser? or not_authorized!
|
60
|
+
end
|
61
|
+
|
62
|
+
# Before filter that redirects redirects to +login_url+ unless user is logged in
|
63
|
+
#
|
64
|
+
# @return [nil]
|
65
|
+
def ensure_authenticated_user
|
66
|
+
unless session.has_key?(:uid)
|
67
|
+
session[:original_url] = request.env['REQUEST_URI']
|
68
|
+
redirect_to login_url
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def user_session_manager
|
73
|
+
@user_session_manager ||= begin
|
74
|
+
logger.debug "creating new user_session_manager"
|
75
|
+
klass = UcbRailsUser[:user_session_manager] || UcbRailsUser::UserSessionManager::ActiveInUserTable
|
76
|
+
klass.to_s.classify.constantize.new
|
77
|
+
end
|
78
|
+
rescue NameError
|
79
|
+
raise "Could not find UcbRailsUser user_session_manager: #{klass}"
|
80
|
+
end
|
81
|
+
|
82
|
+
def not_authorized!
|
83
|
+
render plain: "Not Authorized", status: 401
|
84
|
+
return false
|
85
|
+
end
|
86
|
+
|
87
|
+
def not_authorized_unless(condition)
|
88
|
+
unless condition
|
89
|
+
not_authorized!
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module UcbRailsUser::Concerns::HomeController
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
|
4
|
+
included do
|
5
|
+
skip_before_action :ensure_authenticated_user
|
6
|
+
end
|
7
|
+
|
8
|
+
def index
|
9
|
+
if logged_in?
|
10
|
+
render "logged_in"
|
11
|
+
else
|
12
|
+
render "not_logged_in"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|