provider-manager.js 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. const providerManager = require('../../src/server/provider')
  2. const { getCompanionOptions } = require('../../src/standalone/helper')
  3. const { setDefaultEnv } = require('../mockserver')
  4. let grantConfig
  5. let companionOptions
  6. const getOauthProvider = (providerName) => providerManager.getDefaultProviders()[providerName]?.oauthProvider
  7. describe('Test Provider options', () => {
  8. beforeEach(() => {
  9. setDefaultEnv()
  10. // eslint-disable-next-line global-require
  11. grantConfig = require('../../src/config/grant')()
  12. companionOptions = getCompanionOptions()
  13. })
  14. test('adds provider options', () => {
  15. providerManager.addProviderOptions(companionOptions, grantConfig, getOauthProvider)
  16. expect(grantConfig.dropbox.key).toBe('dropbox_key')
  17. expect(grantConfig.dropbox.secret).toBe('dropbox_secret')
  18. expect(grantConfig.box.key).toBe('box_key')
  19. expect(grantConfig.box.secret).toBe('box_secret')
  20. expect(grantConfig.googledrive.key).toBe('google_key')
  21. expect(grantConfig.googledrive.secret).toBe('google_secret')
  22. expect(grantConfig.googlephotos.key).toBe('google_key')
  23. expect(grantConfig.googledrive.secret).toBe('google_secret')
  24. expect(grantConfig.instagram.key).toBe('instagram_key')
  25. expect(grantConfig.instagram.secret).toBe('instagram_secret')
  26. expect(grantConfig.zoom.key).toBe('zoom_key')
  27. expect(grantConfig.zoom.secret).toBe('zoom_secret')
  28. })
  29. test('adds extra provider config', () => {
  30. process.env.COMPANION_INSTAGRAM_KEY = '123456'
  31. providerManager.addProviderOptions(getCompanionOptions(), grantConfig, getOauthProvider)
  32. expect(grantConfig.instagram).toEqual({
  33. transport: 'session',
  34. "state": true,
  35. callback: '/instagram/callback',
  36. redirect_uri: 'http://localhost:3020/instagram/redirect',
  37. key: '123456',
  38. secret: 'instagram_secret',
  39. protocol: 'https',
  40. scope: ['user_profile', 'user_media'],
  41. })
  42. expect(grantConfig.dropbox).toEqual({
  43. key: 'dropbox_key',
  44. secret: 'dropbox_secret',
  45. transport: 'session',
  46. "state": true,
  47. redirect_uri: 'http://localhost:3020/dropbox/redirect',
  48. authorize_url: 'https://www.dropbox.com/oauth2/authorize',
  49. access_url: 'https://api.dropbox.com/oauth2/token',
  50. callback: '/dropbox/callback',
  51. custom_params: {
  52. token_access_type: 'offline',
  53. },
  54. })
  55. expect(grantConfig.box).toEqual({
  56. key: 'box_key',
  57. secret: 'box_secret',
  58. transport: 'session',
  59. "state": true,
  60. redirect_uri: 'http://localhost:3020/box/redirect',
  61. authorize_url: 'https://account.box.com/api/oauth2/authorize',
  62. access_url: 'https://api.box.com/oauth2/token',
  63. callback: '/box/callback',
  64. })
  65. expect(grantConfig.googledrive).toEqual({
  66. access_url: "https://oauth2.googleapis.com/token",
  67. authorize_url: "https://accounts.google.com/o/oauth2/v2/auth",
  68. oauth: 2,
  69. scope_delimiter: " ",
  70. key: 'google_key',
  71. secret: 'google_secret',
  72. transport: 'session',
  73. "state": true,
  74. redirect_uri: 'http://localhost:3020/drive/redirect',
  75. scope: [
  76. 'https://www.googleapis.com/auth/drive.readonly',
  77. ],
  78. callback: '/drive/callback',
  79. custom_params: {
  80. access_type: 'offline',
  81. prompt: 'consent',
  82. },
  83. })
  84. expect(grantConfig.googlephotos).toEqual({
  85. access_url: "https://oauth2.googleapis.com/token",
  86. authorize_url: "https://accounts.google.com/o/oauth2/v2/auth",
  87. oauth: 2,
  88. scope_delimiter: " ",
  89. key: 'google_key',
  90. secret: 'google_secret',
  91. transport: 'session',
  92. "state": true,
  93. redirect_uri: 'http://localhost:3020/googlephotos/redirect',
  94. scope: ['https://www.googleapis.com/auth/photoslibrary.readonly', 'https://www.googleapis.com/auth/userinfo.email'],
  95. callback: '/googlephotos/callback',
  96. custom_params: {
  97. access_type: 'offline',
  98. prompt: 'consent',
  99. },
  100. })
  101. expect(grantConfig.zoom).toEqual({
  102. key: 'zoom_key',
  103. secret: 'zoom_secret',
  104. transport: 'session',
  105. "state": true,
  106. authorize_url: 'https://zoom.us/oauth/authorize',
  107. redirect_uri: 'http://localhost:3020/zoom/redirect',
  108. access_url: 'https://zoom.us/oauth/token',
  109. callback: '/zoom/callback',
  110. })
  111. })
  112. test('adds provider options for secret files', () => {
  113. process.env.COMPANION_DROPBOX_SECRET_FILE = `${process.env.PWD}/test/resources/dropbox_secret_file`
  114. process.env.COMPANION_BOX_SECRET_FILE = `${process.env.PWD}/test/resources/box_secret_file`
  115. process.env.COMPANION_GOOGLE_SECRET_FILE = `${process.env.PWD}/test/resources/google_secret_file`
  116. process.env.COMPANION_INSTAGRAM_SECRET_FILE = `${process.env.PWD}/test/resources/instagram_secret_file`
  117. process.env.COMPANION_ZOOM_SECRET_FILE = `${process.env.PWD}/test/resources/zoom_secret_file`
  118. process.env.COMPANION_ZOOM_VERIFICATION_TOKEN_FILE = `${process.env.PWD}/test/resources/zoom_verification_token_file`
  119. companionOptions = getCompanionOptions()
  120. providerManager.addProviderOptions(companionOptions, grantConfig, getOauthProvider)
  121. expect(grantConfig.dropbox.secret).toBe('xobpord')
  122. expect(grantConfig.box.secret).toBe('xwbepqd')
  123. expect(grantConfig.googledrive.secret).toBe('elgoog')
  124. expect(grantConfig.googlephotos.secret).toBe('elgoog')
  125. expect(grantConfig.instagram.secret).toBe('margatsni')
  126. expect(grantConfig.zoom.secret).toBe('u8Z5ceq')
  127. expect(companionOptions.providerOptions.zoom.verificationToken).toBe('o0u8Z5c')
  128. })
  129. test('does not add provider options if protocol and host are not set', () => {
  130. delete companionOptions.server.host
  131. delete companionOptions.server.protocol
  132. providerManager.addProviderOptions(companionOptions, grantConfig, getOauthProvider)
  133. expect(grantConfig.dropbox.key).toBeUndefined()
  134. expect(grantConfig.dropbox.secret).toBeUndefined()
  135. expect(grantConfig.box.key).toBeUndefined()
  136. expect(grantConfig.box.secret).toBeUndefined()
  137. expect(grantConfig.googledrive.key).toBeUndefined()
  138. expect(grantConfig.googledrive.secret).toBeUndefined()
  139. expect(grantConfig.googlephotos.key).toBeUndefined()
  140. expect(grantConfig.googlephotos.secret).toBeUndefined()
  141. expect(grantConfig.instagram.key).toBeUndefined()
  142. expect(grantConfig.instagram.secret).toBeUndefined()
  143. expect(grantConfig.zoom.key).toBeUndefined()
  144. expect(grantConfig.zoom.secret).toBeUndefined()
  145. })
  146. test('sets a main redirect uri, if oauthDomain is set', () => {
  147. companionOptions.server.oauthDomain = 'domain.com'
  148. providerManager.addProviderOptions(companionOptions, grantConfig, getOauthProvider)
  149. expect(grantConfig.dropbox.redirect_uri).toBe('http://domain.com/dropbox/redirect')
  150. expect(grantConfig.box.redirect_uri).toBe('http://domain.com/box/redirect')
  151. expect(grantConfig.googledrive.redirect_uri).toBe('http://domain.com/drive/redirect')
  152. expect(grantConfig.googlephotos.redirect_uri).toBe('http://domain.com/googlephotos/redirect')
  153. expect(grantConfig.instagram.redirect_uri).toBe('http://domain.com/instagram/redirect')
  154. expect(grantConfig.zoom.redirect_uri).toBe('http://domain.com/zoom/redirect')
  155. })
  156. })
  157. describe('Test Custom Provider options', () => {
  158. test('adds custom provider options', () => {
  159. const providers = providerManager.getDefaultProviders()
  160. providerManager.addCustomProviders({
  161. foo: {
  162. config: {
  163. key: 'foo_key',
  164. secret: 'foo_secret',
  165. },
  166. module: { oauthProvider: 'some_provider' },
  167. },
  168. }, providers, grantConfig)
  169. expect(grantConfig.some_provider.key).toBe('foo_key')
  170. expect(grantConfig.some_provider.secret).toBe('foo_secret')
  171. expect(providers.foo).toBeTruthy()
  172. })
  173. })