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.
@@ -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'], (request.headers['zuora-entity-ids'] || "").gsub('-',''), request.headers['zuora-instance-id']]
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
- elsif request.headers.fetch("Authorization", "").include?("Basic ")
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
- check_instance
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
- if zuora_entity_id.present?
91
- zuora_host = request.headers["HTTP_X_FORWARDED_HOST"] || "apisandbox.zuora.com"
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
- #Do we need to refresh session identity
95
- if request.headers["Zuora-Auth-Token"].present?
96
- zuora_client = ZuoraAPI::Oauth.new(url: "https://#{zuora_host}", bearer_token: request.headers["Zuora-Auth-Token"], oauth_session_expires_at: Time.now + 5.minutes )
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
- #Identity blank or current entity different
109
- if (session["ZuoraCurrentIdentity"].blank? || (session["ZuoraCurrentEntity"] != zuora_entity_id) || (session["ZSession"] != cookies['ZSession']))
110
- identity, response = zuora_client.rest_call(url: zuora_client.rest_endpoint("identity"))
111
- session["ZuoraCurrentIdentity"] = identity
112
- session["ZuoraCurrentEntity"] = identity['entityId']
113
- session["ZSession"] = cookies['ZSession']
114
- zuora_instance_id = nil
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
- #Find matching app instances.
123
- if zuora_instance_id.present?
124
- 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)
125
- else
126
- #if app_instance_ids is present then permissions still controlled by connect
127
- if params[:app_instance_ids].present?
128
- navbar, response = zuora_client.rest_call(url: zuora_client.rest_endpoint("navigation"))
129
- urls = navbar['menus'].map {|x| x['url']}
130
- app_env = ENV["DEIS_APP"] || "xyz123"
131
- url = urls.compact.select {|url| File.basename(url).start_with?(app_env + '?')}.first
132
- task_ids = JSON.parse(Base64.urlsafe_decode64(CGI.parse(URI.parse(url).query)["app_instance_ids"][0]))
133
-
134
- appinstances = ZuoraConnect::AppInstance.where(:id => task_ids).pluck(:id, :name)
135
- else
136
- 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)
137
- end
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
- zuora_user_id = cookies['Zuora-User-Id'] || session["ZuoraCurrentIdentity"]['userId']
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
- #We have no deployed instance for this tenant
172
- else
173
- #Ensure user can access oauth creation API
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
- if appinstances.size > 0
189
- redirect_to "https://#{zuora_host}/apps/newlogin.do?retURL=#{request.fullpath}"
190
- return
191
- end
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
- next_id = (ZuoraConnect::AppInstance.all.where('id > 24999999').order(id: :desc).limit(1).pluck(:id).first || 24999999) + 1
194
- user = (ENV['DEIS_APP'] || "Application").split('-').map(&:capitalize).join(' ')
195
- body = {
196
- 'userId' => zuora_user_id,
197
- 'entityIds' => [zuora_entity_id.unpack("a8a4a4a4a12").join('-')],
198
- 'customAuthorities' => [],
199
- 'additionalInformation' => {
200
- 'description' => "This user is for #{user} application.",
201
- 'name' => "#{user} API User #{next_id}"
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
- 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)}"})
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
- new_zuora_client = ZuoraAPI::Oauth.new(url: "https://#{zuora_host}", oauth_client_id: oauth_response["clientId"], oauth_secret: oauth_response["clientSecret"] )
208
- if session["ZuoraCurrentUserInfo"].blank?
209
- client_describe, response = new_zuora_client.rest_call(url: zuora_client.rest_endpoint("genesis/user/info").gsub('v1/', ''), session_type: :bearer)
210
- else
211
- client_describe = session["ZuoraCurrentUserInfo"]
212
- end
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
- available_entities = client_describe["accessibleEntities"].select {|entity| entity['id'] == zuora_entity_id}
215
- task_data = {
216
- "id": next_id,
217
- "name": client_describe["tenantName"],
218
- "mode": "Collections",
219
- "status": "Running",
220
- ZuoraConnect::AppInstance::LOGIN_TENANT_DESTINATION => {
221
- "tenant_type": "Zuora",
222
- "username": session["ZuoraCurrentIdentity"]["username"],
223
- "url": new_zuora_client.url,
224
- "status": "Active",
225
- "oauth_client_id": oauth_response['clientId'],
226
- "oauth_secret": oauth_response['clientSecret'],
227
- "authentication_type": "OAUTH",
228
- "entities": available_entities.map {|e| e.merge({'displayName' => client_describe["tenantName"]})}
229
- },
230
- "tenant_ids": available_entities.map{|e| e['entityId']}.uniq,
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
- Apartment::Tenant.switch!("public")
254
- begin
255
- Apartment::Tenant.create(@appinstance.id.to_s)
256
- rescue Apartment::TenantExists => ex
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
- rescue ZuoraAPI::Exceptions::ZuoraAPIAuthenticationTypeError => ex
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/error_unhandled", :locals => {:exception => ex}
270
- return
215
+ render "zuora_connect/static/invalid_launch_request", :locals => {:exception => ex}
216
+ return
271
217
  end
272
- elsif 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)
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
- if session["appInstance"].present?
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
- begin
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
- mapped_values = {:api_token => values['api_token'], :token => values['api_token'], :access_token => values["access_token"], :refresh_token => values["refresh_token"], :oauth_expires_at => values["expires"]}
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
- mapped_values = {:access_token => values["access_token"], :refresh_token => values["refresh_token"], :oauth_expires_at => values["expires"]}
383
- @appinstance.assign_attributes(mapped_values)
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
@@ -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
- require 'lograge'
37
-
38
- Rails.configuration.logger = ZuoraConnect.custom_logger(name: "Rails")
39
- if Rails.env != 'development'
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].as_json(except: exceptions).to_json.to_s
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?
@@ -1,3 +1,3 @@
1
1
  module ZuoraConnect
2
- VERSION = "2.0.5zz"
2
+ VERSION = "2.0.5"
3
3
  end
@@ -0,0 +1,9 @@
1
+ module ZuoraConnect
2
+ module Views
3
+ module Helpers
4
+ def is_app_admin?
5
+ return @appinstance.blank? ? false : session["#{@appinstance.id}::admin"]
6
+ end
7
+ end
8
+ end
9
+ end