api_auth_on_behalf_of_controller_test.rb 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. require 'test_helper'
  2. class ApiAuthControllerTest < ActionDispatch::IntegrationTest
  3. setup do
  4. # set accept header
  5. @headers = { 'ACCEPT' => 'application/json', 'CONTENT_TYPE' => 'application/json' }
  6. # create agent
  7. roles = Role.where(name: %w[Admin Agent])
  8. groups = Group.all
  9. UserInfo.current_user_id = 1
  10. @admin = User.create!(
  11. login: 'api-admin-auth-behalf',
  12. firstname: 'API',
  13. lastname: 'Admin',
  14. email: 'api-admin-auth-behalf@example.com',
  15. password: 'adminpw',
  16. active: true,
  17. roles: roles,
  18. groups: groups,
  19. )
  20. # create customer without org
  21. roles = Role.where(name: 'Customer')
  22. @customer = User.create!(
  23. login: 'api-customer1-auth-behalf@example.com',
  24. firstname: 'API',
  25. lastname: 'Customer1',
  26. email: 'api-customer1-auth-behalf@example.com',
  27. password: 'customer1pw',
  28. active: true,
  29. roles: roles,
  30. )
  31. end
  32. test 'X-On-Behalf-Of auth - ticket create admin for customer by id' do
  33. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('api-admin-auth-behalf@example.com', 'adminpw')
  34. ticket_create_headers = @headers.merge(
  35. 'Authorization' => credentials,
  36. 'X-On-Behalf-Of' => @customer.id,
  37. )
  38. params = {
  39. title: 'a new ticket #3',
  40. group: 'Users',
  41. priority: '2 normal',
  42. state: 'new',
  43. customer_id: @customer.id,
  44. article: {
  45. body: 'some test 123',
  46. },
  47. }
  48. post '/api/v1/tickets', params: params.to_json, headers: ticket_create_headers
  49. assert_response(201)
  50. result = JSON.parse(@response.body)
  51. assert_equal(Hash, result.class)
  52. assert_equal(result['created_by_id'], @customer.id)
  53. end
  54. test 'X-On-Behalf-Of auth - ticket create admin for customer by login' do
  55. ActivityStream.cleanup(1.year)
  56. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('api-admin-auth-behalf@example.com', 'adminpw')
  57. ticket_create_headers = @headers.merge(
  58. 'Authorization' => credentials,
  59. 'X-On-Behalf-Of' => @customer.login,
  60. )
  61. admin_headers = @headers.merge(
  62. 'Authorization' => credentials,
  63. )
  64. params = {
  65. title: 'a new ticket #3',
  66. group: 'Users',
  67. priority: '2 normal',
  68. state: 'new',
  69. customer_id: @customer.id,
  70. article: {
  71. body: 'some test 123',
  72. },
  73. }
  74. post '/api/v1/tickets', params: params.to_json, headers: ticket_create_headers
  75. assert_response(201)
  76. result_ticket_create = JSON.parse(@response.body)
  77. assert_equal(Hash, result_ticket_create.class)
  78. assert_equal(result_ticket_create['created_by_id'], @customer.id)
  79. get '/api/v1/activity_stream?full=true', params: {}, headers: admin_headers
  80. assert_response(200)
  81. result_activity_stream = JSON.parse(@response.body)
  82. assert_equal(Hash, result_activity_stream.class)
  83. ticket_created = nil
  84. result_activity_stream['record_ids'].each do |record_id|
  85. activity_stream = ActivityStream.find(record_id)
  86. next if activity_stream.object.name != 'Ticket'
  87. next if activity_stream.o_id != result_ticket_create['id']
  88. ticket_created = activity_stream
  89. end
  90. assert(ticket_created)
  91. assert_equal(ticket_created.created_by_id, @customer.id)
  92. get '/api/v1/activity_stream', params: {}, headers: admin_headers
  93. assert_response(200)
  94. result_activity_stream = JSON.parse(@response.body)
  95. assert_equal(Array, result_activity_stream.class)
  96. ticket_created = nil
  97. result_activity_stream.each do |record|
  98. activity_stream = ActivityStream.find(record['id'])
  99. next if activity_stream.object.name != 'Ticket'
  100. next if activity_stream.o_id != result_ticket_create['id']
  101. ticket_created = activity_stream
  102. end
  103. assert(ticket_created)
  104. assert_equal(ticket_created.created_by_id, @customer.id)
  105. end
  106. test 'X-On-Behalf-Of auth - ticket create admin for customer by email' do
  107. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('api-admin-auth-behalf@example.com', 'adminpw')
  108. ticket_create_headers = @headers.merge(
  109. 'Authorization' => credentials,
  110. 'X-On-Behalf-Of' => @customer.email,
  111. )
  112. params = {
  113. title: 'a new ticket #3',
  114. group: 'Users',
  115. priority: '2 normal',
  116. state: 'new',
  117. customer_id: @customer.id,
  118. article: {
  119. body: 'some test 123',
  120. },
  121. }
  122. post '/api/v1/tickets', params: params.to_json, headers: ticket_create_headers
  123. assert_response(201)
  124. result = JSON.parse(@response.body)
  125. assert_equal(Hash, result.class)
  126. assert_equal(result['created_by_id'], @customer.id)
  127. end
  128. test 'X-On-Behalf-Of auth - ticket create admin for unknown' do
  129. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('api-admin-auth-behalf@example.com', 'adminpw')
  130. ticket_create_headers = @headers.merge(
  131. 'Authorization' => credentials,
  132. 'X-On-Behalf-Of' => 99_449_494_949,
  133. )
  134. params = {
  135. title: 'a new ticket #3',
  136. group: 'Users',
  137. priority: '2 normal',
  138. state: 'new',
  139. customer_id: @customer.id,
  140. article: {
  141. body: 'some test 123',
  142. },
  143. }
  144. post '/api/v1/tickets', params: params.to_json, headers: ticket_create_headers
  145. assert_response(401)
  146. assert_not(@response.header.key?('Access-Control-Allow-Origin'))
  147. result = JSON.parse(@response.body)
  148. assert_equal(Hash, result.class)
  149. assert_equal("No such user '99449494949'", result['error'])
  150. end
  151. test 'X-On-Behalf-Of auth - ticket create customer for admin' do
  152. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('api-customer1-auth-behalf@example.com', 'customer1pw')
  153. ticket_create_headers = @headers.merge(
  154. 'Authorization' => credentials,
  155. 'X-On-Behalf-Of' => @admin.email,
  156. )
  157. params = {
  158. title: 'a new ticket #3',
  159. group: 'Users',
  160. priority: '2 normal',
  161. state: 'new',
  162. customer_id: @customer.id,
  163. article: {
  164. body: 'some test 123',
  165. },
  166. }
  167. post '/api/v1/tickets', params: params.to_json, headers: ticket_create_headers
  168. assert_response(401)
  169. assert_not(@response.header.key?('Access-Control-Allow-Origin'))
  170. result = JSON.parse(@response.body)
  171. assert_equal(Hash, result.class)
  172. assert_equal("Current user has no permission to use 'X-On-Behalf-Of'!", result['error'])
  173. end
  174. test 'X-On-Behalf-Of auth - ticket create admin for customer by email but no permitted action' do
  175. group_secret = Group.new(name: 'secret1234')
  176. credentials = ActionController::HttpAuthentication::Basic.encode_credentials('api-admin-auth-behalf@example.com', 'adminpw')
  177. ticket_create_headers = @headers.merge(
  178. 'Authorization' => credentials,
  179. 'X-On-Behalf-Of' => @customer.email,
  180. )
  181. params = {
  182. title: 'a new ticket #3',
  183. group: group_secret.name,
  184. priority: '2 normal',
  185. state: 'new',
  186. customer_id: @customer.id,
  187. article: {
  188. body: 'some test 123',
  189. },
  190. }
  191. post '/api/v1/tickets', params: params.to_json, headers: ticket_create_headers
  192. assert_response(422)
  193. assert_not(@response.header.key?('Access-Control-Allow-Origin'))
  194. result = JSON.parse(@response.body)
  195. assert_equal(Hash, result.class)
  196. assert_equal('No lookup value found for \'group\': "secret1234"', result['error'])
  197. end
  198. end