def send(secret, expires, outmode, outformat): """Submit secret to server. Optionally pipe secret via stdin. """ backend = os.environ.get("YOPASS_BACKEND_URL") if backend is None: click.echo("""YOPASS_BACKEND_URL is not defined, run export YOPASS_BACKEND_URL=<your backend> first""") exit(1) frontend = os.environ.get("YOPASS_FRONTEND_URL") if frontend is None and outmode != "id": click.echo("""YOPASS_FRONTEND_URL is not defined, run export YOPASS_FRONTEND_URL=<your frontend> first""") exit(1) try: secret = secret.read() except AttributeError: pass passphrase = generate_passphrase(15) cypherdict = SJCL().encrypt(secret.encode(), passphrase) converted_cypherdict = {} for key, value in cypherdict.items(): try: converted_cypherdict[key] = value.decode("utf-8") except AttributeError: converted_cypherdict[key] = value expiry_dict = {"1h": 3600, "1d": 86400, "1w": 604800} payload = { "expiration": expiry_dict[expires], "secret": json.dumps(converted_cypherdict), } response = {} try: response = requests.post("{:s}/secret".format(backend), data=json.dumps(payload)) except requests.exceptions.HTTPError as errh: click.echo("HTTP Error: {:s}".format(errh)) exit(1) except requests.exceptions.ConnectionError as errc: click.echo("Error Connecting: {:s}".format(errc)) exit(1) except requests.exceptions.Timeout as errt: click.echo("Timeout: {:s}".format(errt)) exit(1) except requests.exceptions.RequestException as err: click.echo("Request Exception: {:s}".format(err)) exit(1) secret_id = json.loads(response.text)["message"] one_click_link = "{:s}/#/s/{:s}/{:s}".format(frontend, secret_id, passphrase) short_link = "{:s}/#/s/{:s}".format(frontend, secret_id) if outmode == "verbose": if outformat == "json": click.echo( json.dumps({ "one-click-link": one_click_link, "short-link": short_link, "decryption-key": passphrase, })) else: click.echo(one_click_link) click.echo(short_link) click.echo(passphrase) elif outmode == "short-link": if outformat == "json": click.echo( json.dumps({ "short-link": short_link, "decryption-key": passphrase })) else: click.echo(short_link) click.echo(passphrase) elif outmode == "id": if outformat == "json": click.echo( json.dumps({ "id": secret_id, "decryption-key": passphrase })) else: click.echo(secret_id) click.echo(passphrase) elif outmode == "one-click-link": if outformat == "json": click.echo(json.dumps({"one-click-link": one_click_link})) else: click.echo(one_click_link)
chrome_dir = sys.argv[1] ext_id = sys.argv[2] cryptpw = sys.argv[3] settings = data['settings'] accounts = settings['accounts'] encrypted_accounts = SJCL().encrypt(bytes(json.dumps(accounts), encoding='utf-8'), cryptpw, count=1000, dkLen=32) json_accounts = json.dumps({ x: str(y, encoding='utf-8') if isinstance(y, bytes) else y for x, y in encrypted_accounts.items() }) settings['accounts'] = str(base64.b64encode( bytes(json_accounts, encoding='utf-8')), encoding='utf-8') data['settings'] = json.dumps(settings) data['activeTab'] = '"search"' db_path = path.join(chrome_dir, "Default/Local Extension Settings", ext_id) db = plyvel.DB(db_path, create_if_missing=True) for k, v in data.items(): db.put(bytes(k, encoding='utf-8'), bytes(v, encoding='utf-8')) db.close()