version 0.2.0, new lib for bitcoin ecc, dont display or track notify errors, dont reload again within 1 sec, null peer ip fix, signingmoved to ContentManager, content.json include support, content.json multisig ready, content.json proper bitcoincore compatible signing, content.json include permissions, multithreaded publish, publish timeout 60s, no exception on invalid bitcoin address, testcase for new lib, bip32 based persite privatekey generation, multiuser ready, simple json database query command, websocket api fileGet, wrapper loading title stuck bugfix
This commit is contained in:
parent
cfe2cfaf09
commit
639b9f4961
44 changed files with 4061 additions and 293 deletions
53
src/User/User.py
Normal file
53
src/User/User.py
Normal file
|
@ -0,0 +1,53 @@
|
|||
import logging, json, time
|
||||
from Crypt import CryptBitcoin
|
||||
|
||||
class User:
|
||||
def __init__(self, master_address=None):
|
||||
if master_address:
|
||||
self.master_address = master_address
|
||||
self.master_seed = None
|
||||
else:
|
||||
self.master_seed = CryptBitcoin.newSeed()
|
||||
self.master_address = CryptBitcoin.privatekeyToAddress(self.master_seed)
|
||||
self.sites = {}
|
||||
self.log = logging.getLogger("User:%s" % self.master_address)
|
||||
|
||||
|
||||
# Save to data/users.json
|
||||
def save(self):
|
||||
users = json.load(open("data/users.json"))
|
||||
if not self.master_address in users: users[self.master_address] = {} # Create if not exits
|
||||
|
||||
user_data = users[self.master_address]
|
||||
if self.master_seed: user_data["master_seed"] = self.master_seed
|
||||
user_data["sites"] = self.sites
|
||||
open("data/users.json", "w").write(json.dumps(users, indent=2, sort_keys=True))
|
||||
self.log.debug("Saved")
|
||||
|
||||
|
||||
# Get BIP32 address from site address
|
||||
# Return: BIP32 auth address
|
||||
def getAuthAddress(self, address):
|
||||
if not address in self.sites: # Genreate new BIP32 child key based on site address
|
||||
s = time.time()
|
||||
address_id = int(address.encode("hex"), 16) # Convert site address to int
|
||||
auth_privatekey = CryptBitcoin.hdPrivatekey(self.master_seed, address_id)
|
||||
self.sites[address] = {
|
||||
"auth_address": CryptBitcoin.privatekeyToAddress(auth_privatekey),
|
||||
"auth_privatekey": auth_privatekey
|
||||
}
|
||||
self.save()
|
||||
self.log.debug("Added new site: %s in %.3fs" % (address, time.time()-s))
|
||||
|
||||
return self.sites[address]["auth_address"]
|
||||
|
||||
|
||||
def getAuthPrivatekey(self, address):
|
||||
return self.sites[address]["auth_privatekey"]
|
||||
|
||||
|
||||
|
||||
# Set user attributes from dict
|
||||
def setData(self, data):
|
||||
for key, val in data.items():
|
||||
setattr(self, key, val)
|
65
src/User/UserManager.py
Normal file
65
src/User/UserManager.py
Normal file
|
@ -0,0 +1,65 @@
|
|||
import json, logging, os
|
||||
from User import User
|
||||
|
||||
users = None
|
||||
|
||||
# Load all user from data/users.json
|
||||
def load():
|
||||
global users
|
||||
if not users: users = {}
|
||||
|
||||
user_found = []
|
||||
added = 0
|
||||
# Load new users
|
||||
for master_address, data in json.load(open("data/users.json")).items():
|
||||
if master_address not in users:
|
||||
user = User(master_address)
|
||||
user.setData(data)
|
||||
users[master_address] = user
|
||||
added += 1
|
||||
user_found.append(master_address)
|
||||
|
||||
# Remove deleted adresses
|
||||
for master_address in users.keys():
|
||||
if master_address not in user_found:
|
||||
del(users[master_address])
|
||||
logging.debug("Removed user: %s" % master_address)
|
||||
|
||||
if added: logging.debug("UserManager added %s users" % added)
|
||||
|
||||
|
||||
# Create new user
|
||||
# Return: User
|
||||
def create():
|
||||
user = User()
|
||||
logging.debug("Created user: %s" % user.master_address)
|
||||
users[user.master_address] = user
|
||||
user.save()
|
||||
return user
|
||||
|
||||
|
||||
# List all users from data/users.json
|
||||
# Return: {"usermasteraddr": User}
|
||||
def list():
|
||||
if users == None: # Not loaded yet
|
||||
load()
|
||||
return users
|
||||
|
||||
|
||||
# Get current authed user
|
||||
# Return: User
|
||||
def getCurrent():
|
||||
users = list()
|
||||
if users:
|
||||
return users.values()[0]
|
||||
else:
|
||||
return create()
|
||||
|
||||
|
||||
# Debug: Reload User.py
|
||||
def reload():
|
||||
import imp
|
||||
global users, User
|
||||
users.clear() # Remove all items
|
||||
User = imp.load_source("User", "src/User/User.py").User # Reload source
|
||||
load()
|
1
src/User/__init__.py
Normal file
1
src/User/__init__.py
Normal file
|
@ -0,0 +1 @@
|
|||
from User import User
|
Loading…
Add table
Add a link
Reference in a new issue