tools.utils

Yohn Y. 2025-05-01

4:c4bc2d77d4be Go to Latest

tools.utils/pw/aw_pw_tool

+ Утилита трансляции паролей

History
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/pw/aw_pw_tool	Thu May 01 13:41:43 2025 +0300
     1.3 @@ -0,0 +1,146 @@
     1.4 +#!/usr/bin/env python3
     1.5 +# devel.a0fs.ru -- TOOLS:SEC:aw_pw_tool -- v0.r202505.1
     1.6 +# devel.a0fs.ru -- TOOLS:SEC:safe_pw -- v0.r202409.2
     1.7 +# devel.a0fs.ru -- pwtrns.py -- v0.r202402.8
     1.8 +
     1.9 +from sys import stdin, stdout, stderr
    1.10 +from random import seed as rnd_seed, choice as rnd_choice
    1.11 +from argparse import ArgumentParser
    1.12 +from string import ascii_letters, digits
    1.13 +from typing import List, Iterable, Optional
    1.14 +
    1.15 +
    1.16 +### VAR
    1.17 +SAFECH= {
    1.18 +    'def': '%-=_;:+/,.@',
    1.19 +    'url': '-._',
    1.20 +}
    1.21 +
    1.22 +TRDICT = {
    1.23 +    'f': 'а', ',': 'б', 'd': 'в', 'u': 'г', 'l': 'д', 't': 'е', '`': 'ё',
    1.24 +    ';': 'ж', 'p': 'з', 'b': 'и', 'q': 'й', 'r': 'к', 'k': 'л', 'v': 'м',
    1.25 +    'y': 'н', 'j': 'о', 'g': 'п', 'h': 'р', 'c': 'с', 'n': 'т', 'e': 'у',
    1.26 +    'a': 'ф', '[': 'х', 'w': 'ц', 'x': 'ч', 'i': 'ш', 'o': 'щ', 'm': 'ь',
    1.27 +    's': 'ы', ']': 'ъ', "'": 'э', '.': 'ю', 'z': 'я', 'F': 'А', '<': 'Б',
    1.28 +    'D': 'В', 'U': 'Г', 'L': 'Д', 'T': 'Е', '~': 'Ё', ':': 'Ж', 'P': 'З',
    1.29 +    'B': 'И', 'Q': 'Й', 'R': 'К', 'K': 'Л', 'V': 'М', 'Y': 'Н', 'J': 'О',
    1.30 +    'G': 'П', 'H': 'Р', 'C': 'С', 'N': 'Т', 'E': 'У', 'A': 'Ф', '{': 'Х',
    1.31 +    'W': 'Ц', 'X': 'Ч', 'I': 'Ш', 'O': 'Щ', 'M': 'Ь', 'S': 'Ы', '}': 'Ъ',
    1.32 +    '"': 'Э', '>': 'Ю', 'Z': 'Я',
    1.33 +}
    1.34 +
    1.35 +GOODPWCH=ascii_letters + digits + ' '
    1.36 +
    1.37 +
    1.38 +### FUNC
    1.39 +def err(msg: str):
    1.40 +    for l in msg.splitlines():
    1.41 +        stderr.write(f'ERR: {l}\n')
    1.42 +
    1.43 +
    1.44 +def out(s: str):
    1.45 +    stdout.write(f'{s}\n')
    1.46 +
    1.47 +
    1.48 +def panic(code, msg):
    1.49 +    err(msg)
    1.50 +    exit(code)
    1.51 +
    1.52 +
    1.53 +def ptr_reverse(d: dict) -> dict:
    1.54 +    return dict([(v, k) for k, v in d.items()])
    1.55 +
    1.56 +
    1.57 +def get_args(words: Optional[List[str]]) -> Iterable[str]:
    1.58 +    if words and isinstance(words, (tuple, list)):
    1.59 +        for i in words:
    1.60 +            yield i.strip()
    1.61 +    
    1.62 +    else:
    1.63 +        for i in stdin:
    1.64 +            yield i.strip()
    1.65 +
    1.66 +def out_res(flag: bool, word: str, tr_word: str):
    1.67 +    if flag:
    1.68 +        out(f'"{word}" -> "{tr_word}"')
    1.69 +    
    1.70 +    else:
    1.71 +        out(f'{tr_word}')
    1.72 +
    1.73 +
    1.74 +# ARGS
    1.75 +ap = ArgumentParser(
    1.76 +    prog='aw_pw_tool', 
    1.77 +    description='Инструмент для работы с паролями, их преобразованием и трансляцией'
    1.78 +)
    1.79 +
    1.80 +ap.add_argument('-u', '--url', action='store_true', default=False,
    1.81 +                help='Режим фильтрации пароля от опасных для url символов'
    1.82 +                )
    1.83 +
    1.84 +ap.add_argument('-S', '--show-passwd', action='store_true', default=False,
    1.85 +                help='Показывать пароли до преобразования'
    1.86 +                )
    1.87 +
    1.88 +ap.add_argument('-t', '--pwtrans', action='store_true', default=False,
    1.89 +                help='Режим трансляции паролей из английской в русскую раскладку')
    1.90 +
    1.91 +ap.add_argument('-r', '--reverse', action='store_true', default=False, 
    1.92 +                help='Для трансляции паролей: переводим из русской в английскую раскладку')
    1.93 +
    1.94 +
    1.95 +ap.add_argument('word', nargs='*', help='Слово для перевода')
    1.96 +
    1.97 +
    1.98 +### DO
    1.99 +try:
   1.100 +    args = ap.parse_args()
   1.101 +
   1.102 +    if args.pwtrans:
   1.103 +        if args.reverse:
   1.104 +            d = ptr_reverse(TRDICT)
   1.105 +
   1.106 +        else:
   1.107 +            d = TRDICT
   1.108 +
   1.109 +        for w in get_args(args.word):
   1.110 +            out_res(
   1.111 +                args.show_passwd, 
   1.112 +                w, 
   1.113 +                ''.join(map(lambda x: d[x] if x in d else x, w))
   1.114 +            )
   1.115 +
   1.116 +    else:
   1.117 +        # Init random generator
   1.118 +        rnd_seed()
   1.119 +
   1.120 +        if args.url:
   1.121 +            cur_safe_ch = SAFECH['url']
   1.122 +        
   1.123 +        else:
   1.124 +            cur_safe_ch = SAFECH['def']
   1.125 +
   1.126 +        GOODPWCH += cur_safe_ch
   1.127 +
   1.128 +        for w in get_args(args.word):
   1.129 +            if len(w) == 0:
   1.130 +                break
   1.131 +                
   1.132 +            buf = ''
   1.133 +            for c in w:
   1.134 +                if c not in GOODPWCH:
   1.135 +                    c = rnd_choice(cur_safe_ch)
   1.136 +            
   1.137 +                buf += c
   1.138 +
   1.139 +            out_res(
   1.140 +                args.show_passwd,
   1.141 +                w,
   1.142 +                buf
   1.143 +            )
   1.144 +
   1.145 +except Exception as e:
   1.146 +    err(f'{type(e).__name__}: {e}')
   1.147 +    
   1.148 +except KeyboardInterrupt:
   1.149 +    exit()