annotate cutils/genpwd.py @ 229:788f14425503

Move the original genpwd.py into cutils. Does not run yet.
author Franz Glasner <fzglas.hg@dom66.de>
date Fri, 07 Feb 2025 12:48:26 +0100
parents genpwd.py@4bb2d0975cfe
children ccbb6905914e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
227
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
1 #!/usr/local/bin/python3
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
2 # -*- coding: utf-8 -*-
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
3 #
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
4 # @(#)$Id: //Administration/Server/Konfiguration/Dateien/_main/fmgbackup4/root/bin/genpwd.py#1 $
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
5 # $Change: 28588 $ $DateTime: 2018/10/31 13:11:48 $ $Author: fag $
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
6 #
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
7 r"""Generate passwords.
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
8
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
9 Usage: genpwd.py [ Options ] required_length
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
10
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
11 Options:
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
12
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
13 --type, -t web, web-safe, web-safe2, base64, base32, ascii85
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
14
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
15 :Author: Franz Glasner
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
16
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
17 """
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
18
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
19 from __future__ import (division, absolute_import, print_function)
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
20
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
21 __author__ = "Franz Glasner"
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
22
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
23 __version__ = "0.1"
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
24
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
25
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
26 import getopt
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
27 import sys
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
28 import os
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
29 import base64
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
30
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
31
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
32 WEB_CHARS = b"ABCDEFGHIJKLMNOPQRSTUVWYXZabcdefghijklmnopqrstuvwxyz0123456789.,-_;!()[]{}*"
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
33 WEB_SAFE_CHARS = b"ABCDEFGHJKLMNPQRSTUVWYXZabcdefghijkmnopqrstuvwxyz23456789.,-_;!"
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
34 WEB_SAFE2_CHARS = b".,-_;!" + WEB_SAFE_CHARS
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
35
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
36 PY2 = sys.version_info[0] <= 2
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
37
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
38
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
39 def main():
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
40 opt_type = "web-safe2"
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
41 opts, args = getopt.getopt(sys.argv[1:],
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
42 "t:",
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
43 ["type="])
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
44 for opt, val in opts:
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
45 if opt in ("-t", "--type"):
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
46 if val not in ("web", "web-safe", "web-safe2",
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
47 "base64", "base32", "ascii85", ):
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
48 raise getopt.GetoptError("invalid type: %s" % val, "")
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
49 opt_type = val
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
50 else:
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
51 raise RuntimeError("inconsistent getopt handling")
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
52
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
53 try:
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
54 req_length = int(args[0], 10)
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
55 except IndexError:
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
56 raise getopt.GetoptError("no length given")
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
57
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
58 if opt_type == "web":
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
59 pwd = gen_web(req_length, WEB_CHARS)
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
60 elif opt_type == "web-safe":
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
61 pwd = gen_web(req_length, WEB_SAFE_CHARS)
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
62 elif opt_type == "web-safe2":
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
63 pwd = gen_web(req_length, WEB_SAFE2_CHARS)
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
64 elif opt_type == "base64":
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
65 encoder = base64.b64encode
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
66 pwd = gen_bin(req_length, encoder)
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
67 elif opt_type == "base32":
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
68 encoder = base64.b32encode
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
69 pwd = gen_bin(req_length, encoder)
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
70 elif opt_type == "ascii85":
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
71 encoder = base64.a85encode
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
72 pwd = gen_bin(req_length, encoder)
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
73 else:
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
74 raise NotImplementedError("type not yet implemented: %s" % opt_type)
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
75 print(pwd)
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
76
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
77
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
78 def gen_web(length, chars):
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
79 mult = 256//len(chars)
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
80 repertoire = chars * mult
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
81 assert len(repertoire) <= 256
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
82 pwd = []
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
83 while len(pwd) < length:
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
84 c = os.urandom(1)
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
85 if PY2:
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
86 c = ord(c)
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
87 else:
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
88 c = c[0]
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
89 if c < len(repertoire):
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
90 pwd.append(repertoire[c])
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
91 if PY2:
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
92 pwd = b''.join(pwd)
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
93 else:
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
94 pwd = bytes(pwd)
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
95 return pwd
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
96
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
97
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
98 def gen_bin(length, encoder):
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
99 pwd = encoder(os.urandom(length))
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
100 return pwd[:length]
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
101
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
102
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
103 if __name__ == "__main__":
4bb2d0975cfe imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff changeset
104 main()