ditty 0.6.0 → 0.7.0.pre.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -4
- data/config.ru +4 -18
- data/ditty.gemspec +2 -0
- data/lib/ditty/components/app.rb +4 -3
- data/lib/ditty/controllers/application.rb +28 -5
- data/lib/ditty/controllers/auth.rb +179 -0
- data/lib/ditty/controllers/component.rb +1 -3
- data/lib/ditty/controllers/main.rb +6 -155
- data/lib/ditty/controllers/users.rb +1 -0
- data/lib/ditty/helpers/component.rb +50 -22
- data/lib/ditty/helpers/response.rb +1 -0
- data/lib/ditty/helpers/views.rb +10 -0
- data/lib/ditty/listener.rb +1 -1
- data/lib/ditty/middleware/accept_extension.rb +31 -0
- data/lib/ditty/models/user.rb +1 -5
- data/lib/ditty/policies/identity_policy.rb +10 -2
- data/lib/ditty/policies/user_policy.rb +8 -1
- data/lib/ditty/services/authentication.rb +16 -7
- data/lib/ditty/services/logger.rb +4 -3
- data/lib/ditty/services/settings.rb +8 -0
- data/lib/ditty/version.rb +1 -1
- data/views/400.haml +2 -0
- data/views/{identity/forgot.haml → auth/forgot_password.haml} +1 -1
- data/views/auth/identity.haml +15 -0
- data/views/auth/login.haml +18 -0
- data/views/auth/register.haml +19 -0
- data/views/auth/register_identity.haml +14 -0
- data/views/{identity/reset.haml → auth/reset_password.haml} +2 -3
- data/views/layout.haml +2 -2
- data/views/partials/actions.haml +6 -4
- data/views/partials/form_tag.haml +2 -1
- data/views/partials/navbar.haml +2 -3
- data/views/partials/search.haml +1 -1
- data/views/partials/sidebar.haml +3 -3
- data/views/roles/display.haml +1 -2
- data/views/roles/index.haml +0 -4
- data/views/users/display.haml +2 -4
- data/views/users/index.haml +11 -10
- data/views/users/profile.haml +2 -4
- metadata +41 -8
- data/views/identity/login.haml +0 -29
- data/views/identity/register.haml +0 -29
@@ -3,9 +3,8 @@
|
|
3
3
|
.col-md-8
|
4
4
|
.panel.panel-default
|
5
5
|
.panel-body
|
6
|
-
|
7
|
-
%input{ name: '
|
8
|
-
%input{ name: 'token', value: params['token'], type: 'hidden' }
|
6
|
+
= edit_form_tag("#{settings.map_path}/auth/reset-password") do
|
7
|
+
%input{ name: 'token', value: params[:token], type: 'hidden' }
|
9
8
|
- if identity.errors[:password] && identity.errors[:password].include?('is not strong enough')
|
10
9
|
.alert.alert-warning
|
11
10
|
%p Make sure your password is at least 8 characters long, and including the following
|
data/views/layout.haml
CHANGED
@@ -36,8 +36,8 @@
|
|
36
36
|
#page-wrapper
|
37
37
|
-if defined?(title) || defined?(actions)
|
38
38
|
.row
|
39
|
-
%h1.col-md-9= defined?(title) ? title : ' '
|
40
|
-
.col-md-3.text-
|
39
|
+
%h1.col-md-9= defined?(title) ? title : ' '
|
40
|
+
.col-md-3.text-right{ style: 'margin-top: 20px' }
|
41
41
|
= haml :'partials/actions', locals: { actions: defined?(actions) ? actions : {} }
|
42
42
|
-else
|
43
43
|
%div{ style: 'padding-top: 20px' }
|
data/views/partials/actions.haml
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
- if actions.count > 1
|
2
|
-
.
|
3
|
-
|
4
|
-
|
2
|
+
- link, text = actions.shift
|
3
|
+
.btn-group.text-right
|
4
|
+
%a.btn.btn-primary{ href: link }= text
|
5
|
+
%button.btn.btn-primary.dropdown-toggle{ type: 'button', id: 'actions-toggle', data: { toggle: 'dropdown' } }
|
5
6
|
%span.caret
|
7
|
+
%span.sr-only Toggle Dropdown
|
6
8
|
%ul.dropdown-menu{ 'aria-labelledby': 'actions-toggle' }
|
7
9
|
-actions.each do |k, v|
|
8
10
|
%li
|
9
11
|
%a{ href: k }= v
|
10
12
|
- elsif actions.count > 0
|
11
13
|
-actions.each do |k, v|
|
12
|
-
%a.btn.btn-primary
|
14
|
+
%a.btn.btn-primary{ href: k }= v
|
@@ -1,6 +1,7 @@
|
|
1
1
|
%form{ { method: %i[get post].include?(form_verb.to_sym) ? form_verb : :post, action: url }.merge(attributes) }
|
2
|
+
= Rack::Csrf.csrf_tag(env) unless ENV['APP_ENV'] == 'test'
|
2
3
|
- if form_verb.to_sym == :get && layout
|
3
4
|
%input{ name: 'layout', value: layout, type: 'hidden' }
|
4
5
|
- if %i[get post].include?(form_verb.to_sym) == false
|
5
6
|
%input{ name: '_method', value: form_verb.upcase, type: 'hidden' }
|
6
|
-
= capture_haml(&block).chomp
|
7
|
+
= capture_haml(&block).chomp
|
data/views/partials/navbar.haml
CHANGED
@@ -9,16 +9,15 @@
|
|
9
9
|
Ditty
|
10
10
|
|
11
11
|
-if authenticated?
|
12
|
-
|
12
|
+
= delete_form_tag("#{settings.map_path}/auth", attributes: { class: 'nav navbar-top-links navbar-form navbar-right' }) do
|
13
13
|
%a.btn.btn-default{ href: "#{settings.map_path}/users/profile" } My Account
|
14
|
-
%input{ name: '_method', value: 'DELETE', type: 'hidden' }
|
15
14
|
%button.btn.btn-default{ type: 'submit' }
|
16
15
|
/ %i.ti-panel
|
17
16
|
Logout
|
18
17
|
- else
|
19
18
|
%ul.nav.navbar-top-links.navbar-right
|
20
19
|
%li
|
21
|
-
%a.btn.btn-link{ href: "#{settings.map_path}/auth/
|
20
|
+
%a.btn.btn-link{ href: "#{settings.map_path}/auth/login" }
|
22
21
|
Log In
|
23
22
|
.navbar-default.sidebar{ role: 'navigation' }
|
24
23
|
= haml :'partials/sidebar'
|
data/views/partials/search.haml
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
- if self.class.const_defined?(:SEARCHABLE)
|
4
4
|
.form-group
|
5
5
|
.input-group
|
6
|
-
%input.form-control{ name: 'q', type: 'text', placeholder: 'Search...', value: params[
|
6
|
+
%input.form-control{ name: 'q', type: 'text', placeholder: 'Search...', value: params[:q] }
|
7
7
|
.input-group-btn
|
8
8
|
%button.btn.btn-primary{ type: 'submit' }
|
9
9
|
%span.fa.fa-search
|
data/views/partials/sidebar.haml
CHANGED
@@ -27,11 +27,11 @@
|
|
27
27
|
= item[:text]
|
28
28
|
- else
|
29
29
|
%li.active
|
30
|
-
%a{ href: "#{settings.map_path}/auth/
|
30
|
+
%a{ href: "#{settings.map_path}/auth/login" }
|
31
31
|
%i.fa.fa-user.fa-fw
|
32
32
|
Log In
|
33
|
-
- if policy(::Ditty::
|
33
|
+
- if policy(::Ditty::User).register?
|
34
34
|
%li
|
35
|
-
%a{ href: "#{settings.map_path}/auth/
|
35
|
+
%a{ href: "#{settings.map_path}/auth/register" }
|
36
36
|
%i.fa.fa-pencil-square-o.fa-fw
|
37
37
|
Register
|
data/views/roles/display.haml
CHANGED
@@ -12,7 +12,6 @@
|
|
12
12
|
%a.btn.btn-default{ href: "#{base_path}/#{entity.id}/edit" } Edit
|
13
13
|
.col-md-6.text-right
|
14
14
|
- if policy(entity).delete?
|
15
|
-
|
16
|
-
%input{ name: '_method', value: 'DELETE', type: 'hidden' }
|
15
|
+
= delete_form_tag("#{base_path}/#{entity.id}") do
|
17
16
|
%button.btn.btn-warning{ type: 'submit' } Delete
|
18
17
|
.col-md-2
|
data/views/roles/index.haml
CHANGED
data/views/users/display.haml
CHANGED
@@ -27,8 +27,7 @@
|
|
27
27
|
%a.btn.btn-default{ href: "#{base_path}/#{entity.id}/edit" } Edit
|
28
28
|
.col-md-6.text-right
|
29
29
|
- if policy(entity).delete?
|
30
|
-
|
31
|
-
%input{ name: '_method', value: 'DELETE', type: 'hidden' }
|
30
|
+
= delete_form_tag("#{base_path}/#{entity.id}") do
|
32
31
|
%button.btn.btn-warning{ type: 'submit' } Delete
|
33
32
|
.col-md-2
|
34
33
|
|
@@ -40,8 +39,7 @@
|
|
40
39
|
.panel-heading
|
41
40
|
%h4 Change Password
|
42
41
|
.panel-body
|
43
|
-
|
44
|
-
%input{ name: '_method', value: 'PUT', type: 'hidden' }
|
42
|
+
= edit_form_tag("#{base_path}/#{entity.id}/identity") do
|
45
43
|
= form_control(:password, entity.identity.first, type: 'password', placeholder: 'Your password', group: 'identity')
|
46
44
|
= form_control(:password_confirmation, entity.identity.first, type: 'password', label: 'Confirm Password', placeholder: 'Confirm your password', group: 'identity')
|
47
45
|
%button.btn.btn-primary{ type: 'submit' }
|
data/views/users/index.haml
CHANGED
@@ -12,16 +12,17 @@
|
|
12
12
|
%th Roles
|
13
13
|
%th Signed Up
|
14
14
|
%tbody
|
15
|
-
- list.
|
15
|
+
- if list.count > 0
|
16
|
+
- list.all.each do |entity|
|
17
|
+
%tr
|
18
|
+
%td
|
19
|
+
%a{ href: "#{base_path}/#{entity.id}" }= entity.email
|
20
|
+
%td= entity.name
|
21
|
+
%td= entity.surname
|
22
|
+
%td= entity.roles_dataset.map(:name).map(&:titlecase).join(', ')
|
23
|
+
%td= entity.created_at.strftime('%Y-%m-%d')
|
24
|
+
- else
|
16
25
|
%tr
|
17
|
-
%td
|
18
|
-
%a{ href: "#{base_path}/#{entity.id}" }= entity.email
|
19
|
-
%td= entity.name
|
20
|
-
%td= entity.surname
|
21
|
-
%td= entity.roles_dataset.map(:name).map(&:titlecase).join(', ')
|
22
|
-
%td= entity.created_at.strftime('%Y-%m-%d')
|
23
|
-
- if policy(::Ditty::User).create?
|
24
|
-
.panel-body.text-right
|
25
|
-
%a.btn.btn-primary{ href: "#{base_path}/new" } New User
|
26
|
+
%td.text-center{ colspan: 5 } No records
|
26
27
|
|
27
28
|
=pagination(list, base_path)
|
data/views/users/profile.haml
CHANGED
@@ -26,8 +26,7 @@
|
|
26
26
|
%a.btn.btn-default{ href: "#{base_path}/#{entity.id}/edit" } Edit
|
27
27
|
.col-md-6.text-right
|
28
28
|
- if policy(entity).delete?
|
29
|
-
|
30
|
-
%input{ name: '_method', value: 'DELETE', type: 'hidden' }
|
29
|
+
= delete_form_tag("#{base_path}/#{entity.id}") do
|
31
30
|
%button.btn.btn-warning{ type: 'submit' } Delete
|
32
31
|
.col-md-2
|
33
32
|
|
@@ -38,8 +37,7 @@
|
|
38
37
|
.panel-heading
|
39
38
|
%h4 Change Password
|
40
39
|
.panel-body
|
41
|
-
|
42
|
-
%input{ name: '_method', value: 'PUT', type: 'hidden' }
|
40
|
+
= edit_form_tag("#{base_path}/#{entity.id}/identity") do
|
43
41
|
= form_control(:old_password, identity, type: 'password', placeholder: 'Your current password')
|
44
42
|
= form_control(:password, identity, type: 'password', placeholder: 'Your new password')
|
45
43
|
= form_control(:password_confirmation, identity, type: 'password', label: 'Confirm Password', placeholder: 'Confirm your password')
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ditty
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0.pre.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jurgens du Toit
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-08-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -248,6 +248,20 @@ dependencies:
|
|
248
248
|
- - "~>"
|
249
249
|
- !ruby/object:Gem::Version
|
250
250
|
version: '1.0'
|
251
|
+
- !ruby/object:Gem::Dependency
|
252
|
+
name: rack_csrf
|
253
|
+
requirement: !ruby/object:Gem::Requirement
|
254
|
+
requirements:
|
255
|
+
- - "~>"
|
256
|
+
- !ruby/object:Gem::Version
|
257
|
+
version: '1.0'
|
258
|
+
type: :runtime
|
259
|
+
prerelease: false
|
260
|
+
version_requirements: !ruby/object:Gem::Requirement
|
261
|
+
requirements:
|
262
|
+
- - "~>"
|
263
|
+
- !ruby/object:Gem::Version
|
264
|
+
version: '1.0'
|
251
265
|
- !ruby/object:Gem::Dependency
|
252
266
|
name: rake
|
253
267
|
requirement: !ruby/object:Gem::Requirement
|
@@ -318,6 +332,20 @@ dependencies:
|
|
318
332
|
- - "~>"
|
319
333
|
- !ruby/object:Gem::Version
|
320
334
|
version: '0.3'
|
335
|
+
- !ruby/object:Gem::Dependency
|
336
|
+
name: sinatra-param
|
337
|
+
requirement: !ruby/object:Gem::Requirement
|
338
|
+
requirements:
|
339
|
+
- - "~>"
|
340
|
+
- !ruby/object:Gem::Version
|
341
|
+
version: '1.5'
|
342
|
+
type: :runtime
|
343
|
+
prerelease: false
|
344
|
+
version_requirements: !ruby/object:Gem::Requirement
|
345
|
+
requirements:
|
346
|
+
- - "~>"
|
347
|
+
- !ruby/object:Gem::Version
|
348
|
+
version: '1.5'
|
321
349
|
- !ruby/object:Gem::Dependency
|
322
350
|
name: tilt
|
323
351
|
requirement: !ruby/object:Gem::Requirement
|
@@ -400,6 +428,7 @@ files:
|
|
400
428
|
- lib/ditty/components/app.rb
|
401
429
|
- lib/ditty/controllers/application.rb
|
402
430
|
- lib/ditty/controllers/audit_logs.rb
|
431
|
+
- lib/ditty/controllers/auth.rb
|
403
432
|
- lib/ditty/controllers/component.rb
|
404
433
|
- lib/ditty/controllers/main.rb
|
405
434
|
- lib/ditty/controllers/roles.rb
|
@@ -413,6 +442,7 @@ files:
|
|
413
442
|
- lib/ditty/helpers/response.rb
|
414
443
|
- lib/ditty/helpers/views.rb
|
415
444
|
- lib/ditty/listener.rb
|
445
|
+
- lib/ditty/middleware/accept_extension.rb
|
416
446
|
- lib/ditty/middleware/error_catchall.rb
|
417
447
|
- lib/ditty/models/audit_log.rb
|
418
448
|
- lib/ditty/models/base.rb
|
@@ -446,8 +476,15 @@ files:
|
|
446
476
|
- public/images/mstile-150x150.png
|
447
477
|
- public/images/safari-pinned-tab.svg
|
448
478
|
- public/manifest.json
|
479
|
+
- views/400.haml
|
449
480
|
- views/404.haml
|
450
481
|
- views/audit_logs/index.haml
|
482
|
+
- views/auth/forgot_password.haml
|
483
|
+
- views/auth/identity.haml
|
484
|
+
- views/auth/login.haml
|
485
|
+
- views/auth/register.haml
|
486
|
+
- views/auth/register_identity.haml
|
487
|
+
- views/auth/reset_password.haml
|
451
488
|
- views/emails/base.haml
|
452
489
|
- views/emails/forgot_password.haml
|
453
490
|
- views/emails/layouts/action.haml
|
@@ -455,10 +492,6 @@ files:
|
|
455
492
|
- views/emails/layouts/billing.haml
|
456
493
|
- views/embedded.haml
|
457
494
|
- views/error.haml
|
458
|
-
- views/identity/forgot.haml
|
459
|
-
- views/identity/login.haml
|
460
|
-
- views/identity/register.haml
|
461
|
-
- views/identity/reset.haml
|
462
495
|
- views/index.haml
|
463
496
|
- views/layout.haml
|
464
497
|
- views/partials/actions.haml
|
@@ -499,9 +532,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
499
532
|
version: '0'
|
500
533
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
501
534
|
requirements:
|
502
|
-
- - "
|
535
|
+
- - ">"
|
503
536
|
- !ruby/object:Gem::Version
|
504
|
-
version:
|
537
|
+
version: 1.3.1
|
505
538
|
requirements: []
|
506
539
|
rubyforge_project:
|
507
540
|
rubygems_version: 2.7.7
|
data/views/identity/login.haml
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
.row
|
2
|
-
.col-sm-3
|
3
|
-
.col-sm-6
|
4
|
-
.panel.panel-default
|
5
|
-
.panel-body
|
6
|
-
%form{ method: 'post', action: "#{settings.map_path}/auth/identity/callback" }
|
7
|
-
.form-group
|
8
|
-
%label.control-label Email
|
9
|
-
%input.form-control.border-input{ name: 'username', tabindex: '1' }
|
10
|
-
.form-group
|
11
|
-
%label.control-label{ style: 'display: block' }
|
12
|
-
Password
|
13
|
-
%a{ href: "#{settings.map_path}/auth/identity/forgot", style: 'float: right', tabindex: '5' }
|
14
|
-
Forgot?
|
15
|
-
%input.form-control.border-input{ name: 'password', type: 'password', tabindex: '2' }
|
16
|
-
%button.btn.btn-primary{ type: 'submit', tabindex: '3' } Log In
|
17
|
-
- if policy(::Ditty::Identity).register?
|
18
|
-
.pull-right
|
19
|
-
No account yet?
|
20
|
-
%a.btn.btn-default{ href: "#{settings.map_path}/auth/identity/register", tabindex: '4' } Register
|
21
|
-
.row
|
22
|
-
.col-sm-12= " "
|
23
|
-
- if Ditty::Services::Authentication.provides? 'google_oauth2'
|
24
|
-
.row
|
25
|
-
.col-sm-8.col-sm-push-2
|
26
|
-
%a.btn.btn-block.btn-default{ href: "#{settings.map_path}/auth/google_oauth2" }
|
27
|
-
%i.fa.fa-google
|
28
|
-
Log in with Google
|
29
|
-
.col-sm-3
|
@@ -1,29 +0,0 @@
|
|
1
|
-
.row
|
2
|
-
.col-md-2
|
3
|
-
.col-md-8
|
4
|
-
.panel.panel-default
|
5
|
-
.panel-body
|
6
|
-
%form.form-horizontal{ method: 'post', action: "#{settings.map_path}/auth/identity/new" }
|
7
|
-
= form_control(:username, identity, label: 'Email', placeholder: 'your@email.com')
|
8
|
-
= form_control(:password, identity, label: 'Password', type: :password)
|
9
|
-
= form_control(:password_confirmation, identity, label: 'Confirm Password', type: :password)
|
10
|
-
|
11
|
-
- if identity.errors[:password] && identity.errors[:password].include?('is not strong enough')
|
12
|
-
.alert.alert-warning
|
13
|
-
%p Make sure your password is at least 8 characters long, and including the following
|
14
|
-
%ul
|
15
|
-
%li Upper- and lowercase letters
|
16
|
-
%li Numbers
|
17
|
-
%li Special Characters
|
18
|
-
|
19
|
-
- if policy(::Ditty::Identity).register?
|
20
|
-
%button.btn.btn-primary{ type: 'submit' } Register
|
21
|
-
.row
|
22
|
-
.col-sm-12= " "
|
23
|
-
- if Ditty::Services::Authentication.provides? 'google_oauth2'
|
24
|
-
.row
|
25
|
-
.col-sm-8.col-sm-push-2
|
26
|
-
%a.btn.btn-block.btn-default{ href: "#{settings.map_path}/auth/google_oauth2" }
|
27
|
-
%i.fa.fa-google
|
28
|
-
Register with Google
|
29
|
-
.col-md-2
|