zuora_connect 2.0.5zz → 2.0.5
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 +4 -4
- data/app/controllers/zuora_connect/static_controller.rb +17 -4
- data/app/helpers/zuora_connect/application_helper.rb +0 -10
- data/app/models/zuora_connect/app_instance_base.rb +40 -75
- data/app/models/zuora_connect/zuora_user.rb +0 -1
- data/app/views/zuora_connect/static/invalid_app_instance_error.html.erb +65 -0
- data/app/views/zuora_connect/static/invalid_launch_request.html.erb +81 -0
- data/app/views/zuora_connect/static/launch.html.erb +75 -74
- data/app/views/zuora_connect/static/permission_error.html.erb +80 -0
- data/app/views/zuora_connect/static/session_error.html.erb +63 -0
- data/config/routes.rb +2 -0
- data/lib/resque/plugins/custom_logger.rb +1 -1
- data/lib/zuora_connect/configuration.rb +3 -3
- data/lib/zuora_connect/controllers/helpers.rb +180 -234
- data/lib/zuora_connect/engine.rb +1 -2
- data/lib/zuora_connect/railtie.rb +6 -10
- data/lib/zuora_connect/version.rb +1 -1
- data/lib/zuora_connect/views/helpers.rb +9 -0
- data/lib/zuora_connect.rb +42 -59
- metadata +54 -54
- data/app/views/zuora_connect/static/error_handled.html.erb +0 -77
- data/app/views/zuora_connect/static/error_unhandled.erb +0 -76
- data/config/initializers/patches.rb +0 -9
- data/db/migrate/20190520232222_add_unique_index.rb +0 -6
- data/lib/middleware/json_parse_errors.rb +0 -22
@@ -16,7 +16,7 @@ module ZuoraConnect
|
|
16
16
|
ZuoraConnect.logger.debug("[#{@appinstance.id}] API REQUEST - API token") if @appinstance.present?
|
17
17
|
check_instance
|
18
18
|
elsif ZuoraConnect::AppInstance::INTERNAL_HOSTS.include?(request.headers.fetch("HOST", nil))
|
19
|
-
zuora_host, zuora_entity_id, zuora_instance_id = [request.headers['zuora-host'],
|
19
|
+
zuora_host, zuora_entity_id, zuora_instance_id = [request.headers['zuora-host'], request.headers['zuora-entity-ids'].gsub('-',''), request.headers['zuora-instance-id']]
|
20
20
|
|
21
21
|
#Validate host present
|
22
22
|
if zuora_host.blank?
|
@@ -37,24 +37,21 @@ module ZuoraConnect
|
|
37
37
|
|
38
38
|
if appinstances.size == 0
|
39
39
|
render json: {"status": 401, "message": "Missing mapping or no deployment for '#{zuora_host}-#{zuora_entity_id}' ."}, status: :unauthorized
|
40
|
-
return
|
41
40
|
elsif appinstances.size > 1
|
42
41
|
render json: {"status": 401, "message": "More than one app instance binded to host and entity ids. Please indicate correct instance via 'zuora-instance-id' header"}, status: :unauthorized
|
43
|
-
return
|
44
42
|
else
|
45
43
|
@appinstance = appinstances.first
|
46
|
-
check_instance
|
47
44
|
end
|
48
|
-
|
49
|
-
|
45
|
+
|
46
|
+
else #if request.headers.fetch("Authorization", "").include?("Basic ")
|
50
47
|
authenticate_or_request_with_http_basic do |username, password|
|
51
48
|
@appinstance = ZuoraConnect::AppInstance.where(:token => password).first
|
52
49
|
@appinstance ||= ZuoraConnect::AppInstance.where(:api_token => password).first
|
53
50
|
ZuoraConnect.logger.debug("[#{@appinstance.id}] API REQUEST - Basic Auth") if @appinstance.present?
|
54
51
|
check_instance
|
55
52
|
end
|
56
|
-
else
|
57
|
-
|
53
|
+
# else
|
54
|
+
# check_instance
|
58
55
|
end
|
59
56
|
|
60
57
|
if @appinstance.present?
|
@@ -62,237 +59,175 @@ module ZuoraConnect
|
|
62
59
|
end
|
63
60
|
end
|
64
61
|
|
65
|
-
#API ONLY
|
66
|
-
def check_instance
|
67
|
-
if defined?(@appinstance) && @appinstance.present?
|
68
|
-
if @appinstance.new_session_for_api_requests(:params => params)
|
69
|
-
@appinstance.new_session(:session => @appinstance.data_lookup(:session => session))
|
70
|
-
end
|
71
|
-
Thread.current[:appinstance] = @appinstance
|
72
|
-
PaperTrail.whodunnit = "API User" if defined?(PaperTrail)
|
73
|
-
ElasticAPM.set_user("API User") if defined?(ElasticAPM) && ElasticAPM.running?
|
74
|
-
return true
|
75
|
-
else
|
76
|
-
response.set_header('WWW-Authenticate', "Basic realm=\"Application\"")
|
77
|
-
render json: {"status": 401, "message": "Access Denied"}, status: :unauthorized
|
78
|
-
return false
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
62
|
def authenticate_connect_app_request
|
83
63
|
ElasticAPM.set_tag(:trace_id, request.uuid) if defined?(ElasticAPM) && ElasticAPM.running?
|
84
64
|
Thread.current[:appinstance] = nil
|
85
|
-
start_time = Time.now
|
86
|
-
|
87
|
-
if ZuoraConnect.configuration.mode == "Production"
|
88
|
-
zuora_entity_id = request.headers['ZuoraCurrentEntity'] || cookies['ZuoraCurrentEntity']
|
89
65
|
|
90
|
-
|
91
|
-
|
66
|
+
if request.headers['ZuoraCurrentEntity'].present?
|
67
|
+
|
68
|
+
#Do we need to refresh session identity
|
69
|
+
zuora_host = request.headers["HTTP_X_FORWARDED_HOST"] || "apisandbox.zuora.com"
|
70
|
+
if request.headers["Zuora-Auth-Token"].present?
|
71
|
+
zuora_client = ZuoraAPI::Oauth.new(url: "https://#{zuora_host}", bearer_token: request.headers["Zuora-Auth-Token"], oauth_session_expires_at: Time.now + 5.minutes )
|
72
|
+
elsif cookies['ZSession'].present?
|
73
|
+
zuora_client = ZuoraAPI::Basic.new(url: "https://#{zuora_host}", session: cookies['ZSession'])
|
74
|
+
else
|
75
|
+
raise ZuoraConnect::Exceptions::Error.new("Neither the ZSession cookie nor the Zuora-Auth-Token are present in payload.")
|
76
|
+
end
|
77
|
+
zuora_entity_id = request.headers['ZuoraCurrentEntity']
|
78
|
+
zuora_instance_id = params[:sidebar_launch].to_bool ? nil : (params[:app_instance_id] || session["appInstance"])
|
92
79
|
|
80
|
+
#Identity blank or current entity different
|
81
|
+
if (session["ZuoraCurrentIdentity"].blank? || session["ZuoraCurrentEntity"] != zuora_entity_id)
|
93
82
|
begin
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
elsif cookies['ZSession'].present?
|
98
|
-
zuora_client = ZuoraAPI::Basic.new(url: "https://#{zuora_host}", session: cookies['ZSession'])
|
99
|
-
else
|
100
|
-
render "zuora_connect/static/error_handled", :locals => {
|
101
|
-
:title => "Missing Authorization Token",
|
102
|
-
:message => "Zuora 'Zuora-Auth-Token' header and 'ZSession' cookie not present."
|
103
|
-
}
|
104
|
-
return
|
105
|
-
end
|
106
|
-
zuora_instance_id = params[:sidebar_launch].to_bool ? nil : (params[:app_instance_id] || session["appInstance"])
|
83
|
+
identity, response = zuora_client.rest_call(url: zuora_client.rest_endpoint("identity"))
|
84
|
+
session["ZuoraCurrentIdentity"] = identity
|
85
|
+
session["ZuoraCurrentEntity"] = identity['entityId']
|
107
86
|
|
108
|
-
#
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
client_describe, response = zuora_client.rest_call(url: zuora_client.rest_endpoint("genesis/user/info").gsub('v1/', ''), session_type: zuora_client.class == ZuoraAPI::Oauth ? :bearer : :basic, headers: zuora_client.class == ZuoraAPI::Oauth ? {} : {'Authorization' => "ZSession-a3N2w #{zuora_client.get_session(prefix: false, auth_type: :basic)}"})
|
117
|
-
session["ZuoraCurrentUserInfo"] = client_describe
|
118
|
-
|
119
|
-
raise ZuoraConnect::Exceptions::Error.new("Header entity id, '#{zuora_entity_id}' does not match identity call entity id, '#{identity['entityId']}'.") if zuora_entity_id != identity['entityId']
|
120
|
-
end
|
87
|
+
raise ZuoraConnect::Exceptions::Error.new("Header entity id, '#{zuora_entity_id}' does not match identity call entity id, '#{identity['entityId']}'.") if zuora_entity_id != identity['entityId']
|
88
|
+
rescue => ex
|
89
|
+
ZuoraConnect.logger.error(ex)
|
90
|
+
render "zuora_connect/static/invalid_launch_request", :locals => {:exception => ex}
|
91
|
+
return
|
92
|
+
end
|
93
|
+
end
|
121
94
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
95
|
+
#Find matching app instances.
|
96
|
+
if zuora_instance_id.present?
|
97
|
+
appinstances = ZuoraConnect::AppInstance.where("zuora_entity_ids ?& array[:entities] = true AND zuora_domain = :host AND id = :id", entities: [zuora_entity_id], host: zuora_client.rest_domain, id: zuora_instance_id).pluck(:id, :name)
|
98
|
+
else
|
99
|
+
#if app_instance_ids is present then permissions still controlled by connect
|
100
|
+
if params[:app_instance_ids].present?
|
101
|
+
begin
|
102
|
+
navbar, response = zuora_client.rest_call(url: zuora_client.rest_endpoint("navigation"))
|
103
|
+
urls = navbar['menus'].map {|x| x['url']}
|
104
|
+
app_env = ENV["DEIS_APP"] || "xyz123"
|
105
|
+
url = urls.compact.select {|url| File.basename(url).start_with?(app_env + '?')}.first
|
106
|
+
task_ids = JSON.parse(Base64.urlsafe_decode64(CGI.parse(URI.parse(url).query)["app_instance_ids"][0]))
|
107
|
+
|
108
|
+
appinstances = ZuoraConnect::AppInstance.where(:id => task_ids).pluck(:id, :name)
|
109
|
+
rescue => ex
|
110
|
+
ZuoraConnect.logger.error(ex)
|
111
|
+
render "zuora_connect/static/invalid_launch_request", :locals => {:exception => ex}
|
112
|
+
return
|
138
113
|
end
|
114
|
+
else
|
115
|
+
appinstances = ZuoraConnect::AppInstance.where("zuora_entity_ids ?& array[:entities] = true AND zuora_domain = :host", entities: [zuora_entity_id], host: zuora_client.rest_domain).pluck(:id, :name)
|
116
|
+
end
|
117
|
+
end
|
139
118
|
|
140
|
-
|
141
|
-
|
142
|
-
#One deployed instance
|
143
|
-
if appinstances.size == 1
|
144
|
-
ZuoraConnect.logger.debug("Instance is #{appinstances.to_h.keys.first}")
|
145
|
-
@appinstance = ZuoraConnect::AppInstance.find(appinstances.to_h.keys.first)
|
146
|
-
|
147
|
-
#Add user/update
|
148
|
-
@zuora_user = ZuoraConnect::ZuoraUser.where(:zuora_user_id => zuora_user_id).first
|
149
|
-
if @zuora_user.present?
|
150
|
-
ZuoraConnect.logger.debug("Current zuora user #{zuora_user_id}")
|
151
|
-
if @zuora_user.updated_at < Time.now - 1.day
|
152
|
-
@zuora_user.zuora_identity_response[zuora_entity_id] = session["ZuoraCurrentIdentity"]
|
153
|
-
@zuora_user.save!
|
154
|
-
end
|
155
|
-
else
|
156
|
-
ZuoraConnect.logger.debug("New zuora user object for #{zuora_user_id}")
|
157
|
-
@zuora_user = ZuoraConnect::ZuoraUser.create!(:zuora_user_id => zuora_user_id, :zuora_identity_response => {zuora_entity_id => session["ZuoraCurrentIdentity"]})
|
158
|
-
end
|
159
|
-
@zuora_user.session = session
|
160
|
-
session["#{@appinstance.id}::user::email"] = session['ZuoraCurrentIdentity']["username"]
|
161
|
-
session["#{@appinstance.id}::user::timezone"] = session['ZuoraCurrentIdentity']["timeZone"]
|
162
|
-
session["#{@appinstance.id}::user::locale"] = session['ZuoraCurrentIdentity']["language"]
|
163
|
-
session["appInstance"] = @appinstance.id
|
164
|
-
|
165
|
-
#We have multiple, user must pick
|
166
|
-
elsif appinstances.size > 1
|
167
|
-
ZuoraConnect.logger.debug("User must select instance. #{@names}")
|
168
|
-
render "zuora_connect/static/launch", :locals => {:names => appinstances.to_h}
|
169
|
-
return
|
119
|
+
zuora_user_id = cookies['Zuora-User-Id'] || session["ZuoraCurrentIdentity"]['userId']
|
170
120
|
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
if session["ZuoraCurrentIdentity"]['platformRole'] != 'ADMIN'
|
175
|
-
Thread.current[:appinstance] = nil
|
176
|
-
session["appInstance"] = nil
|
177
|
-
render "zuora_connect/static/error_handled", :locals => {
|
178
|
-
:title => "Application can only complete its initial setup via platform administrator",
|
179
|
-
:message => "Please contact admin of tenant and have them click on link again to launch application."
|
180
|
-
}
|
181
|
-
return
|
182
|
-
end
|
183
|
-
Apartment::Tenant.switch!("public")
|
184
|
-
ActiveRecord::Base.transaction do
|
185
|
-
ActiveRecord::Base.connection.execute('LOCK public.zuora_users IN ACCESS EXCLUSIVE MODE')
|
186
|
-
appinstances = ZuoraConnect::AppInstance.where("zuora_entity_ids ?& array[:entities] = true AND zuora_domain = :host", entities: [zuora_entity_id], host: zuora_client.rest_domain).pluck(:id, :name)
|
121
|
+
#One deployed instance
|
122
|
+
if appinstances.size == 1
|
123
|
+
ZuoraConnect.logger.debug("Instance is #{appinstances.to_h.keys.first}")
|
187
124
|
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
125
|
+
#Add user/update
|
126
|
+
@user = ZuoraConnect::ZuoraUser.where(:zuora_user_id => zuora_user_id).first
|
127
|
+
if @user.present?
|
128
|
+
ZuoraConnect.logger.debug("Current zuora user #{zuora_user_id}")
|
129
|
+
if @user.updated_at < Time.now - 1.day
|
130
|
+
@user.zuora_identity_response[zuora_entity_id] = session["ZuoraCurrentIdentity"]
|
131
|
+
@user.save!
|
132
|
+
end
|
133
|
+
else
|
134
|
+
ZuoraConnect.logger.debug("New zuora user object for #{zuora_user_id}")
|
135
|
+
@user = ZuoraConnect::ZuoraUser.create!(:zuora_user_id => zuora_user_id, :zuora_identity_response => {zuora_entity_id => session["ZuoraCurrentIdentity"]})
|
136
|
+
end
|
137
|
+
#Update access if admin in tenant
|
138
|
+
if session["ZuoraCurrentIdentity"]['platformRole'] == 'ADMIN' && !@user.app_permissions['access'].to_bool
|
139
|
+
@user.app_permissions['access'] = true
|
140
|
+
@user.save!
|
141
|
+
end
|
192
142
|
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
143
|
+
#If user has has access to application
|
144
|
+
if @user.app_permissions['access'].to_bool || !ZuoraConnect.configuration.app_access_permissions
|
145
|
+
session["appInstance"] = appinstances.to_h.keys.first
|
146
|
+
else
|
147
|
+
Thread.current[:appinstance] = nil
|
148
|
+
session["appInstance"] = nil
|
149
|
+
admin_users = ZuoraConnect::ZuoraUser.select("zuora_identity_response #>> '{#{zuora_entity_id},username}' as username").where("zuora_identity_response #>> :selector = 'ADMIN' ", :selector => "{#{zuora_entity_id},platformRole}")
|
150
|
+
render "zuora_connect/static/permission_error", :locals => {:admins => admin_users}
|
151
|
+
return
|
152
|
+
end
|
153
|
+
#We have multiple, user must pick
|
154
|
+
elsif appinstances.size > 1
|
155
|
+
ZuoraConnect.logger.debug("User must select instance. #{@names}")
|
156
|
+
render "zuora_connect/static/launch", :locals => {:names => appinstances.to_h}
|
157
|
+
return
|
158
|
+
else
|
159
|
+
begin
|
160
|
+
#Ensure user can access oauth creation API
|
161
|
+
if session["ZuoraCurrentIdentity"]['platformRole'] != 'ADMIN'
|
162
|
+
raise ZuoraConnect::Exceptions::Error.new("User is not admin, workflow cannot be deployed.")
|
163
|
+
end
|
164
|
+
|
165
|
+
body = {
|
166
|
+
'userId' => zuora_user_id,
|
167
|
+
'entityIds' => [zuora_entity_id.unpack("a8a4a4a4a12").join('-')],
|
168
|
+
'customAuthorities' => [],
|
169
|
+
'additionalInformation' => {
|
170
|
+
'description' => 'This user is for workflow application.',
|
171
|
+
'name' => 'Workflow API User'
|
172
|
+
}
|
173
|
+
}
|
204
174
|
|
205
|
-
|
175
|
+
oauth_response, response = zuora_client.rest_call(method: :post, body: body.to_json, url: zuora_client.rest_endpoint("genesis/clients").gsub('v1/', ''), session_type: zuora_client.class == ZuoraAPI::Oauth ? :bearer : :basic, headers: zuora_client.class == ZuoraAPI::Oauth ? {} : {'Authorization' => "ZSession-a3N2w #{zuora_client.get_session(prefix: false, auth_type: :basic)}"})
|
206
176
|
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
177
|
+
new_zuora_client = ZuoraAPI::Oauth.new(url: "https://#{zuora_host}", oauth_client_id: oauth_response["clientId"], oauth_secret: oauth_response["clientSecret"] )
|
178
|
+
|
179
|
+
client_describe, response = new_zuora_client.rest_call(url: zuora_client.rest_endpoint("genesis/user/info").gsub('v1/', ''), session_type: :bearer)
|
180
|
+
|
181
|
+
Apartment::Tenant.switch!("public")
|
182
|
+
next_id = (ZuoraConnect::AppInstance.all.where(:access_token => nil).order(id: :desc).limit(1).pluck(:id).first || 24999999) + 1
|
183
|
+
begin
|
184
|
+
Apartment::Tenant.create(next_id.to_s)
|
185
|
+
rescue Apartment::TenantExists => ex
|
186
|
+
ZuoraConnect.logger.debug("Tenant Already Exists")
|
187
|
+
end
|
213
188
|
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
}
|
232
|
-
mapped_values = {:id => next_id, :api_token => rand(36**64).to_s(36), :token => rand(36**64).to_s(36), :zuora_logins => task_data, :oauth_expires_at => Time.now + 1000.years, :zuora_domain => zuora_client.rest_domain, :zuora_entity_ids => [zuora_entity_id]}
|
233
|
-
@appinstance = ZuoraConnect::AppInstance.new(mapped_values)
|
234
|
-
retry_count = 0
|
235
|
-
begin
|
236
|
-
@appinstance.save(:validate => false)
|
237
|
-
rescue ActiveRecord::RecordNotUnique => ex
|
238
|
-
if (retry_count += 1) < 3
|
239
|
-
@appinstance.assign_attributes({:api_token => rand(36**64).to_s(36), :token => rand(36**64).to_s(36)})
|
240
|
-
retry
|
241
|
-
else
|
242
|
-
Thread.current[:appinstance] = nil
|
243
|
-
session["appInstance"] = nil
|
244
|
-
render "zuora_connect/static/error_handled", :locals => {
|
245
|
-
:title => "Application could not create unique tokens.",
|
246
|
-
:message => "Please contact support or retry launching application."
|
247
|
-
}
|
248
|
-
return
|
249
|
-
end
|
250
|
-
end
|
251
|
-
end
|
189
|
+
task_data = {
|
190
|
+
"id": next_id,
|
191
|
+
"name": client_describe["tenantName"],
|
192
|
+
"mode": "Collections",
|
193
|
+
"status": "Running",
|
194
|
+
"target_login": {
|
195
|
+
"tenant_type": "Zuora",
|
196
|
+
"username": session["ZuoraCurrentIdentity"]["username"],
|
197
|
+
"url": new_zuora_client.url,
|
198
|
+
"status": "Active",
|
199
|
+
"oauth_client_id": oauth_response['clientId'],
|
200
|
+
"oauth_secret": oauth_response['clientSecret'],
|
201
|
+
"authentication_type": "OAUTH",
|
202
|
+
"entities": client_describe["accessibleEntities"].map {|e| e.merge({'displayName' => client_describe["tenantName"]})} #needs work
|
203
|
+
},
|
204
|
+
"tenant_ids": client_describe["accessibleEntities"].map{|e| e['entityId'] }.push(client_describe["tenantId"]).uniq,
|
205
|
+
}
|
252
206
|
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
ZuoraConnect.logger.debug("Tenant Already Exists")
|
258
|
-
end
|
259
|
-
@appinstance.refresh
|
260
|
-
session["appInstance"] = @appinstance.id
|
261
|
-
end
|
207
|
+
appinstance = ZuoraConnect::AppInstance.new(:id => next_id, :zuora_logins => task_data.to_json, :oauth_expires_at => Time.now + 1000.years)
|
208
|
+
appinstance.save(:validate => false)
|
209
|
+
@appinstance = ZuoraConnect::AppInstance.find(appinstance.id)
|
210
|
+
@appinstance.apartment_switch(method = nil, migrate = true)
|
262
211
|
|
263
|
-
|
264
|
-
session.clear
|
265
|
-
redirect_to "https://#{zuora_host}/apps/newlogin.do?retURL=#{request.fullpath}"
|
266
|
-
return
|
212
|
+
session["appInstance"] = @appinstance.id
|
267
213
|
rescue => ex
|
268
214
|
ZuoraConnect.logger.error(ex)
|
269
|
-
render "zuora_connect/static/
|
270
|
-
return
|
215
|
+
render "zuora_connect/static/invalid_launch_request", :locals => {:exception => ex}
|
216
|
+
return
|
271
217
|
end
|
272
|
-
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
start_time = Time.now
|
222
|
+
if ZuoraConnect.configuration.mode == "Production"
|
223
|
+
if request["data"] && /^([A-Za-z0-9+\/\-\_]{4})*([A-Za-z0-9+\/]{4}|[A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{2}==)$/.match(request["data"].to_s)
|
273
224
|
setup_instance_via_data
|
274
225
|
else
|
275
|
-
|
276
|
-
@appinstance = ZuoraConnect::AppInstance.where(:id => session["appInstance"]).first
|
277
|
-
else
|
278
|
-
render "zuora_connect/static/error_handled", :locals => {
|
279
|
-
:title => "Application state could not be verified",
|
280
|
-
:message => "Please relaunch application."
|
281
|
-
}
|
282
|
-
return
|
283
|
-
end
|
226
|
+
setup_instance_via_session
|
284
227
|
end
|
285
228
|
else
|
286
229
|
setup_instance_via_dev_mode
|
287
230
|
end
|
288
|
-
|
289
|
-
if !defined?(@appinstance) || @appinstance.blank?
|
290
|
-
render "zuora_connect/static/error_handled", :locals => {
|
291
|
-
:title => "Application state could not be found.",
|
292
|
-
:message => "Please relaunch application."
|
293
|
-
}
|
294
|
-
return
|
295
|
-
end
|
296
231
|
#Call .data_lookup with the current session to retrieve session. In some cases session may be stored/cache in redis
|
297
232
|
#so data lookup provides a model method that can be overriden per app.
|
298
233
|
if params[:controller] != 'zuora_connect/api/v1/app_instance' && params[:action] != 'drop'
|
@@ -300,23 +235,16 @@ module ZuoraConnect
|
|
300
235
|
@appinstance.new_session(:session => @appinstance.data_lookup(:session => session))
|
301
236
|
end
|
302
237
|
end
|
303
|
-
|
304
238
|
if session["#{@appinstance.id}::user::email"].present?
|
305
239
|
ElasticAPM.set_user(session["#{@appinstance.id}::user::email"]) if defined?(ElasticAPM) && ElasticAPM.running?
|
306
240
|
PaperTrail.whodunnit = session["#{@appinstance.id}::user::email"] if defined?(PaperTrail)
|
307
241
|
end
|
308
242
|
begin
|
309
|
-
locale = session["#{@appinstance.id}::user::locale"]
|
310
|
-
I18n.locale = locale.present? ? locale : @appinstance.locale
|
243
|
+
I18n.locale = session["#{@appinstance.id}::user::locale"] ? session["#{@appinstance.id}::user::locale"] : @appinstance.locale
|
311
244
|
rescue I18n::InvalidLocale => ex
|
312
245
|
ZuoraConnect.logger.error(ex) if !ZuoraConnect::AppInstance::IGNORED_LOCALS.include?(ex.locale.to_s.downcase)
|
313
246
|
end
|
314
|
-
|
315
|
-
Time.zone = session["#{@appinstance.id}::user::timezone"] ? session["#{@appinstance.id}::user::timezone"] : @appinstance.timezone
|
316
|
-
rescue
|
317
|
-
ZuoraConnect.logger.error(ex)
|
318
|
-
end
|
319
|
-
|
247
|
+
Time.zone = session["#{@appinstance.id}::user::timezone"] ? session["#{@appinstance.id}::user::timezone"] : @appinstance.timezone
|
320
248
|
ZuoraConnect.logger.debug("[#{@appinstance.blank? ? "N/A" : @appinstance.id}] Authenticate App Request Completed In - #{(Time.now - start_time).round(2)}s")
|
321
249
|
end
|
322
250
|
|
@@ -338,14 +266,6 @@ module ZuoraConnect
|
|
338
266
|
return session["#{@appinstance.id}::admin"]
|
339
267
|
end
|
340
268
|
|
341
|
-
def zuora_user
|
342
|
-
return @zuora_user
|
343
|
-
end
|
344
|
-
|
345
|
-
def hallway_integration?
|
346
|
-
return (request.headers['ZuoraCurrentEntity'].present? || cookies['ZuoraCurrentEntity'].present?)
|
347
|
-
end
|
348
|
-
|
349
269
|
private
|
350
270
|
def setup_instance_via_data
|
351
271
|
session.clear
|
@@ -367,7 +287,6 @@ module ZuoraConnect
|
|
367
287
|
ZuoraConnect.logger.debug({msg: 'Setup values', connect: values}) if Rails.env != "production"
|
368
288
|
|
369
289
|
@appinstance = ZuoraConnect::AppInstance.where(:id => values["appInstance"].to_i).first
|
370
|
-
|
371
290
|
if @appinstance.blank?
|
372
291
|
Apartment::Tenant.switch!("public")
|
373
292
|
begin
|
@@ -375,12 +294,13 @@ module ZuoraConnect
|
|
375
294
|
rescue Apartment::TenantExists => ex
|
376
295
|
ZuoraConnect.logger.debug("Tenant Already Exists")
|
377
296
|
end
|
378
|
-
|
379
|
-
@appinstance = ZuoraConnect::AppInstance.new(mapped_values.merge({:id => values["appInstance"].to_i}))
|
297
|
+
@appinstance = ZuoraConnect::AppInstance.new(:api_token => values[:api_token],:id => values["appInstance"].to_i, :access_token => values["access_token"].blank? ? values["user"] : values["access_token"], :token => values["refresh_token"] , :refresh_token => values["refresh_token"].blank? ? values["key"] : values["refresh_token"], :oauth_expires_at => values["expires"])
|
380
298
|
@appinstance.save(:validate => false)
|
381
299
|
else
|
382
|
-
|
383
|
-
@appinstance.
|
300
|
+
@appinstance.access_token = values["access_token"] if !values["access_token"].blank? && @appinstance.access_token != values["access_token"]
|
301
|
+
@appinstance.refresh_token = values["refresh_token"] if !values["refresh_token"].blank? && @appinstance.refresh_token != values["refresh_token"]
|
302
|
+
@appinstance.oauth_expires_at = values["expires"] if !values["expires"].blank?
|
303
|
+
@appinstance.api_token = values["api_token"] if !values["api_token"].blank? && @appinstance.api_token != values["api_token"]
|
384
304
|
if @appinstance.access_token_changed? && @appinstance.refresh_token_changed?
|
385
305
|
@appinstance.save(:validate => false)
|
386
306
|
else
|
@@ -389,6 +309,14 @@ module ZuoraConnect
|
|
389
309
|
end
|
390
310
|
end
|
391
311
|
|
312
|
+
def setup_instance_via_session
|
313
|
+
if session["appInstance"].present?
|
314
|
+
@appinstance = ZuoraConnect::AppInstance.where(:id => session["appInstance"]).first
|
315
|
+
else
|
316
|
+
raise ZuoraConnect::Exceptions::SessionInvalid.new("Session Blank -- Relaunch Application")
|
317
|
+
end
|
318
|
+
end
|
319
|
+
|
392
320
|
def setup_instance_via_dev_mode
|
393
321
|
session["appInstance"] = ZuoraConnect.configuration.dev_mode_appinstance
|
394
322
|
user = ZuoraConnect.configuration.dev_mode_user
|
@@ -412,6 +340,24 @@ module ZuoraConnect
|
|
412
340
|
end
|
413
341
|
session["#{@appinstance.id}::admin"] = ZuoraConnect.configuration.dev_mode_admin
|
414
342
|
end
|
343
|
+
|
344
|
+
#API ONLY
|
345
|
+
def check_instance
|
346
|
+
if defined?(@appinstance) && @appinstance.present?
|
347
|
+
if @appinstance.new_session_for_api_requests(:params => params)
|
348
|
+
@appinstance.new_session(:session => @appinstance.data_lookup(:session => session))
|
349
|
+
end
|
350
|
+
Thread.current[:appinstance] = @appinstance
|
351
|
+
PaperTrail.whodunnit = "API User" if defined?(PaperTrail)
|
352
|
+
ElasticAPM.set_user("API User") if defined?(ElasticAPM) && ElasticAPM.running?
|
353
|
+
return true
|
354
|
+
else
|
355
|
+
response.set_header('WWW-Authenticate', "Basic realm=\"Application\"")
|
356
|
+
#render json: {"status": 401, "message": "Access Denied"}, status: :unauthorized
|
357
|
+
render html: "HTTP Basic: Access denied.\n", status: :unauthorized
|
358
|
+
render plain: "Access Denied", status: :unauthorized
|
359
|
+
end
|
360
|
+
end
|
415
361
|
end
|
416
362
|
end
|
417
363
|
end
|
data/lib/zuora_connect/engine.rb
CHANGED
@@ -12,7 +12,7 @@ module ZuoraConnect
|
|
12
12
|
Rails.application.routes.prepend do
|
13
13
|
mount ZuoraConnect::Engine, at: "/connect"
|
14
14
|
match '/api/connect/health', via: :all, to: 'zuora_connect/static#health'
|
15
|
-
match '/api/connect/internal/data', via: :all, to: 'zuora_connect/static#metrics'
|
15
|
+
match '/api/connect/internal/data', via: :all, to: 'zuora_connect/static#metrics'
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
@@ -27,7 +27,6 @@ module ZuoraConnect
|
|
27
27
|
initializer "connect.helpers" do
|
28
28
|
ActiveSupport.on_load(:action_controller) do
|
29
29
|
include ZuoraConnect::Controllers::Helpers
|
30
|
-
helper ZuoraConnect::ApplicationHelper
|
31
30
|
end
|
32
31
|
end
|
33
32
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'middleware/metrics_middleware'
|
2
2
|
require 'middleware/request_id_middleware'
|
3
|
-
require 'middleware/json_parse_errors'
|
4
3
|
|
5
4
|
module ZuoraConnect
|
6
5
|
class Railtie < Rails::Railtie
|
@@ -26,22 +25,19 @@ module ZuoraConnect
|
|
26
25
|
initializer "zuora_connect.configure_rails_initialization" do |app|
|
27
26
|
app.middleware.insert_after Rack::Sendfile, ZuoraConnect::MetricsMiddleware
|
28
27
|
app.middleware.insert_after ActionDispatch::RequestId, ZuoraConnect::RequestIdMiddleware
|
29
|
-
app.config.middleware.use ZuoraConnect::JsonParseErrors
|
30
28
|
end
|
31
29
|
|
32
30
|
# hook to process_action
|
33
31
|
ActiveSupport::Notifications.subscribe('process_action.action_controller', ZuoraConnect::PageRequest.new)
|
34
32
|
|
35
33
|
initializer(:rails_stdout_logging, before: :initialize_logger) do
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
34
|
+
if Rails.env != 'development' && !ENV['DEIS_APP'].blank?
|
35
|
+
require 'lograge'
|
36
|
+
|
37
|
+
Rails.configuration.logger = ZuoraConnect.custom_logger(name: "Rails")
|
38
|
+
|
40
39
|
Rails.configuration.lograge.enabled = true
|
41
40
|
Rails.configuration.colorize_logging = false
|
42
|
-
end
|
43
|
-
|
44
|
-
if Rails.configuration.lograge.enabled
|
45
41
|
if Rails.configuration.logger.class.to_s == 'Ougai::Logger'
|
46
42
|
Rails.configuration.lograge.formatter = Class.new do |fmt|
|
47
43
|
def fmt.call(data)
|
@@ -54,7 +50,7 @@ module ZuoraConnect
|
|
54
50
|
exceptions = %w(controller action format id)
|
55
51
|
items = {
|
56
52
|
#time: event.time.strftime('%FT%T.%6N'),
|
57
|
-
params: event.payload[:params].
|
53
|
+
params: event.payload[:params].except(*exceptions).to_json.to_s
|
58
54
|
}
|
59
55
|
items.merge!({exception_object: event.payload[:exception_object]}) if event.payload[:exception_object].present?
|
60
56
|
items.merge!({exception: event.payload[:exception]}) if event.payload[:exception].present?
|