Mercurial > hgrepos > Python > apps > py-cutils
annotate cutils/genpwd.py @ 234:c7dc57c44e8b
FIX: For Python3: decode from ASCII before printing them: this removes the binary b'xxx' representation there
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Fri, 07 Feb 2025 13:43:14 +0100 |
| parents | 5f4c81313be7 |
| children | 11819361ea39 |
| rev | line source |
|---|---|
|
227
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
1 # -*- coding: utf-8 -*- |
|
230
ccbb6905914e
Change copyright and note genpwd in the READNE and make an official script
Franz Glasner <fzglas.hg@dom66.de>
parents:
229
diff
changeset
|
2 # :- |
|
ccbb6905914e
Change copyright and note genpwd in the READNE and make an official script
Franz Glasner <fzglas.hg@dom66.de>
parents:
229
diff
changeset
|
3 # :Copyright: (c) 2018 Franz Glasner |
|
ccbb6905914e
Change copyright and note genpwd in the READNE and make an official script
Franz Glasner <fzglas.hg@dom66.de>
parents:
229
diff
changeset
|
4 # :Copyright: (c) 2025 Franz Glasner |
|
ccbb6905914e
Change copyright and note genpwd in the READNE and make an official script
Franz Glasner <fzglas.hg@dom66.de>
parents:
229
diff
changeset
|
5 # :License: BSD-3-Clause |
|
ccbb6905914e
Change copyright and note genpwd in the READNE and make an official script
Franz Glasner <fzglas.hg@dom66.de>
parents:
229
diff
changeset
|
6 # :- |
|
227
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 |
|
231
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
21 import argparse |
|
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
22 import base64 |
|
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
23 import os |
|
227
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
24 import sys |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
25 |
|
230
ccbb6905914e
Change copyright and note genpwd in the READNE and make an official script
Franz Glasner <fzglas.hg@dom66.de>
parents:
229
diff
changeset
|
26 from . import (__version__, __revision__) |
|
ccbb6905914e
Change copyright and note genpwd in the READNE and make an official script
Franz Glasner <fzglas.hg@dom66.de>
parents:
229
diff
changeset
|
27 |
|
227
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
28 |
|
231
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
29 WEB_CHARS = b"ABCDEFGHIJKLMNOPQRSTUVWYXZabcdefghijklmnopqrstuvwxyz" \ |
|
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
30 b"0123456789.,-_;!()[]{}*" |
|
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
31 WEB_SAFE_CHARS = b"ABCDEFGHJKLMNPQRSTUVWYXZabcdefghijkmnopqrstuvwxyz" \ |
|
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
32 b"23456789.,-_;!" |
|
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
33 WEB_SAFE2_CHARS = b".,-_;!" + WEB_SAFE_CHARS # prefer punctionation chars |
|
227
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
34 |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
35 PY2 = sys.version_info[0] <= 2 |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
36 |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
37 |
|
231
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
38 def main(argv=None): |
|
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
39 aparser = argparse.ArgumentParser( |
|
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
40 description="A simple password generator for password of a given" |
|
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
41 " length within a character repertoire", |
|
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
42 fromfile_prefix_chars='@') |
|
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
43 aparser.add_argument( |
|
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
44 "--repertoire", "--type", "-t", |
|
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
45 choices=("web", "web-safe", "web-safe2", |
|
232
7ac8a2537bc9
Implement the urlsafe base64 character repertoire
Franz Glasner <fzglas.hg@dom66.de>
parents:
231
diff
changeset
|
46 "base64", "urlsafe-base64", "urlsafe", "base32", "ascii85", ), |
|
231
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
47 default="web-safe2", |
|
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
48 help="Select the character repertoire. Default: web-safe2") |
|
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
49 aparser.add_argument( |
|
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
50 "--version", "-v", action="version", |
|
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
51 version="%s (rv:%s)" % (__version__, __revision__)) |
|
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
52 aparser.add_argument( |
|
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
53 "req_length", metavar="OUTPUT-LENGTH", type=int, |
|
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
54 help="The required length of the generated password") |
|
227
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
55 |
|
231
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
56 opts = aparser.parse_args(args=argv) |
|
227
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
57 |
|
231
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
58 if opts.repertoire == "web": |
|
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
59 pwd = gen_web(opts.req_length, WEB_CHARS) |
|
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
60 elif opts.repertoire == "web-safe": |
|
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
61 pwd = gen_web(opts.req_length, WEB_SAFE_CHARS) |
|
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
62 elif opts.repertoire == "web-safe2": |
|
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
63 pwd = gen_web(opts.req_length, WEB_SAFE2_CHARS) |
|
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
64 elif opts.repertoire == "base64": |
|
227
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
65 encoder = base64.b64encode |
|
231
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
66 pwd = gen_bin(opts.req_length, encoder) |
|
232
7ac8a2537bc9
Implement the urlsafe base64 character repertoire
Franz Glasner <fzglas.hg@dom66.de>
parents:
231
diff
changeset
|
67 elif opts.repertoire in ("urlsafe-base64", "urlsafe"): |
|
7ac8a2537bc9
Implement the urlsafe base64 character repertoire
Franz Glasner <fzglas.hg@dom66.de>
parents:
231
diff
changeset
|
68 encoder = base64.urlsafe_b64encode |
|
7ac8a2537bc9
Implement the urlsafe base64 character repertoire
Franz Glasner <fzglas.hg@dom66.de>
parents:
231
diff
changeset
|
69 pwd = gen_bin(opts.req_length, encoder) |
|
231
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
70 elif opts.repertoire == "base32": |
|
227
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
71 encoder = base64.b32encode |
|
231
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
72 pwd = gen_bin(opts.req_length, encoder) |
|
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
73 elif opts.repertoire == "ascii85": |
|
227
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
74 encoder = base64.a85encode |
|
231
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
75 pwd = gen_bin(opts.req_length, encoder) |
|
227
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
76 else: |
|
231
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
77 raise NotImplementedError("type not yet implemented: %s" |
|
6d8443878a00
Use argparse in genpwd.py now.
Franz Glasner <fzglas.hg@dom66.de>
parents:
230
diff
changeset
|
78 % opts.repertoire) |
|
233
5f4c81313be7
Assert that the generated password has the required (output) length
Franz Glasner <fzglas.hg@dom66.de>
parents:
232
diff
changeset
|
79 assert len(pwd) == opts.req_length |
|
234
c7dc57c44e8b
FIX: For Python3: decode from ASCII before printing them: this removes the binary b'xxx' representation there
Franz Glasner <fzglas.hg@dom66.de>
parents:
233
diff
changeset
|
80 if not PY2: |
|
c7dc57c44e8b
FIX: For Python3: decode from ASCII before printing them: this removes the binary b'xxx' representation there
Franz Glasner <fzglas.hg@dom66.de>
parents:
233
diff
changeset
|
81 pwd = pwd.decode("ascii") |
|
227
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
82 print(pwd) |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
83 |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
84 |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
85 def gen_web(length, chars): |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
86 mult = 256//len(chars) |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
87 repertoire = chars * mult |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
88 assert len(repertoire) <= 256 |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
89 pwd = [] |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
90 while len(pwd) < length: |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
91 c = os.urandom(1) |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
92 if PY2: |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
93 c = ord(c) |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
94 else: |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
95 c = c[0] |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
96 if c < len(repertoire): |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
97 pwd.append(repertoire[c]) |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
98 if PY2: |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
99 pwd = b''.join(pwd) |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
100 else: |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
101 pwd = bytes(pwd) |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
102 return pwd |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
103 |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
104 |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
105 def gen_bin(length, encoder): |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
106 pwd = encoder(os.urandom(length)) |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
107 return pwd[:length] |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
108 |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
109 |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
110 if __name__ == "__main__": |
|
4bb2d0975cfe
imports: import genpwd,py from fmgbackup4.
Franz Glasner <fzglas.hg@dom66.de>
parents:
diff
changeset
|
111 main() |
