remove_client.js 3.1 KB

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