133 lines
3.8 KiB
Python
133 lines
3.8 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# CLI interface for the DeDRM plugin (useable without Calibre, too)
|
|
# Adobe PassHash implementation
|
|
|
|
from __future__ import absolute_import, print_function
|
|
|
|
# Copyright © 2021 NoDRM
|
|
|
|
"""
|
|
|
|
NOTE: This code is not functional (yet). I started working on it a while ago
|
|
to make a standalone version of the plugins that could work without Calibre,
|
|
too, but for now there's only a rough code structure and no working code yet.
|
|
|
|
Currently, to use these plugins, you will need to use Calibre. Hopwfully that'll
|
|
change in the future.
|
|
|
|
"""
|
|
|
|
#@@CALIBRE_COMPAT_CODE@@
|
|
|
|
import os, sys
|
|
|
|
from standalone.__init__ import print_opt, print_std_usage
|
|
|
|
iswindows = sys.platform.startswith('win')
|
|
isosx = sys.platform.startswith('darwin')
|
|
|
|
def print_passhash_help():
|
|
from __version import PLUGIN_NAME, PLUGIN_VERSION
|
|
print(PLUGIN_NAME + " v" + PLUGIN_VERSION + " - Calibre DRM removal plugin by noDRM")
|
|
print()
|
|
print("passhash: Manage Adobe PassHashes")
|
|
print()
|
|
print_std_usage("passhash", "[ -u username -p password | -b base64str ] [ -i ] ")
|
|
|
|
print()
|
|
print("Options: ")
|
|
print_opt("u", "username", "Generate a PassHash with the given username")
|
|
print_opt("p", "password", "Generate a PassHash with the given password")
|
|
print_opt("e", "extract", "Display PassHashes found on this machine")
|
|
print_opt("i", "import", "Import hashes into the JSON config file")
|
|
|
|
def perform_action(params, files):
|
|
user = None
|
|
pwd = None
|
|
|
|
if len(params) == 0:
|
|
print_passhash_help()
|
|
return 0
|
|
|
|
extract = False
|
|
import_to_json = True
|
|
|
|
while len(params) > 0:
|
|
p = params.pop(0)
|
|
if p == "--username":
|
|
user = params.pop(0)
|
|
elif p == "--password":
|
|
pwd = params.pop(0)
|
|
elif p == "--extract":
|
|
extract = True
|
|
elif p == "--help":
|
|
print_passhash_help()
|
|
return 0
|
|
elif p == "--import":
|
|
import_to_json = True
|
|
|
|
if not extract and not import_to_json:
|
|
if user is None:
|
|
print("Missing parameter: --username", file=sys.stderr)
|
|
if pwd is None:
|
|
print("Missing parameter: --password", file=sys.stderr)
|
|
if user is None or pwd is None:
|
|
return 1
|
|
|
|
if user is None and pwd is not None:
|
|
print("Parameter --password also requires --username", file=sys.stderr)
|
|
return 1
|
|
if user is not None and pwd is None:
|
|
print("Parameter --username also requires --password", file=sys.stderr)
|
|
return 1
|
|
|
|
if user is not None and pwd is not None:
|
|
from ignoblekeyGenPassHash import generate_key
|
|
key = generate_key(user, pwd)
|
|
if import_to_json:
|
|
# TODO: Import the key to the JSON
|
|
pass
|
|
|
|
print(key.decode("utf-8"))
|
|
|
|
if extract or import_to_json:
|
|
if not iswindows and not isosx:
|
|
print("Extracting PassHash keys not supported on Linux.", file=sys.stderr)
|
|
return 1
|
|
|
|
keys = []
|
|
|
|
from ignoblekeyNookStudy import nookkeys
|
|
keys.extend(nookkeys())
|
|
|
|
if iswindows:
|
|
from ignoblekeyWindowsStore import dump_keys
|
|
keys.extend(dump_keys())
|
|
|
|
from adobekey_get_passhash import passhash_keys
|
|
ade_keys, ade_names = passhash_keys()
|
|
keys.extend(ade_keys)
|
|
|
|
# Trim duplicates
|
|
newkeys = []
|
|
for k in keys:
|
|
if not k in newkeys:
|
|
newkeys.append(k)
|
|
|
|
# Print all found keys
|
|
for k in newkeys:
|
|
if import_to_json:
|
|
# TODO: Add keys to json
|
|
pass
|
|
|
|
if extract:
|
|
print(k)
|
|
|
|
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
print("This code is not intended to be executed directly!", file=sys.stderr) |