Simple email application for Android. Original source code: https://framagit.org/dystopia-project/simple-email
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

419 lines
15 KiB

  1. var fs = require('fs')
  2. var path = require('path')
  3. var mocha = require('mocha')
  4. var assert = require('assert')
  5. var requireUncached = require('require-uncached')
  6. var npmRcPath = path.join(__dirname, '..', '.npmrc')
  7. var afterEach = mocha.afterEach
  8. var describe = mocha.describe
  9. var it = mocha.it
  10. var base64 = require('../base64')
  11. var decodeBase64 = base64.decodeBase64
  12. var encodeBase64 = base64.encodeBase64
  13. /* eslint max-nested-callbacks: ["error", 4] */
  14. describe('auth-token', function () {
  15. afterEach(function (done) {
  16. fs.unlink(npmRcPath, function () {
  17. done()
  18. })
  19. })
  20. it('should read global if no local is found', function () {
  21. var getAuthToken = requireUncached('../index')
  22. getAuthToken()
  23. })
  24. it('should return undefined if no auth token is given for registry', function (done) {
  25. fs.writeFile(npmRcPath, 'registry=http://registry.npmjs.eu/', function (err) {
  26. var getAuthToken = requireUncached('../index')
  27. assert(!err, err)
  28. assert(!getAuthToken())
  29. done()
  30. })
  31. })
  32. describe('legacy auth token', function () {
  33. it('should return auth token if it is defined in the legacy way via the `_auth` key', function (done) {
  34. var content = [
  35. '_auth=foobar',
  36. 'registry=http://registry.foobar.eu/'
  37. ].join('\n')
  38. fs.writeFile(npmRcPath, content, function (err) {
  39. var getAuthToken = requireUncached('../index')
  40. assert(!err, err)
  41. assert.deepEqual(getAuthToken(), {token: 'foobar', type: 'Basic'})
  42. done()
  43. })
  44. })
  45. })
  46. describe('bearer token', function () {
  47. it('should return auth token if registry is defined', function (done) {
  48. var content = [
  49. 'registry=http://registry.foobar.eu/',
  50. '//registry.foobar.eu/:_authToken=foobar', ''
  51. ].join('\n')
  52. fs.writeFile(npmRcPath, content, function (err) {
  53. var getAuthToken = requireUncached('../index')
  54. assert(!err, err)
  55. assert.deepEqual(getAuthToken(), {token: 'foobar', type: 'Bearer'})
  56. done()
  57. })
  58. })
  59. it('should use npmrc passed in', function (done) {
  60. var content = [
  61. 'registry=http://registry.foobar.eu/',
  62. '//registry.foobar.eu/:_authToken=foobar', ''
  63. ].join('\n')
  64. fs.writeFile(npmRcPath, content, function (err) {
  65. var getAuthToken = requireUncached('../index')
  66. assert(!err, err)
  67. const npmrc = {
  68. 'registry': 'http://registry.foobar.eu/',
  69. '//registry.foobar.eu/:_authToken': 'qar'
  70. }
  71. assert.deepEqual(getAuthToken({npmrc: npmrc}), {token: 'qar', type: 'Bearer'})
  72. done()
  73. })
  74. })
  75. it('should return auth token if registry url has port specified', function (done) {
  76. var content = [
  77. 'registry=http://localhost:8770/',
  78. // before the patch this token was selected.
  79. '//localhost/:_authToken=ohno',
  80. '//localhost:8770/:_authToken=beepboop', ''
  81. ].join('\n')
  82. fs.writeFile(npmRcPath, content, function (err) {
  83. var getAuthToken = requireUncached('../index')
  84. assert(!err, err)
  85. assert.deepEqual(getAuthToken(), {token: 'beepboop', type: 'Bearer'})
  86. done()
  87. })
  88. })
  89. it('should return auth token defined by reference to an environment variable (with curly braces)', function (done) {
  90. var environmentVariable = '__REGISTRY_AUTH_TOKEN_NPM_TOKEN__'
  91. var content = [
  92. 'registry=http://registry.foobar.cc/',
  93. '//registry.foobar.cc/:_authToken=${' + environmentVariable + '}', ''
  94. ].join('\n')
  95. process.env[environmentVariable] = 'foobar'
  96. fs.writeFile(npmRcPath, content, function (err) {
  97. var getAuthToken = requireUncached('../index')
  98. assert(!err, err)
  99. assert.deepEqual(getAuthToken(), {token: 'foobar', type: 'Bearer'})
  100. delete process.env[environmentVariable]
  101. done()
  102. })
  103. })
  104. it('should return auth token defined by reference to an environment variable (without curly braces)', function (done) {
  105. var environmentVariable = '__REGISTRY_AUTH_TOKEN_NPM_TOKEN__'
  106. var content = [
  107. 'registry=http://registry.foobar.cc/',
  108. '//registry.foobar.cc/:_authToken=$' + environmentVariable, ''
  109. ].join('\n')
  110. process.env[environmentVariable] = 'foobar'
  111. fs.writeFile(npmRcPath, content, function (err) {
  112. var getAuthToken = requireUncached('../index')
  113. assert(!err, err)
  114. assert.deepEqual(getAuthToken(), {token: 'foobar', type: 'Bearer'})
  115. delete process.env[environmentVariable]
  116. done()
  117. })
  118. })
  119. it('should try with and without a slash at the end of registry url', function (done) {
  120. var content = [
  121. 'registry=http://registry.foobar.eu',
  122. '//registry.foobar.eu:_authToken=barbaz', ''
  123. ].join('\n')
  124. fs.writeFile(npmRcPath, content, function (err) {
  125. var getAuthToken = requireUncached('../index')
  126. assert(!err, err)
  127. assert.deepEqual(getAuthToken(), {token: 'barbaz', type: 'Bearer'})
  128. done()
  129. })
  130. })
  131. it('should fetch for the registry given (if defined)', function (done) {
  132. var content = [
  133. '//registry.foobar.eu:_authToken=barbaz',
  134. '//registry.blah.foo:_authToken=whatev',
  135. '//registry.last.thing:_authToken=yep', ''
  136. ].join('\n')
  137. fs.writeFile(npmRcPath, content, function (err) {
  138. var getAuthToken = requireUncached('../index')
  139. assert(!err, err)
  140. assert.deepEqual(getAuthToken('//registry.blah.foo'), {token: 'whatev', type: 'Bearer'})
  141. done()
  142. })
  143. })
  144. it('recursively finds registries for deep url if option is set', function (done, undef) {
  145. var opts = {recursive: true}
  146. var content = [
  147. '//registry.blah.com/foo:_authToken=whatev',
  148. '//registry.blah.org/foo/bar:_authToken=recurseExactlyOneLevel',
  149. '//registry.blah.edu/foo/bar/baz:_authToken=recurseNoLevel',
  150. '//registry.blah.eu:_authToken=yep', ''
  151. ].join('\n')
  152. fs.writeFile(npmRcPath, content, function (err) {
  153. var getAuthToken = requireUncached('../index')
  154. assert(!err, err)
  155. assert.deepEqual(getAuthToken('https://registry.blah.edu/foo/bar/baz', opts), {token: 'recurseNoLevel', type: 'Bearer'})
  156. assert.deepEqual(getAuthToken('https://registry.blah.org/foo/bar/baz', opts), {token: 'recurseExactlyOneLevel', type: 'Bearer'})
  157. assert.deepEqual(getAuthToken('https://registry.blah.com/foo/bar/baz', opts), {token: 'whatev', type: 'Bearer'})
  158. assert.deepEqual(getAuthToken('http://registry.blah.eu/what/ever', opts), {token: 'yep', type: 'Bearer'})
  159. assert.deepEqual(getAuthToken('http://registry.blah.eu//what/ever', opts), undefined, 'does not hang')
  160. assert.equal(getAuthToken('//some.registry', opts), undef)
  161. done()
  162. })
  163. })
  164. it('should try both with and without trailing slash', function (done) {
  165. fs.writeFile(npmRcPath, '//registry.blah.com:_authToken=whatev', function (err) {
  166. var getAuthToken = requireUncached('../index')
  167. assert(!err, err)
  168. assert.deepEqual(getAuthToken('https://registry.blah.com'), {token: 'whatev', type: 'Bearer'})
  169. done()
  170. })
  171. })
  172. it('should prefer bearer token over basic token', function (done) {
  173. var content = [
  174. 'registry=http://registry.foobar.eu/',
  175. 'registry=http://registry.foobar.eu/',
  176. '//registry.foobar.eu/:_authToken=bearerToken',
  177. '//registry.foobar.eu/:_password=' + encodeBase64('foobar'),
  178. '//registry.foobar.eu/:username=foobar', ''
  179. ].join('\n')
  180. fs.writeFile(npmRcPath, content, function (err) {
  181. var getAuthToken = requireUncached('../index')
  182. assert(!err, err)
  183. assert.deepEqual(getAuthToken('//registry.foobar.eu'), {token: 'bearerToken', type: 'Bearer'})
  184. done()
  185. })
  186. })
  187. it('"nerf darts" registry urls', function (done, undef) {
  188. fs.writeFile(npmRcPath, '//contoso.pkgs.visualstudio.com/_packaging/MyFeed/npm/:_authToken=heider', function (err) {
  189. var getAuthToken = requireUncached('../index')
  190. assert(!err, err)
  191. assert.deepEqual(
  192. getAuthToken('https://contoso.pkgs.visualstudio.com/_packaging/MyFeed/npm/registry'),
  193. {token: 'heider', type: 'Bearer'}
  194. )
  195. done()
  196. })
  197. })
  198. })
  199. describe('basic token', function () {
  200. it('should return undefined if password or username are missing', function (done, undef) {
  201. var content = [
  202. 'registry=http://registry.foobar.eu/',
  203. '//registry.foobar.eu/:_password=' + encodeBase64('foobar'),
  204. '//registry.foobar.com/:username=foobar', ''
  205. ].join('\n')
  206. fs.writeFile(npmRcPath, content, function (err) {
  207. var getAuthToken = requireUncached('../index')
  208. assert(!err, err)
  209. assert.equal(getAuthToken('//registry.foobar.eu'), undef)
  210. assert.equal(getAuthToken('//registry.foobar.com'), undef)
  211. done()
  212. })
  213. })
  214. it('should return basic token if username and password are defined', function (done) {
  215. var content = [
  216. 'registry=http://registry.foobar.eu/',
  217. '//registry.foobar.eu/:_password=' + encodeBase64('foobar'),
  218. '//registry.foobar.eu/:username=foobar', ''
  219. ].join('\n')
  220. fs.writeFile(npmRcPath, content, function (err) {
  221. var getAuthToken = requireUncached('../index')
  222. assert(!err, err)
  223. var token = getAuthToken()
  224. assert.deepEqual(token, {
  225. token: 'Zm9vYmFyOmZvb2Jhcg==',
  226. type: 'Basic',
  227. username: 'foobar',
  228. password: 'foobar'
  229. })
  230. assert.equal(decodeBase64(token.token), 'foobar:foobar')
  231. done()
  232. })
  233. })
  234. it('should return basic token if registry url has port specified', function (done) {
  235. var content = [
  236. 'registry=http://localhost:8770/',
  237. // before the patch this token was selected.
  238. '//localhost/:_authToken=ohno',
  239. '//localhost:8770/:_password=' + encodeBase64('foobar'),
  240. '//localhost:8770/:username=foobar', ''
  241. ].join('\n')
  242. fs.writeFile(npmRcPath, content, function (err) {
  243. var getAuthToken = requireUncached('../index')
  244. assert(!err, err)
  245. var token = getAuthToken()
  246. assert.deepEqual(token, {
  247. token: 'Zm9vYmFyOmZvb2Jhcg==',
  248. type: 'Basic',
  249. username: 'foobar',
  250. password: 'foobar'
  251. })
  252. assert.equal(decodeBase64(token.token), 'foobar:foobar')
  253. done()
  254. })
  255. })
  256. it('should return password defined by reference to an environment variable (with curly braces)', function (done) {
  257. var environmentVariable = '__REGISTRY_PASSWORD__'
  258. var content = [
  259. 'registry=http://registry.foobar.cc/',
  260. '//registry.foobar.cc/:username=username',
  261. '//registry.foobar.cc/:_password=${' + environmentVariable + '}', ''
  262. ].join('\n')
  263. process.env[environmentVariable] = encodeBase64('password')
  264. fs.writeFile(npmRcPath, content, function (err) {
  265. var getAuthToken = requireUncached('../index')
  266. assert(!err, err)
  267. var token = getAuthToken()
  268. assert.deepEqual(token, {
  269. type: 'Basic',
  270. username: 'username',
  271. password: 'password',
  272. token: 'dXNlcm5hbWU6cGFzc3dvcmQ='
  273. })
  274. assert.equal(decodeBase64(token.token), 'username:password')
  275. delete process.env[environmentVariable]
  276. done()
  277. })
  278. })
  279. it('should return password defined by reference to an environment variable (without curly braces)', function (done) {
  280. var environmentVariable = '__REGISTRY_PASSWORD__'
  281. var content = [
  282. 'registry=http://registry.foobar.cc/',
  283. '//registry.foobar.cc/:username=username',
  284. '//registry.foobar.cc/:_password=$' + environmentVariable, ''
  285. ].join('\n')
  286. process.env[environmentVariable] = encodeBase64('password')
  287. fs.writeFile(npmRcPath, content, function (err) {
  288. var getAuthToken = requireUncached('../index')
  289. assert(!err, err)
  290. var token = getAuthToken()
  291. assert.deepEqual(token, {
  292. type: 'Basic',
  293. username: 'username',
  294. password: 'password',
  295. token: 'dXNlcm5hbWU6cGFzc3dvcmQ='
  296. })
  297. assert.equal(decodeBase64(token.token), 'username:password')
  298. delete process.env[environmentVariable]
  299. done()
  300. })
  301. })
  302. it('should try with and without a slash at the end of registry url', function (done) {
  303. var content = [
  304. 'registry=http://registry.foobar.eu',
  305. '//registry.foobar.eu:_password=' + encodeBase64('barbay'),
  306. '//registry.foobar.eu:username=barbaz', ''
  307. ].join('\n')
  308. fs.writeFile(npmRcPath, content, function (err) {
  309. var getAuthToken = requireUncached('../index')
  310. assert(!err, err)
  311. var token = getAuthToken()
  312. assert.deepEqual(token, {
  313. token: 'YmFyYmF6OmJhcmJheQ==',
  314. type: 'Basic',
  315. password: 'barbay',
  316. username: 'barbaz'
  317. })
  318. assert.equal(decodeBase64(token.token), 'barbaz:barbay')
  319. done()
  320. })
  321. })
  322. it('should fetch for the registry given (if defined)', function (done) {
  323. var content = [
  324. '//registry.foobar.eu:_authToken=barbaz',
  325. '//registry.blah.foo:_password=' + encodeBase64('barbay'),
  326. '//registry.blah.foo:username=barbaz',
  327. '//registry.last.thing:_authToken=yep', ''
  328. ].join('\n')
  329. fs.writeFile(npmRcPath, content, function (err) {
  330. var getAuthToken = requireUncached('../index')
  331. assert(!err, err)
  332. var token = getAuthToken('//registry.blah.foo')
  333. assert.deepEqual(token, {
  334. token: 'YmFyYmF6OmJhcmJheQ==',
  335. type: 'Basic',
  336. password: 'barbay',
  337. username: 'barbaz'
  338. })
  339. assert.equal(decodeBase64(token.token), 'barbaz:barbay')
  340. done()
  341. })
  342. })
  343. it('recursively finds registries for deep url if option is set', function (done, undef) {
  344. var opts = {recursive: true}
  345. var content = [
  346. '//registry.blah.com/foo:_password=' + encodeBase64('barbay'),
  347. '//registry.blah.com/foo:username=barbaz',
  348. '//registry.blah.eu:username=barbaz',
  349. '//registry.blah.eu:_password=' + encodeBase64('foobaz'), ''
  350. ].join('\n')
  351. fs.writeFile(npmRcPath, content, function (err) {
  352. var getAuthToken = requireUncached('../index')
  353. assert(!err, err)
  354. var token = getAuthToken('https://registry.blah.com/foo/bar/baz', opts)
  355. assert.deepEqual(token, {
  356. token: 'YmFyYmF6OmJhcmJheQ==',
  357. type: 'Basic',
  358. password: 'barbay',
  359. username: 'barbaz'
  360. })
  361. assert.equal(decodeBase64(token.token), 'barbaz:barbay')
  362. token = getAuthToken('https://registry.blah.eu/foo/bar/baz', opts)
  363. assert.deepEqual(token, {
  364. token: 'YmFyYmF6OmZvb2Jheg==',
  365. type: 'Basic',
  366. password: 'foobaz',
  367. username: 'barbaz'
  368. })
  369. assert.equal(decodeBase64(token.token), 'barbaz:foobaz')
  370. assert.equal(getAuthToken('//some.registry', opts), undef)
  371. done()
  372. })
  373. })
  374. })
  375. })