def pollAndExecute(): global makeTree, txRun, log # print(time.time(), x) tot = mc.streamInfo(api) if tot == txRun: return else: makeTree = 1 txs = mc.getItems(api, tot - txRun) # latestTx = txs[-1]['txid'] for i in txs: item = i['data']['json'] cur.execute("SELECT pubkey from icreds WHERE uid=%s", (item['id'], )) pubkey = bytes.fromhex(cur.fetchone()[0]).decode('utf-8') # print(pubkey) orig = SHA256.new(item['data'].encode()) if len(item['data']) < 100: abridge = item['data'] else: abridge = item['data'][:90] + "....." + item['data'][-20:] if pkcs.new(RSA.importKey(pubkey)).verify( orig, bytes.fromhex(item['sig'])): if item['type'] == 'gradeinsert': t = item['data'].split('||') std, courses, grades, [func] = [j.split(',') for j in t] try: cur.callproc(func, ( item['id'], std, courses, grades, )) res = cur.fetchone()[0] err = res[1:] except psycopg2.Error as e: err = e.diag.message_primary log[item['id']].append(abridge + " (Update) \u2718 " + err) conn.rollback() else: if res[0] == '0': log[item['id']].append(abridge + " (Insert) \u2718 " + err) with open("logs.txt", 'a') as f: f.write(i['txid'] + ' gradeinsert\n') else: log[item['id']].append(abridge + " (Insert) \u2714") # txRun = txRun + 1 finally: cur.execute(stmt, (i['txid'], )) conn.commit() txRun = txRun + 1 print('INSERT', i['txid']) elif item['type'] == 'gradeupdate': uid, course, newGrade, func = item['data'].split(',') try: cur.callproc(func, ( item['id'], uid, course, newGrade, )) res = cur.fetchone()[0] err = res[1:] except psycopg2.Error as e: err = e.diag.message_primary log[item['id']].append(abridge + " (Update) \u2718 " + err) conn.rollback() else: if res[0] == '0': log[item['id']].append(abridge + " (Update) \u2718 " + err) with open("logs.txt", 'a') as f: f.write(i['txid'] + ' gradeupdate\n') else: log[item['id']].append(abridge + " (Update) \u2714") finally: cur.execute(stmt, (i['txid'], )) conn.commit() txRun = txRun + 1 print('UPDATE', i['txid']) elif item['type'] == 'userenroll': t = item['data'].split(',') salt = secrets.token_hex(32) phash = hashlib.pbkdf2_hmac('sha256', salt.encode(), t[1].encode(), 100000).hex() try: cur.callproc(t[3], ( t[0], salt, phash, t[2], )) res = cur.fetchone()[0] err = res[1:] except psycopg2.Error as e: err = e.diag.message_primary log[item['id']].append(abridge + " (Enroll) \u2718 " + err) conn.rollback() else: if res[0] == '0': log[item['id']].append(abridge + " (Enroll) \u2718 " + err) with open("logs.txt", 'a') as f: f.write(i['txid'] + ' userenroll\n') else: log[item['id']].append(abridge + " (Enroll) \u2714") # txRun = txRun + 1 finally: cur.execute(stmt, (i['txid'], )) conn.commit() txRun = txRun + 1 print('ENROLL', i['txid']) elif item['type'] == 'updatepubkey': t = item['data'].split(',') try: cur.callproc(t[2], ( t[0], t[1], )) res = cur.fetchone()[0] err = res[1:] except psycopg2.Error as e: err = e.diag.message_primary log[item['id']].append(abridge + " (UpK) \u2718 " + err) conn.rollback() else: if res[0] == '0': log[item['id']].append(abridge + " (UpK) \u2718 " + err) with open("logs.txt", 'a') as f: f.write(i['txid'] + ' updatepubkey\n') else: log[item['id']].append(abridge + " (UpK) \u2714") # txRun = txRun + 1 finally: cur.execute(stmt, (i['txid'], )) conn.commit() txRun = txRun + 1 print('PUBKEY', i['txid']) elif item['type'] == 'updatesqlpr': try: cur.callproc(item['type'], (item['data'], )) res = cur.fetchone()[0] err = res[1:] except psycopg2.Error as e: err = e.diag.message_primary log[item['id']].append(abridge + " (SQLF) \u2718 " + err) conn.rollback() else: if res[0] == '0': log[item['id']].append(abridge + " (SQLF) \u2718 " + err) with open("logs.txt", 'a') as f: f.write(i['txid'] + ' updatesqlpr\n') else: log[item['id']].append(abridge + " (SQLF) \u2714") # txRun = txRun + 1 finally: cur.execute(stmt, (i['txid'], )) conn.commit() txRun = txRun + 1 print('SQL Proc', i['txid']) elif item['type'] == 'instrcourses': t = item['data'].split('||') try: cur.callproc(t[2], ( [t[0] for i in t[1].split(',')], [i.strip() for i in t[1].split(',')], )) res = cur.fetchone()[0] err = res[1:] except psycopg2.Error as e: err = e.diag.message_primary log[item['id']].append(abridge + " (I-Course) \u2718 " + err) conn.rollback() else: if res[0] == '0': log[item['id']].append(abridge + " (I-Course) \u2718 " + err) with open("logs.txt", 'a') as f: f.write(i['txid'] + ' instrcourses\n') else: log[item['id']].append(abridge + " (I-Course) \u2714") # txRun = txRun + 1 finally: cur.execute(stmt, (i['txid'], )) conn.commit() txRun = txRun + 1 print('INSTR COURSES', i['txid']) else: # Execute SQL functions t = item['data'].split('||') funcname = t[0] params = t[1].split() try: if len(params) == 0: cur.callproc(item['type']) elif len(params) == 1: cur.callproc(item['type'], (ast.literal_eval(params[0]), )) else: cur.callproc(item['type'], tuple(map(ast.literal_eval, params))) res = cur.fetchone()[0] # err = res[1:] except psycopg2.Error as e: err = e.diag.message_primary log[item['id']].append(abridge + " (Exec-Func) \u2718 " + err) conn.rollback() else: log[item['id']].append(abridge + " (Exec-Func) : " + str(res)) finally: cur.execute(stmt, (i['txid'], )) conn.commit() txRun = txRun + 1 print('EXEC FUNC', i['txid']) else: with open("logs.txt", 'a') as f: f.write(i['txid'] + ' Signature Mismatch')
from Crypto.Hash import SHA256 from collections import defaultdict import threading, os, secrets, time import select, socket, requests from anytree import Node, RenderTree, LevelOrderIter from itertools import product conn = psycopg2.connect(database="rraj", user="******", password="******", host="127.0.0.1", port="5432") cur = conn.cursor() api = mc.getApi() txRun = mc.streamInfo(api) stmt = "UPDATE txid SET tx=%s" POOL_TIME = 5 log = defaultdict(list) makeTree = 1 ######################################################################################## def pollAndExecute(): global makeTree, txRun, log # print(time.time(), x) tot = mc.streamInfo(api) if tot == txRun: return else: