Module for generating a random password (#637)
Module for generating a random password and copying it to the clipboard with a double left click. It uses xsel or xclip.
This commit is contained in:
parent
56c6e04f84
commit
c37dd115e5
80
i3pystatus/random_password.py
Normal file
80
i3pystatus/random_password.py
Normal file
@ -0,0 +1,80 @@
|
||||
from i3pystatus import Module
|
||||
|
||||
import random
|
||||
import string
|
||||
import subprocess
|
||||
|
||||
|
||||
class RandomPassword(Module):
|
||||
"""
|
||||
Generates a random password and copies it to the clipboard. Useful if you use any password manager and you want to generate a password in the moment and save it later in you manager's database.
|
||||
|
||||
Uses `SystemRandom` class as a cryptographically secure pseudo-number generator - <https://docs.python.org/3/library/random.html#random.SystemRandom>
|
||||
|
||||
- Requires `xsel` or `xclip` for copying to the clipboard.
|
||||
- Generates a new password with a left click by default.
|
||||
- Generates a password with a default length of 12 and with lowercase, uppercase, digits and special symbols.
|
||||
|
||||
.. rubric:: Available formatters
|
||||
|
||||
* `{length}` — length of generated password
|
||||
"""
|
||||
|
||||
settings = (
|
||||
("format", "Format string to be displayed in the status bar"),
|
||||
("length", "Length of the generated password"),
|
||||
("charset", "Dictionary containing character types to be included in the password"),
|
||||
("cliptool", "Currently supports xsel and xclip"),
|
||||
("color", "HTML color hex code #RRGGBB"),
|
||||
)
|
||||
|
||||
format = ''
|
||||
length = 12
|
||||
charset = ['lowercase', 'uppercase', 'digits', 'special']
|
||||
cliptool = None
|
||||
color = None
|
||||
|
||||
on_doubleleftclick = 'generate_password'
|
||||
|
||||
def init(self):
|
||||
# Finds out if either xsel or xclip exist
|
||||
self._find_cliptool()
|
||||
|
||||
cdict = {
|
||||
'length': self.length
|
||||
}
|
||||
|
||||
self.output = {
|
||||
"full_text": self.format.format(**cdict)
|
||||
}
|
||||
|
||||
if self.color:
|
||||
self.output["color"] = self.color
|
||||
|
||||
def _find_cliptool(self):
|
||||
if subprocess.call(['which', 'xsel'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) == 0:
|
||||
self.cliptool = 'xsel'
|
||||
self._clip_params = ['-b', '-i']
|
||||
elif subprocess.call(['which', 'xclip'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) == 0:
|
||||
self.cliptool = 'xclip'
|
||||
self._clip_params = ['-selection', 'c']
|
||||
|
||||
# Asserts that either xsel or xclip was found
|
||||
assert self.cliptool and self._clip_params, 'It was no possible to find xsel or xclip installed in your system.'
|
||||
|
||||
def generate_password(self):
|
||||
# If a blank list is provided for the charset, it will generate an empty password
|
||||
chars = ''
|
||||
if 'lowercase' in self.charset:
|
||||
chars = string.ascii_lowercase
|
||||
if 'uppercase' in self.charset:
|
||||
chars += string.ascii_uppercase
|
||||
if 'digits' in self.charset:
|
||||
chars += string.digits
|
||||
if 'special' in self.charset:
|
||||
chars += string.punctuation
|
||||
|
||||
passwd = ''.join(random.SystemRandom().choice(chars) for x in range(self.length))
|
||||
|
||||
p = subprocess.Popen([self.cliptool, self._clip_params[0], self._clip_params[1]], stdin=subprocess.PIPE, close_fds=True)
|
||||
p.communicate(input=passwd.encode('utf-8'))
|
Loading…
Reference in New Issue
Block a user