rpyc_vdbconf.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #! /usr/bin/env python
  2. """%prog <filename> [options]
  3. A simple configurator for tlslite's verifier databases (VDB), which allows you to:
  4. 1) list the usernames in a given vdb file
  5. 2) add / modify a username in the given vdb file
  6. 3) delete an existing username from the vdb file
  7. Examples:
  8. rpyc_vdbconf <filename> -l : list all users in `filename`
  9. rpyc_vdbconf <filename> -a <username> : add/replace `username` in `filename`
  10. rpyc_vdbconf <filename> -d <username> : delete `username` from `filename`
  11. SECURITY NOTE:
  12. Make sure the vdb file has the correct write permissions!
  13. """
  14. import sys
  15. import getpass
  16. from optparse import OptionParser
  17. from rpyc.utils.authenticators import VdbAuthenticator
  18. parser = OptionParser(usage = __doc__)
  19. parser.add_option("-l", "--list", action="store_true", dest="listonly",
  20. default=False, help="List usernames and exit")
  21. parser.add_option("-a", "--add", action="store", dest="add", metavar="USERNAME",
  22. default=None, help="Set the given username (required for -d or adding)")
  23. parser.add_option("-d", "--delete", action="store", dest="delete", metavar="USERNAME",
  24. default=None, help="Deletes the given username")
  25. def get_options():
  26. options, args = parser.parse_args()
  27. if len(args) != 1:
  28. parser.error("Missing filename!")
  29. if options.add and options.delete:
  30. parser.error("Options -a and -d are mutually exclusive!")
  31. options.filename = args[0]
  32. return options
  33. def list_users(vdb, options):
  34. users = sorted(vdb.list_users())
  35. if not users:
  36. print( "No users defined in %s:" % (options.filename,) )
  37. else:
  38. print( "Existing users in %s:" % (options.filename,) )
  39. for user in users:
  40. print " %s" % (user,)
  41. def del_user(vdb, options):
  42. username = options.delete
  43. if username not in vdb.list_users():
  44. sys.exit("User %s doesn't exist in %s" % (username, options.filename))
  45. print( "Removing user %s from %s" % (username, options.filename) )
  46. vdb.del_user(username)
  47. vdb.sync()
  48. def set_user(vdb, options):
  49. username = options.add
  50. if username in vdb.list_users():
  51. print( "Adding user %s to %s" % (username, options.filename) )
  52. else:
  53. print( "Changing user %s in %s" % (username, options.filename) )
  54. password1 = getpass.getpass("Password: ")
  55. password2 = getpass.getpass("Retype password: ")
  56. if password1 != password2:
  57. sys.exit("Passwords do not match!")
  58. if not password1:
  59. sys.exit("Password cannot be empty!")
  60. vdb.set_user(username, password1)
  61. vdb.sync()
  62. def main():
  63. options = get_options()
  64. vdb = VdbAuthenticator.from_file(options.filename)
  65. if options.listonly:
  66. list_users(vdb, options)
  67. elif options.delete:
  68. del_user(vdb, options)
  69. print( "OK" )
  70. elif options.add:
  71. set_user(vdb, options)
  72. print( "OK" )
  73. else:
  74. parser.error("No action specified")
  75. if __name__ == "__main__":
  76. main()