| 15 | |
| 16 | @PluginManager.acceptPlugins |
| 17 | class User(object): |
| 18 | def __init__(self, master_address=None, master_seed=None, data={}): |
| 19 | if master_seed: |
| 20 | self.master_seed = master_seed |
| 21 | self.master_address = CryptBitcoin.privatekeyToAddress(self.master_seed) |
| 22 | elif master_address: |
| 23 | self.master_address = master_address |
| 24 | self.master_seed = data.get("master_seed") |
| 25 | else: |
| 26 | self.master_seed = CryptBitcoin.newSeed() |
| 27 | self.master_address = CryptBitcoin.privatekeyToAddress(self.master_seed) |
| 28 | self.sites = data.get("sites", {}) |
| 29 | self.certs = data.get("certs", {}) |
| 30 | self.settings = data.get("settings", {}) |
| 31 | self.delayed_save_thread = None |
| 32 | |
| 33 | self.log = logging.getLogger("User:%s" % self.master_address) |
| 34 | |
| 35 | # Save to data/users.json |
| 36 | @util.Noparallel(queue=True, ignore_class=True) |
| 37 | def save(self): |
| 38 | s = time.time() |
| 39 | users = json.load(open("%s/users.json" % config.data_dir)) |
| 40 | if self.master_address not in users: |
| 41 | users[self.master_address] = {} # Create if not exist |
| 42 | user_data = users[self.master_address] |
| 43 | if self.master_seed: |
| 44 | user_data["master_seed"] = self.master_seed |
| 45 | user_data["sites"] = self.sites |
| 46 | user_data["certs"] = self.certs |
| 47 | user_data["settings"] = self.settings |
| 48 | helper.atomicWrite("%s/users.json" % config.data_dir, helper.jsonDumps(users).encode("utf8")) |
| 49 | self.log.debug("Saved in %.3fs" % (time.time() - s)) |
| 50 | self.delayed_save_thread = None |
| 51 | |
| 52 | def saveDelayed(self): |
| 53 | if not self.delayed_save_thread: |
| 54 | self.delayed_save_thread = gevent.spawn_later(5, self.save) |
| 55 | |
| 56 | def getAddressAuthIndex(self, address): |
| 57 | return int(binascii.hexlify(address.encode()), 16) |
| 58 | |
| 59 | @util.Noparallel() |
| 60 | def generateAuthAddress(self, address): |
| 61 | s = time.time() |
| 62 | address_id = self.getAddressAuthIndex(address) # Convert site address to int |
| 63 | auth_privatekey = CryptBitcoin.hdPrivatekey(self.master_seed, address_id) |
| 64 | self.sites[address] = { |
| 65 | "auth_address": CryptBitcoin.privatekeyToAddress(auth_privatekey), |
| 66 | "auth_privatekey": auth_privatekey |
| 67 | } |
| 68 | self.saveDelayed() |
| 69 | self.log.debug("Added new site: %s in %.3fs" % (address, time.time() - s)) |
| 70 | return self.sites[address] |
| 71 | |
| 72 | # Get user site data |
| 73 | # Return: {"auth_address": "xxx", "auth_privatekey": "xxx"} |
| 74 | def getSiteData(self, address, create=True): |