remove_client.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. const minimist = require('minimist')
  2. const { ReadPreference } = require('mongodb')
  3. const { waitForDb, db } = require('../../app/src/infrastructure/mongodb')
  4. async function main() {
  5. const opts = parseArgs()
  6. await waitForDb()
  7. const application = await getApplication(opts.clientId)
  8. if (application == null) {
  9. console.error(`Client configuration not found: ${opts.clientId}`)
  10. process.exit(1)
  11. }
  12. if (opts.commit) {
  13. console.log(
  14. `Preparing to remove OAuth client configuration: ${application.name}.`
  15. )
  16. const deletedAccessTokens = await deleteAccessTokens(application._id)
  17. console.log(`Deleted ${deletedAccessTokens} access tokens`)
  18. const deletedAuthorizationCodes = await deleteAuthorizationCodes(
  19. application._id
  20. )
  21. console.log(`Deleted ${deletedAuthorizationCodes} authorization codes`)
  22. await deleteApplication(application._id)
  23. console.log('Deleted OAuth client configuration')
  24. } else {
  25. console.log(
  26. `Preparing to remove OAuth client configuration (dry run): ${application.name}.`
  27. )
  28. const accessTokenCount = await countAccessTokens(application._id)
  29. const authorizationCodeCount = await countAuthorizationCodes(
  30. application._id
  31. )
  32. console.log(
  33. `This would delete ${accessTokenCount} access tokens and ${authorizationCodeCount} authorization codes.`
  34. )
  35. console.log('This was a dry run. Rerun with --commit to proceed.')
  36. }
  37. }
  38. async function getApplication(clientId) {
  39. return await db.oauthApplications.findOne({ id: clientId })
  40. }
  41. async function countAccessTokens(applicationId) {
  42. return await db.oauthAccessTokens.count(
  43. {
  44. oauthApplication_id: applicationId,
  45. },
  46. { readPreference: ReadPreference.secondary }
  47. )
  48. }
  49. async function countAuthorizationCodes(applicationId) {
  50. return await db.oauthAuthorizationCodes.count(
  51. {
  52. oauthApplication_id: applicationId,
  53. },
  54. { readPreference: ReadPreference.secondary }
  55. )
  56. }
  57. async function deleteAccessTokens(applicationId) {
  58. const res = await db.oauthAccessTokens.deleteMany({
  59. oauthApplication_id: applicationId,
  60. })
  61. return res.deletedCount
  62. }
  63. async function deleteAuthorizationCodes(applicationId) {
  64. const res = await db.oauthAuthorizationCodes.deleteMany({
  65. oauthApplication_id: applicationId,
  66. })
  67. return res.deletedCount
  68. }
  69. async function deleteApplication(applicationId) {
  70. await db.oauthApplications.deleteOne({ _id: applicationId })
  71. }
  72. function parseArgs() {
  73. const args = minimist(process.argv.slice(2), {
  74. boolean: ['help', 'commit'],
  75. })
  76. if (args.help) {
  77. usage()
  78. process.exit(0)
  79. }
  80. if (args._.length !== 1) {
  81. usage()
  82. process.exit(1)
  83. }
  84. return {
  85. clientId: args._[0],
  86. commit: args.commit,
  87. }
  88. }
  89. function usage() {
  90. console.error(`Usage: remove_client.js [OPTS...] CLIENT_ID
  91. Removes an OAuth client configuration and all associated tokens and
  92. authorization codes
  93. Options:
  94. --commit Really delete the OAuth application (will do a dry run by default)
  95. `)
  96. }
  97. main()
  98. .then(() => {
  99. process.exit(0)
  100. })
  101. .catch(err => {
  102. console.error(err)
  103. process.exit(1)
  104. })