j1_template_mde 2018.4.15 → 2018.4.16
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/_includes/themes/j1/layouts/content_generator_blog_archive.html +3 -3
- data/_includes/themes/j1/layouts/layout_shim_generator.html +4 -0
- data/_includes/themes/j1/modules/navigator/generator.html +4 -4
- data/_includes/themes/j1/modules/navigator/procedures/sidebar.proc +174 -127
- data/lib/j1/version.rb +1 -1
- data/lib/j1_app.rb +4 -1
- data/lib/j1_app/j1_auth_manager/auth_manager.previous.rb +939 -0
- data/lib/j1_app/j1_auth_manager/auth_manager.rb +386 -214
- data/lib/j1_app/j1_auth_manager/config.rb +103 -66
- data/lib/j1_app/j1_auth_manager/helpers.rb +22 -14
- data/lib/j1_app/j1_auth_manager/views/auth_manager_ui.erb +7 -2
- data/lib/j1_app/omniauth/strategies/_unused/doumart_patreon.rb +75 -0
- data/lib/j1_app/omniauth/strategies/_unused/my_patreon.rb +78 -0
- data/lib/j1_app/omniauth/strategies/_unused/patreon.v1.rb +50 -0
- data/lib/j1_app/omniauth/strategies/_unused/patreon.v2-v1.rb +82 -0
- data/lib/j1_app/omniauth/strategies/_unused/patreon.v2.rb +79 -0
- data/lib/starter_web/Gemfile +185 -168
- data/lib/starter_web/_config.yml +85 -69
- data/lib/starter_web/_data/j1_resources.yml +15 -0
- data/lib/starter_web/_data/modules/j1_navigator.yml +79 -12
- data/lib/starter_web/_rack/Guardfile +75 -0
- data/lib/starter_web/assets/data/authclient.html +10 -7
- data/lib/starter_web/assets/data/banner.html +127 -127
- data/lib/starter_web/assets/images/patreon/premium-content-460x200.png +0 -0
- data/lib/starter_web/assets/images/patreon/scalable/{Premium-content.psd → premium-content.psd} +0 -0
- data/lib/starter_web/assets/images/patreon/scalable/value-content.psd +0 -0
- data/lib/starter_web/assets/images/patreon/value-content-460x200.png +0 -0
- data/lib/starter_web/assets/themes/j1/core/css/theme_extensions.css +2 -2
- data/lib/starter_web/assets/themes/j1/core/css/theme_extensions.min.css +1 -1
- data/lib/starter_web/assets/themes/j1/core/css/uno.css +2 -2
- data/lib/starter_web/assets/themes/j1/core/css/uno.min.css +1 -1
- data/lib/starter_web/assets/themes/j1/core/js/adapter/navigator.js +66 -11
- data/lib/starter_web/assets/themes/j1/core/js/adapter/navigator.js.failed +797 -0
- data/lib/starter_web/assets/themes/j1/core/js/adapter/template.js +26 -7
- data/lib/starter_web/assets/themes/j1/extensions/livereload/LICENSE +20 -0
- data/lib/starter_web/assets/themes/j1/extensions/livereload/README.md +249 -0
- data/lib/starter_web/assets/themes/j1/extensions/livereload/js/livereload.js +1951 -0
- data/lib/starter_web/assets/themes/j1/extensions/livereload/js/livereload.min.js +1 -0
- data/lib/starter_web/assets/themes/j1/extensions/patreon/patreon.widget.button.html +21 -0
- data/lib/starter_web/package.json +14 -5
- data/lib/starter_web/pages/public/about/become_a_patron.adoc +1 -1
- data/lib/starter_web/pages/public/blog/navigator/archive.html +0 -1
- metadata +19 -4
- data/lib/starter_web/assets/images/patreon/premium-content-420x200.png +0 -0
@@ -37,88 +37,39 @@ module J1App
|
|
37
37
|
!!config['ssl']
|
38
38
|
end
|
39
39
|
|
40
|
-
def self.
|
41
|
-
auth_config['
|
40
|
+
def self.active_providers
|
41
|
+
auth_config['providers']['activated']
|
42
42
|
end
|
43
43
|
|
44
44
|
def self.default_provider
|
45
|
-
auth_config['
|
46
|
-
end
|
47
|
-
|
48
|
-
def self.provider_url(arg)
|
49
|
-
provider_url = {
|
50
|
-
'patreon' => auth_config['provider']['home_url']['patreon'],
|
51
|
-
'disqus' => auth_config['provider']['home_url']['disqus'],
|
52
|
-
'facebook' => auth_config['provider']['home_url']['facebook'],
|
53
|
-
'github' => auth_config['provider']['home_url']['github'],
|
54
|
-
'twitter' => auth_config['provider']['home_url']['twitter']
|
55
|
-
}
|
56
|
-
provider_url[arg]
|
57
|
-
end
|
58
|
-
|
59
|
-
def self.provider_scope(arg)
|
60
|
-
provider_scope = {
|
61
|
-
'patreon' => auth_config['provider']['scope']['patreon'],
|
62
|
-
'disqus' => auth_config['provider']['scope']['disqus'],
|
63
|
-
'facebook' => auth_config['provider']['scope']['facebook'],
|
64
|
-
'github' => auth_config['provider']['scope']['github'],
|
65
|
-
'twitter' => auth_config['provider']['scope']['twitter']
|
66
|
-
}
|
67
|
-
provider_scope[arg].join(',')
|
68
|
-
end
|
69
|
-
|
70
|
-
def self.provider_data(arg)
|
71
|
-
provider_data = {
|
72
|
-
'patreon' => auth_config['provider']['data']['patreon'],
|
73
|
-
'disqus' => auth_config['provider']['data']['disqus'],
|
74
|
-
'facebook' => auth_config['provider']['data']['facebook'],
|
75
|
-
'github' => auth_config['provider']['data']['github'],
|
76
|
-
'twitter' => auth_config['provider']['data']['twitter']
|
77
|
-
}
|
78
|
-
provider_data[arg].join(',')
|
45
|
+
auth_config['providers']['activated'][0]
|
79
46
|
end
|
80
47
|
|
81
48
|
def self.permissions
|
82
49
|
permission_profile = {
|
83
|
-
|
84
|
-
|
50
|
+
:private => [],
|
51
|
+
:premium => []
|
85
52
|
}
|
86
53
|
|
87
|
-
|
88
|
-
provider_permissions.each do |key, value|
|
89
|
-
value.each { |perm| permission_profile["#{perm}"] << key }
|
90
|
-
end
|
91
|
-
permission_profile
|
92
|
-
end
|
93
|
-
|
94
|
-
def self.get_provider_permissions (arg)
|
95
|
-
auth_config['provider']['permission']["#{arg}"].join(',')
|
96
|
-
end
|
97
|
-
|
98
|
-
def self.users
|
99
|
-
user_profile = {}
|
54
|
+
active_providers = auth_config['providers']['activated']
|
100
55
|
|
101
|
-
|
102
|
-
|
103
|
-
|
56
|
+
for p in active_providers do
|
57
|
+
provider_permissions = auth_config['providers']["#{p}"]['permissions']
|
58
|
+
provider_permissions.each do |perm|
|
59
|
+
permission_profile[:"#{perm}"] << "#{p}"
|
60
|
+
end
|
104
61
|
end
|
105
|
-
|
62
|
+
permission_profile
|
106
63
|
end
|
107
64
|
|
108
|
-
def self.
|
109
|
-
|
110
|
-
|
111
|
-
provider_strategies = auth_config['provider']['strategy']
|
112
|
-
provider_strategies.each do |key, value|
|
113
|
-
strategy_profile[key] = :"#{value}"
|
114
|
-
end
|
115
|
-
strategy_profile
|
65
|
+
def self.get_condition(arg)
|
66
|
+
auth_config['provider']['condition']["#{arg}"]
|
116
67
|
end
|
117
68
|
|
118
|
-
def self.conditions
|
69
|
+
def self.conditions (arg)
|
119
70
|
condition_profile = {}
|
120
|
-
|
121
|
-
provider_conditions = auth_config['
|
71
|
+
provider = arg
|
72
|
+
provider_conditions = auth_config['providers']["#{provider}"]['conditions']
|
122
73
|
provider_conditions.each do |key, value|
|
123
74
|
condition_profile[key] = value
|
124
75
|
end
|
@@ -131,4 +82,90 @@ module J1App
|
|
131
82
|
end
|
132
83
|
end
|
133
84
|
|
85
|
+
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
# def self.provider_url(arg)
|
90
|
+
# provider_url = {
|
91
|
+
# 'patreon' => auth_config['provider']['home_url']['patreon'],
|
92
|
+
# 'disqus' => auth_config['provider']['home_url']['disqus'],
|
93
|
+
# 'facebook' => auth_config['provider']['home_url']['facebook'],
|
94
|
+
# 'github' => auth_config['provider']['home_url']['github'],
|
95
|
+
# 'twitter' => auth_config['provider']['home_url']['twitter']
|
96
|
+
# }
|
97
|
+
# provider_url[arg]
|
98
|
+
# end
|
99
|
+
|
100
|
+
# def self.provider_scope(arg)
|
101
|
+
# provider_scope = {
|
102
|
+
# 'patreon' => auth_config['provider']['scope']['patreon'],
|
103
|
+
# 'disqus' => auth_config['provider']['scope']['disqus'],
|
104
|
+
# 'facebook' => auth_config['provider']['scope']['facebook'],
|
105
|
+
# 'github' => auth_config['provider']['scope']['github'],
|
106
|
+
# 'twitter' => auth_config['provider']['scope']['twitter']
|
107
|
+
# }
|
108
|
+
# provider_scope[arg].join(',')
|
109
|
+
# end
|
110
|
+
|
111
|
+
# def self.provider_data(arg)
|
112
|
+
# provider_data = {
|
113
|
+
# 'patreon' => auth_config['provider']['data']['patreon'],
|
114
|
+
# 'disqus' => auth_config['provider']['data']['disqus'],
|
115
|
+
# 'facebook' => auth_config['provider']['data']['facebook'],
|
116
|
+
# 'github' => auth_config['provider']['data']['github'],
|
117
|
+
# 'twitter' => auth_config['provider']['data']['twitter']
|
118
|
+
# }
|
119
|
+
# provider_data[arg].join(',')
|
120
|
+
# end
|
121
|
+
|
122
|
+
# def self.provider_condition(arg)
|
123
|
+
# provider_condition = {
|
124
|
+
# 'patreon' => auth_config['provider']['condition']['patreon'],
|
125
|
+
# 'disqus' => auth_config['provider']['condition']['disqus'],
|
126
|
+
# 'facebook' => auth_config['provider']['condition']['facebook'],
|
127
|
+
# 'github' => auth_config['provider']['condition']['github'],
|
128
|
+
# 'twitter' => auth_config['provider']['condition']['twitter']
|
129
|
+
# }
|
130
|
+
# provider_condition[arg]
|
131
|
+
# end
|
132
|
+
|
133
|
+
# def self.permissions_old
|
134
|
+
# permission_profile = {
|
135
|
+
# :private => [],
|
136
|
+
# :premium => []
|
137
|
+
# }
|
138
|
+
#
|
139
|
+
# provider_permissions = auth_config['provider']['permission']
|
140
|
+
# provider_permissions.each do |key, value|
|
141
|
+
# my_key = key
|
142
|
+
# value.each { |perm| permission_profile[:"#{perm}"] << key }
|
143
|
+
# end
|
144
|
+
# permission_profile
|
145
|
+
# end
|
146
|
+
|
147
|
+
# def self.get_provider_permissions (arg)
|
148
|
+
# auth_config['provider']['permission']["#{arg}"].join(',')
|
149
|
+
# end
|
150
|
+
|
151
|
+
# def self.users
|
152
|
+
# user_profile = {}
|
153
|
+
#
|
154
|
+
# provider_users = auth_config['provider']['user']
|
155
|
+
# provider_users.each do |key, value|
|
156
|
+
# user_profile[key] = value
|
157
|
+
# end
|
158
|
+
# user_profile
|
159
|
+
# end
|
160
|
+
|
161
|
+
# def self.strategies
|
162
|
+
# strategy_profile = {}
|
163
|
+
#
|
164
|
+
# provider_strategies = auth_config['provider']['strategy']
|
165
|
+
# provider_strategies.each do |key, value|
|
166
|
+
# strategy_profile[key] = :"#{value}"
|
167
|
+
# end
|
168
|
+
# strategy_profile
|
169
|
+
# end
|
170
|
+
|
134
171
|
end
|
@@ -19,18 +19,6 @@ module J1App
|
|
19
19
|
return J1App.auth_enabled
|
20
20
|
end
|
21
21
|
|
22
|
-
# def authentication_strategy
|
23
|
-
# if !ENV["GITHUB_TEAM_ID"].to_s.blank?
|
24
|
-
# :team
|
25
|
-
# elsif !ENV["GITHUB_TEAM_IDS"].to_s.blank?
|
26
|
-
# :teams
|
27
|
-
# elsif !ENV["GITHUB_ORG_NAME"].to_s.blank?
|
28
|
-
# :org
|
29
|
-
# elsif !ENV['GITHUB_MEMBERS'].to_s.blank?
|
30
|
-
# :member
|
31
|
-
# end
|
32
|
-
# end
|
33
|
-
|
34
22
|
def warden
|
35
23
|
env['warden']
|
36
24
|
end
|
@@ -51,8 +39,28 @@ module J1App
|
|
51
39
|
!!(str =~ /[öäüÖÄÜß]/)
|
52
40
|
end
|
53
41
|
|
54
|
-
|
55
|
-
|
42
|
+
def log_info! (*args)
|
43
|
+
scope, func, text, details = *args
|
44
|
+
|
45
|
+
if details.nil?
|
46
|
+
message = sprintf( "[%-15s] [%-15s] %s", "#{scope} ", "#{func}", "#{text}" )
|
47
|
+
else
|
48
|
+
message = sprintf( "[%-15s] [%-15s] %s : %s", "#{scope} ", "#{func}", "#{text}", "#{details}" )
|
49
|
+
end
|
50
|
+
logger.info "#{message}"
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
# def authentication_strategy
|
55
|
+
# if !ENV["GITHUB_TEAM_ID"].to_s.blank?
|
56
|
+
# :team
|
57
|
+
# elsif !ENV["GITHUB_TEAM_IDS"].to_s.blank?
|
58
|
+
# :teams
|
59
|
+
# elsif !ENV["GITHUB_ORG_NAME"].to_s.blank?
|
60
|
+
# :org
|
61
|
+
# elsif !ENV['GITHUB_MEMBERS'].to_s.blank?
|
62
|
+
# :member
|
63
|
+
# end
|
56
64
|
# end
|
57
65
|
|
58
66
|
end
|
@@ -90,8 +90,13 @@
|
|
90
90
|
</div>
|
91
91
|
<!-- Footer -->
|
92
92
|
<div class="modal-footer">
|
93
|
-
<a type="button" id="signInButton" class="btn btn-primary-modal mr-2" data-dismiss="modal"
|
94
|
-
|
93
|
+
<a type="button" id="signInButton" class="btn btn-primary-modal mr-2" data-dismiss="modal">
|
94
|
+
<i class="mdi mdi-18px mdi-dark mdi-login"></i>
|
95
|
+
<%= @modal_agreed_text %>
|
96
|
+
</a>
|
97
|
+
<a type="button" id="exitButton" class="btn btn-outline-secondary-modal" data-dismiss="modal">
|
98
|
+
<%= @modal_disagreed_text %>
|
99
|
+
</a>
|
95
100
|
</div>
|
96
101
|
</div>
|
97
102
|
<!-- END Content -->
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'omniauth/strategies/oauth2'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module OmniAuth
|
5
|
+
module Strategies
|
6
|
+
class Patreon < OmniAuth::Strategies::OAuth2
|
7
|
+
|
8
|
+
DEFAULT_SCOPE = 'identity identity[email]'
|
9
|
+
|
10
|
+
option :name, 'patreon'
|
11
|
+
option :client_options, {
|
12
|
+
:authorize_url => '/oauth2/authorize',
|
13
|
+
:site => 'https://www.patreon.com',
|
14
|
+
:token_url => '/api/oauth2/token'
|
15
|
+
}
|
16
|
+
|
17
|
+
uid { raw_info["data"]["id"] }
|
18
|
+
|
19
|
+
info do
|
20
|
+
prune!({
|
21
|
+
:first_name => raw_info["data"]["attributes"]['first_name'],
|
22
|
+
:last_name => raw_info["data"]["attributes"]['last_name'],
|
23
|
+
:full_name => raw_info["data"]["attributes"]['full_name'],
|
24
|
+
:image_url => raw_info["data"]["attributes"]['image_url'],
|
25
|
+
:email => raw_info["data"]["attributes"]['email']
|
26
|
+
})
|
27
|
+
end
|
28
|
+
|
29
|
+
def authorize_params
|
30
|
+
super.tap do |params|
|
31
|
+
options[:authorize_options].each do |k|
|
32
|
+
params[k] = request.params[k.to_s] unless [nil, ''].include?(request.params[k.to_s])
|
33
|
+
end
|
34
|
+
params[:scope] = get_scope(params)
|
35
|
+
session['omniauth.state'] = params[:state] if params[:state]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
extra do
|
40
|
+
hash = {}
|
41
|
+
hash['raw_info'] = raw_info unless skip_info?
|
42
|
+
prune! hash
|
43
|
+
end
|
44
|
+
|
45
|
+
def raw_info
|
46
|
+
@raw_info = MultiJson.decode(access_token.get('/api/oauth2/v2/identity', info_options).body)
|
47
|
+
end
|
48
|
+
|
49
|
+
def info_options
|
50
|
+
params = {}
|
51
|
+
params.merge!({fields: {user: (options[:info_fields] || 'full_name,email')}})
|
52
|
+
params.merge!({locale: options[:locale]}) if options[:locale]
|
53
|
+
|
54
|
+
{ params: params }
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
def callback_url
|
59
|
+
options[:redirect_uri] || full_host + script_name + callback_path
|
60
|
+
end
|
61
|
+
|
62
|
+
def get_scope(params)
|
63
|
+
raw_scope = params[:scope] || DEFAULT_SCOPE
|
64
|
+
scope_list = raw_scope.split(' ').map { |item| item.split(',') }.flatten
|
65
|
+
scope_list.join(' ')
|
66
|
+
end
|
67
|
+
def prune!(hash)
|
68
|
+
hash.delete_if do |_, value|
|
69
|
+
prune!(value) if value.is_a?(Hash)
|
70
|
+
value.nil? || (value.respond_to?(:empty?) && value.empty?)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# require 'omniauth/strategies/oauth2'
|
2
|
+
# require 'json'
|
3
|
+
|
4
|
+
module OmniAuth
|
5
|
+
module Strategies
|
6
|
+
class Patreon < OmniAuth::Strategies::OAuth2
|
7
|
+
|
8
|
+
DEFAULT_SCOPE = 'users'
|
9
|
+
|
10
|
+
option :name, 'patreon'
|
11
|
+
option :client_options, {
|
12
|
+
:authorize_url => '/oauth2/authorize',
|
13
|
+
:site => 'https://www.patreon.com',
|
14
|
+
:token_url => '/api/oauth2/token'
|
15
|
+
}
|
16
|
+
|
17
|
+
uid { raw_info["data"]["id"] }
|
18
|
+
|
19
|
+
info do
|
20
|
+
prune!({
|
21
|
+
:first_name => raw_info["data"]["attributes"]['first_name'],
|
22
|
+
:last_name => raw_info["data"]["attributes"]['last_name'],
|
23
|
+
:full_name => raw_info["data"]["attributes"]['full_name'],
|
24
|
+
:image_url => raw_info["data"]["attributes"]['image_url'],
|
25
|
+
:email => raw_info["data"]["attributes"]['email']
|
26
|
+
})
|
27
|
+
end
|
28
|
+
|
29
|
+
def authorize_params
|
30
|
+
super.tap do |params|
|
31
|
+
options[:authorize_options].each do |k|
|
32
|
+
params[k] = request.params[k.to_s] unless [nil, ''].include?(request.params[k.to_s])
|
33
|
+
end
|
34
|
+
params[:scope] = get_scope(params)
|
35
|
+
session['omniauth.state'] = params[:state] if params[:state]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
extra do
|
40
|
+
hash = {}
|
41
|
+
hash['raw_info'] = raw_info unless skip_info?
|
42
|
+
prune! hash
|
43
|
+
end
|
44
|
+
|
45
|
+
def raw_info
|
46
|
+
@raw_info = MultiJson.decode(access_token.get('/api/oauth2/v2/identity', info_options).body)
|
47
|
+
end
|
48
|
+
|
49
|
+
def info_options
|
50
|
+
params = {}
|
51
|
+
params.merge!({fields: {user: (options[:info_fields] || 'full_name,email')}})
|
52
|
+
params.merge!({locale: options[:locale]}) if options[:locale]
|
53
|
+
{
|
54
|
+
params: params
|
55
|
+
}
|
56
|
+
end
|
57
|
+
|
58
|
+
def callback_url
|
59
|
+
options[:redirect_uri] || full_host + script_name + callback_path
|
60
|
+
# options[:redirect_uri]
|
61
|
+
end
|
62
|
+
|
63
|
+
def get_scope(params)
|
64
|
+
raw_scope = params[:scope] || DEFAULT_SCOPE
|
65
|
+
scope_list = raw_scope.split(' ').map { |item| item.split(',') }.flatten
|
66
|
+
scope_list.join(' ')
|
67
|
+
end
|
68
|
+
|
69
|
+
def prune!(hash)
|
70
|
+
hash.delete_if do |_, value|
|
71
|
+
prune!(value) if value.is_a?(Hash)
|
72
|
+
value.nil? || (value.respond_to?(:empty?) && value.empty?)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# https://github.com/signalnerve/omniauth-patreon
|
2
|
+
|
3
|
+
require 'omniauth-oauth2'
|
4
|
+
|
5
|
+
module OmniAuth
|
6
|
+
module Strategies
|
7
|
+
class Patreon < OmniAuth::Strategies::OAuth2
|
8
|
+
|
9
|
+
option :name, 'patreon'
|
10
|
+
option :client_options,
|
11
|
+
site: 'https://www.patreon.com',
|
12
|
+
authorize_url: 'https://www.patreon.com/oauth2/authorize',
|
13
|
+
token_url: 'https://api.patreon.com/oauth2/token'
|
14
|
+
|
15
|
+
uid { raw_info['data']['id'].to_s }
|
16
|
+
|
17
|
+
info do
|
18
|
+
{
|
19
|
+
:email => raw_info['data']['attributes']['email'],
|
20
|
+
:name => raw_info['data']['attributes']['full_name'],
|
21
|
+
:nickname => raw_info['data']['attributes']['full_name'].gsub('ä','ae').gsub('ö','oe').gsub('ü','ue').gsub(' ','_').downcase,
|
22
|
+
:access_token => access_token.token,
|
23
|
+
:refresh_token => access_token.refresh_token
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
extra do
|
28
|
+
{ raw_info: raw_info }
|
29
|
+
end
|
30
|
+
|
31
|
+
def raw_info
|
32
|
+
@raw_info ||= begin
|
33
|
+
response = client.request(
|
34
|
+
:get, 'https://api.patreon.com/oauth2/api/current_user',
|
35
|
+
headers: {
|
36
|
+
'Authorization' => "Bearer #{access_token.token}"
|
37
|
+
},
|
38
|
+
parse: :json
|
39
|
+
)
|
40
|
+
response.parsed
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def callback_url
|
45
|
+
full_host + script_name + callback_path
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|