Add script to generate save files with custom keys

Allow users to play with keys generated outside Tox core without
depending on features from any specific client. Just generate a
stub save file that every client will understand.
pull/1238/head
Alexandre Erwin Ittner 2015-02-01 12:23:14 -02:00
parent 33f65929e3
commit ef0922cf9f
1 changed files with 122 additions and 0 deletions

122
other/fun/make-funny-savefile.py Executable file
View File

@ -0,0 +1,122 @@
#!/usr/bin/python
"""
Generate a new (and empty) save file with predefined keys. Used to play
with externally generated keys.
(c) 2015 Alexandre Erwin Ittner
Distributed under the GNU GPL v3 or later, WITHOUT ANY WARRANTY. See the
file "COPYING" for license information.
Usage:
./make-funny-savefile.py <public key> <private key> <user name> <out file>
The new user profile will be saved to <out file>.
The keys must be an hex-encoded valid key pair generated by any means
(eg. strkey.c); username may be anything. A random nospam value will be
generated.
Once the savefile is done, load it in your favorite client to get some
DHT nodes, set status and status messages, add friends, etc.
Example (of course, do not try using this key for anything real):
./make-funny-savefile.py 123411DC8B1A4760B648E0C7243B65F01069E4858F45C612CE1A6F673B603830 CC39440CFC063E4A95B7F2FB2580210558BE5C073AFC1C9604D431CCA3132238 "Test user" test.tox
"""
PUBLIC_KEY_LENGTH = 32
PRIVATE_KEY_LENGTH = 32
# Constants taken from messenger.c
MESSENGER_STATE_COOKIE_GLOBAL = 0x15ed1b1f
MESSENGER_STATE_COOKIE_TYPE = 0x01ce
MESSENGER_STATE_TYPE_NOSPAMKEYS = 1
MESSENGER_STATE_TYPE_DHT = 2
MESSENGER_STATE_TYPE_FRIENDS = 3
MESSENGER_STATE_TYPE_NAME = 4
MESSENGER_STATE_TYPE_STATUSMESSAGE = 5
MESSENGER_STATE_TYPE_STATUS = 6
MESSENGER_STATE_TYPE_TCP_RELAY = 10
MESSENGER_STATE_TYPE_PATH_NODE = 11
STATUS_MESSAGE = "New user".encode("utf-8")
import sys
import struct
import os
def abort(msg):
print(msg)
exit(1)
if len(sys.argv) != 5:
abort("Usage: %s <public key> <private key> <user name> <out file>" % (sys.argv[0]))
try:
public_key = sys.argv[1].decode("hex")
except:
abort("Bad public key")
try:
private_key = sys.argv[2].decode("hex")
except:
abort("Bad private key")
if len(public_key) != PUBLIC_KEY_LENGTH:
abort("Public key with wrong length")
if len(private_key) != PRIVATE_KEY_LENGTH:
abort("Private key with wrong length")
user_name = sys.argv[3].encode("utf-8")
if len(user_name) > 32:
abort("User name too long (for this script, at least)")
out_file_name = sys.argv[4]
nospam = os.urandom(4)
def make_subheader(h_type, h_length):
return (
struct.pack("<I", h_length) +
struct.pack("<H", h_type) +
struct.pack("<H", MESSENGER_STATE_COOKIE_TYPE))
data = (
# Main header
struct.pack("<I", 0) +
struct.pack("<I", MESSENGER_STATE_COOKIE_GLOBAL) +
# Keys
make_subheader(MESSENGER_STATE_TYPE_NOSPAMKEYS,
len(nospam) + PUBLIC_KEY_LENGTH + PRIVATE_KEY_LENGTH) +
nospam + public_key + private_key +
# Name (not really needed, but helps)
make_subheader(MESSENGER_STATE_TYPE_NAME, len(user_name)) +
user_name +
# Status message (not really needed, but helps)
make_subheader(MESSENGER_STATE_TYPE_STATUSMESSAGE, len(STATUS_MESSAGE)) +
STATUS_MESSAGE
)
try:
with open(out_file_name, "wb") as fp:
fp.write(data)
except Exception as e:
abort(str(e))