123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- # Copyright (C) 2010 Internet Systems Consortium.
- #
- # Permission to use, copy, modify, and distribute this software for any
- # purpose with or without fee is hereby granted, provided that the above
- # copyright notice and this permission notice appear in all copies.
- #
- # THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SYSTEMS CONSORTIUM
- # DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
- # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
- # INTERNET SYSTEMS CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
- # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
- # FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
- # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
- # WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- '''
- This file implements user management program. The user name and
- its password is appended in csv file.
- '''
- import random
- from hashlib import sha1
- import csv
- import getpass
- import getopt
- import sys
- VERSION_NUMBER = 'bind10'
- DEFAULT_FILE = 'passwd.csv'
- def gen_password_hash(password):
- salt = "".join(chr(random.randint(33, 127)) for x in range(64))
- saltedpwd = sha1((password + salt).encode()).hexdigest()
- return salt, saltedpwd
- def username_exist(name, filename):
- # The file may doesn't exist.
- exist = False
- csvfile = None
- try:
- csvfile = open(filename)
- reader = csv.reader(csvfile)
- for row in reader:
- if name == row[0]:
- exist = True
- break
- except Exception:
- pass
-
- if csvfile:
- csvfile.close()
- return exist
- def save_userinfo(username, pw, salt, filename):
- csvfile = open(filename, 'a')
- writer = csv.writer(csvfile)
- writer.writerow([username, pw, salt])
- csvfile.close()
- print("add user success!")
- def usage():
- print('''Usage: usermgr [options]
- -h, --help \t Show this help message and exit
- -f, --file \t Specify the file to append user name and password
- -v, --version\t Get version number
- ''')
- def main():
- filename = DEFAULT_FILE
- try:
- opts, args = getopt.getopt(sys.argv[1:], 'hvf:',
- ['help', 'file=', 'version='])
- except getopt.GetoptError as err:
- print(err)
- usage()
- sys.exit(2)
- for op, param in opts:
- if op in ('-h', '--help'):
- usage()
- sys.exit()
- elif op in ('-v', '--version'):
- print(VERSION_NUMBER)
- sys.exit()
- elif op in ('-f', "--file"):
- filename = param
- else:
- assert False, 'unknown option'
- usage()
-
- try:
- while True :
- name = input("Desired Login Name:")
- if username_exist(name, filename):
- print("The usename already exist!")
- continue
- while True:
- pwd1 = getpass.getpass("Choose a password:")
- pwd2 = getpass.getpass("Re-enter password:")
- if pwd1 != pwd2:
- print("password is not same, please input again")
- else:
- break;
-
- salt, pw = gen_password_hash(pwd1)
- save_userinfo(name, pw, salt, filename)
- inputdata = input('continue by input \'y\' or \'Y\':')
- if inputdata not in ['y', 'Y']:
- break
-
- except KeyboardInterrupt:
- pass
- if __name__ == '__main__':
- main()
|