mirror of
https://github.com/irungentoo/toxcore.git
synced 2024-03-22 13:30:51 +08:00
ef0922cf9f
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.
123 lines
3.0 KiB
Python
Executable File
123 lines
3.0 KiB
Python
Executable File
#!/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))
|