mirror of
https://github.com/alexgo-io/stacks-puppet-node.git
synced 2026-04-15 06:28:38 +08:00
403 lines
9.4 KiB
Python
Executable File
403 lines
9.4 KiB
Python
Executable File
# -*- coding: utf-8 -*-
|
|
"""
|
|
Registrar
|
|
~~~~~
|
|
:copyright: (c) 2014-2016 by Halfmoon Labs, Inc.
|
|
:copyright: (c) 2016 blockstack.org
|
|
:license: MIT, see LICENSE for more details.
|
|
"""
|
|
|
|
import os
|
|
import json
|
|
import requests
|
|
|
|
from registrar.config import MONGODB_URI, OLD_DB, AWSDB_URI
|
|
|
|
from registrar.nameops import process_user, update_name, register_name
|
|
|
|
from pymongo import MongoClient
|
|
from bson.objectid import ObjectId
|
|
|
|
from .bip38 import bip38_decrypt
|
|
|
|
import datetime
|
|
import hashlib
|
|
from time import sleep
|
|
|
|
# from tools.sweep_btc import sweep_btc
|
|
|
|
FRONTEND_SECRET = os.environ['FRONTEND_SECRET']
|
|
|
|
|
|
from pybitcoin import BitcoinKeypair, NamecoinKeypair
|
|
|
|
from pybitcoin.rpc import namecoind
|
|
from pybitcoin.rpc.namecoind_client import NamecoindClient
|
|
from registrar.config import NAMECOIND_PORT, NAMECOIND_USER, NAMECOIND_PASSWD
|
|
from registrar.config import NAMECOIND_USE_HTTPS, NAMECOIND_SERVER
|
|
from registrar.config import NAMECOIND_WALLET_PASSPHRASE
|
|
from registrar.config import NAMECOIND_UPDATE_SERVER
|
|
from commontools import get_json, log
|
|
|
|
from registrar.config import SERVER_FLEET
|
|
from pybitcoin.rpc.namecoind_cluster import pending_transactions
|
|
|
|
remote_client = MongoClient(MONGODB_URI)
|
|
|
|
remote_db = remote_client.get_default_database()
|
|
users = remote_db.user
|
|
registrations = remote_db.user_registration
|
|
updates = remote_db.profile_update
|
|
transfer = remote_db.name_transfer
|
|
|
|
aws_db = MongoClient(AWSDB_URI)['blockdata']
|
|
skip_users = aws_db.skip_users
|
|
pending_users = aws_db.pending_users
|
|
|
|
old_client = MongoClient(OLD_DB)
|
|
old_db = old_client.get_default_database()
|
|
old_users = old_db.user
|
|
|
|
reservation = remote_db.username_reservation
|
|
|
|
|
|
def print_user(user):
|
|
for key, value in user.iteritems():
|
|
print key + " : " + str(value)
|
|
|
|
|
|
def check_pending_tx():
|
|
|
|
counter_total = 0
|
|
|
|
for server in SERVER_FLEET:
|
|
print server
|
|
try:
|
|
count = int(pending_transactions(server))
|
|
print count
|
|
counter_total += count
|
|
except Exception as e:
|
|
print e
|
|
|
|
return counter_total
|
|
|
|
|
|
def cleanup_user(username):
|
|
|
|
user = users.find_one({"username": username})
|
|
|
|
user_id = user['_id']
|
|
|
|
cleanup_user = updates.find_one({"user_id": user_id})
|
|
|
|
if cleanup_user is not None:
|
|
print "cleaning update: " + user["username"]
|
|
updates.remove(cleanup_user)
|
|
|
|
cleanup_user = transfer.find_one({"user_id": user_id})
|
|
|
|
if cleanup_user is not None:
|
|
print "cleaning transfer: " + user["username"]
|
|
transfer.remove(cleanup_user)
|
|
|
|
cleanup_user = registrations.find_one({"user_id": user_id})
|
|
|
|
if cleanup_user is not None:
|
|
print "cleaning register: " + user["username"]
|
|
registrations.remove(cleanup_user)
|
|
|
|
|
|
def process_manually_alias(username, alias):
|
|
|
|
user = users.find_one({'username': username})
|
|
process_user(alias, user['profile'])
|
|
|
|
|
|
def process_manually(username):
|
|
|
|
user = users.find_one({'username': username})
|
|
process_user(user['username'], user['profile'])
|
|
# cleanup_user(username)
|
|
|
|
|
|
def process_manually_old(username):
|
|
|
|
user = old_users.find_one({'username': username})
|
|
process_user(user['username'], json.loads(user['profile']))
|
|
|
|
|
|
def make_alias(alias, target):
|
|
|
|
value = {}
|
|
value['next'] = 'u/' + target
|
|
|
|
process_user(alias, value)
|
|
|
|
|
|
def find_via_email(email):
|
|
|
|
user = users.find_one({'email': email})
|
|
print_user(user)
|
|
|
|
|
|
def find_via_username(username):
|
|
|
|
user = users.find_one({'username': username})
|
|
print_user(user)
|
|
|
|
|
|
def find_old_user(username):
|
|
|
|
user = old_users.find_one({'username': username})
|
|
print_user(user)
|
|
|
|
|
|
def import_user(username):
|
|
|
|
for transfer_user in transfer.find():
|
|
|
|
user_id = transfer_user['user_id']
|
|
new_user = users.find_one({"_id": user_id})
|
|
|
|
if new_user is None:
|
|
continue
|
|
|
|
if new_user['username'] == username:
|
|
old_user = old_users.find_one({'username': new_user['username']})
|
|
print username
|
|
else:
|
|
continue
|
|
|
|
old_nmc_address = old_user['namecoin_address']
|
|
|
|
wif_pk = bip38_decrypt(str(transfer_user['encrypted_private_key']), FRONTEND_SECRET)
|
|
|
|
keypair = NamecoinKeypair.from_private_key(wif_pk)
|
|
|
|
if old_nmc_address == keypair.address():
|
|
print old_nmc_address
|
|
#print namecoind.importprivkey(keypair.wif_pk())
|
|
|
|
|
|
def import_update(userobj):
|
|
|
|
user_id = userobj['user_id']
|
|
update_user = users.find_one({"_id": user_id})
|
|
|
|
if update_user is None:
|
|
return
|
|
|
|
nmc_address = update_user['namecoin_address']
|
|
|
|
wif_pk = bip38_decrypt(str(userobj['encrypted_private_key']), FRONTEND_SECRET)
|
|
|
|
keypair = NamecoinKeypair.from_private_key(wif_pk)
|
|
|
|
namecoind = NamecoindClient(NAMECOIND_UPDATE_SERVER, NAMECOIND_PORT, NAMECOIND_USER,
|
|
NAMECOIND_PASSWD, NAMECOIND_USE_HTTPS,
|
|
NAMECOIND_WALLET_PASSPHRASE)
|
|
|
|
if nmc_address == keypair.address():
|
|
print update_user['username']
|
|
print nmc_address
|
|
print namecoind.importprivkey(keypair.wif_pk())
|
|
|
|
|
|
def pending_transactions():
|
|
|
|
reply = namecoind.listtransactions("", 10000)
|
|
|
|
counter = 0
|
|
|
|
for i in reply:
|
|
if i['confirmations'] == 0:
|
|
counter += 1
|
|
|
|
if counter == MAX_PENDING_TX:
|
|
return True
|
|
|
|
return False
|
|
|
|
|
|
def send_update(expiring_users):
|
|
|
|
for i in expiring_users:
|
|
key = i['name']
|
|
try:
|
|
value = json.loads(i['value'])
|
|
except:
|
|
value = i['value']
|
|
|
|
if 'message' in value:
|
|
|
|
value['message'] = value['message'].replace(
|
|
'This OneName username', 'This username')
|
|
|
|
print key
|
|
print value
|
|
print '-' * 5
|
|
|
|
try:
|
|
update_name(key,value)
|
|
sleep(5)
|
|
except Exception as e:
|
|
print e
|
|
|
|
|
|
def get_emails(expiring_users):
|
|
|
|
emails = []
|
|
|
|
for i in expiring_users:
|
|
username = i["name"].lstrip("u/")
|
|
reply = old_users.find_one({"username": username})
|
|
|
|
if reply is not None and 'email' in reply:
|
|
emails.append(reply['email'])
|
|
|
|
print len(emails)
|
|
|
|
from collections import Counter
|
|
|
|
counter = Counter(emails)
|
|
|
|
temp = counter.most_common()
|
|
|
|
fout = open('expiring_emails.txt', 'w')
|
|
|
|
for i in temp:
|
|
|
|
fout.write(str(i[0]) + ", " + str(i[1]) + '\n')
|
|
|
|
fout.close()
|
|
|
|
|
|
def transfer_key(key, nmc_address):
|
|
|
|
from pybitcoin.rpc.namecoind_cluster import get_server
|
|
|
|
serverinfo = get_server(key)
|
|
|
|
server = None
|
|
|
|
if 'registered' in serverinfo and serverinfo['registered']:
|
|
server = serverinfo['server']
|
|
|
|
if server is None:
|
|
print "Don't own this key"
|
|
return
|
|
|
|
namecoind = NamecoindClient(server, NAMECOIND_PORT, NAMECOIND_USER,
|
|
NAMECOIND_PASSWD, NAMECOIND_USE_HTTPS,
|
|
NAMECOIND_WALLET_PASSPHRASE)
|
|
|
|
print namecoind.name_transfer(key, nmc_address)
|
|
|
|
|
|
def get_blockchain_profile(username):
|
|
|
|
BASE_URL = 'http://resolver.onename.com/v1/users/'
|
|
|
|
profile = None
|
|
|
|
try:
|
|
r = requests.get(BASE_URL + username, timeout=3)
|
|
profile = json.loads(r.text)
|
|
except Exception as e:
|
|
print e
|
|
log.error("User doesn't seem to exist.")
|
|
|
|
return profile
|
|
|
|
|
|
def get_db_profile(username):
|
|
|
|
try:
|
|
user = users.find_one({"username": username})
|
|
profile = get_json(user["profile"])
|
|
|
|
except Exception as e:
|
|
profile = None
|
|
log.error("couldn't connect to database")
|
|
|
|
return profile
|
|
|
|
|
|
def profile_on_blockchain(username):
|
|
|
|
if len(username) == 34:
|
|
return True
|
|
|
|
if 'clone' in username or 'stormtrooper' in username:
|
|
return True
|
|
|
|
block_profile = get_blockchain_profile(username)
|
|
db_profile = get_db_profile(username)
|
|
|
|
block_profile = json.dumps(block_profile, sort_keys=True)
|
|
db_profile = json.dumps(db_profile, sort_keys=True)
|
|
|
|
if len(block_profile) == len(db_profile):
|
|
# check hash for only profiles where length is the same
|
|
if hashlib.md5(
|
|
block_profile).hexdigest() == hashlib.md5(db_profile).hexdigest():
|
|
return True
|
|
else:
|
|
return False
|
|
else:
|
|
return False
|
|
|
|
|
|
def change_email(old_email, new_email):
|
|
user = users.find_one({'email': old_email})
|
|
user['email'] = new_email
|
|
users.save(user)
|
|
|
|
|
|
def change_username(old_username, new_username):
|
|
user = users.find_one({'username': old_username})
|
|
user['username'] = new_username
|
|
users.save(user)
|
|
|
|
|
|
def change_profile(username, profile):
|
|
|
|
user = users.find_one({'username': username})
|
|
user['profile'] = profile
|
|
users.save(user)
|
|
|
|
|
|
def run_analytics():
|
|
|
|
start_time = '2014-10-21T20:58:28' # 202000 block
|
|
end_time = '2014-10-28T20:23:11' # 203000 block
|
|
|
|
from datetime import datetime
|
|
import time
|
|
|
|
start_time = datetime.strptime(start_time, '%Y-%m-%dT%H:%M:%S')
|
|
start_time = time.mktime(start_time.timetuple())
|
|
|
|
end_time = datetime.strptime(end_time, '%Y-%m-%dT%H:%M:%S')
|
|
end_time = time.mktime(end_time.timetuple())
|
|
|
|
counter = 0
|
|
|
|
for user in users.find():
|
|
|
|
register_time = user['created_at']
|
|
|
|
register_time = time.mktime(register_time.timetuple())
|
|
|
|
if register_time > start_time and register_time < end_time:
|
|
print register_time
|
|
counter += 1
|
|
|
|
|
|
def delete_account(username):
|
|
|
|
change_profile(username, {})
|
|
process_manually(username)
|
|
user = users.find_one({'username': username})
|
|
users.remove(user)
|