mirror of
https://github.com/element-hq/synapse.git
synced 2024-11-24 02:25:45 +03:00
70 lines
2.7 KiB
Python
70 lines
2.7 KiB
Python
|
from synapse.storage.pdu import PduStore
|
||
|
from synapse.storage.signatures import SignatureStore
|
||
|
from synapse.storage._base import SQLBaseStore
|
||
|
from synapse.federation.units import Pdu
|
||
|
from synapse.crypto.event_signing import (
|
||
|
add_event_pdu_content_hash, compute_pdu_event_reference_hash
|
||
|
)
|
||
|
from synapse.api.events.utils import prune_pdu
|
||
|
from syutil.base64util import encode_base64, decode_base64
|
||
|
from syutil.jsonutil import encode_canonical_json
|
||
|
import sqlite3
|
||
|
import sys
|
||
|
|
||
|
class Store(object):
|
||
|
_get_pdu_tuples = PduStore.__dict__["_get_pdu_tuples"]
|
||
|
_get_pdu_content_hashes_txn = SignatureStore.__dict__["_get_pdu_content_hashes_txn"]
|
||
|
_get_prev_pdu_hashes_txn = SignatureStore.__dict__["_get_prev_pdu_hashes_txn"]
|
||
|
_get_pdu_origin_signatures_txn = SignatureStore.__dict__["_get_pdu_origin_signatures_txn"]
|
||
|
_store_pdu_content_hash_txn = SignatureStore.__dict__["_store_pdu_content_hash_txn"]
|
||
|
_store_pdu_reference_hash_txn = SignatureStore.__dict__["_store_pdu_reference_hash_txn"]
|
||
|
_store_prev_pdu_hash_txn = SignatureStore.__dict__["_store_prev_pdu_hash_txn"]
|
||
|
_simple_insert_txn = SQLBaseStore.__dict__["_simple_insert_txn"]
|
||
|
|
||
|
|
||
|
store = Store()
|
||
|
|
||
|
|
||
|
def select_pdus(cursor):
|
||
|
cursor.execute(
|
||
|
"SELECT pdu_id, origin FROM pdus ORDER BY depth ASC"
|
||
|
)
|
||
|
|
||
|
ids = cursor.fetchall()
|
||
|
|
||
|
pdu_tuples = store._get_pdu_tuples(cursor, ids)
|
||
|
|
||
|
pdus = [Pdu.from_pdu_tuple(p) for p in pdu_tuples]
|
||
|
|
||
|
reference_hashes = {}
|
||
|
|
||
|
for pdu in pdus:
|
||
|
try:
|
||
|
if pdu.prev_pdus:
|
||
|
print "PROCESS", pdu.pdu_id, pdu.origin, pdu.prev_pdus
|
||
|
for pdu_id, origin, hashes in pdu.prev_pdus:
|
||
|
ref_alg, ref_hsh = reference_hashes[(pdu_id, origin)]
|
||
|
hashes[ref_alg] = encode_base64(ref_hsh)
|
||
|
store._store_prev_pdu_hash_txn(cursor, pdu.pdu_id, pdu.origin, pdu_id, origin, ref_alg, ref_hsh)
|
||
|
print "SUCCESS", pdu.pdu_id, pdu.origin, pdu.prev_pdus
|
||
|
pdu = add_event_pdu_content_hash(pdu)
|
||
|
ref_alg, ref_hsh = compute_pdu_event_reference_hash(pdu)
|
||
|
reference_hashes[(pdu.pdu_id, pdu.origin)] = (ref_alg, ref_hsh)
|
||
|
store._store_pdu_reference_hash_txn(cursor, pdu.pdu_id, pdu.origin, ref_alg, ref_hsh)
|
||
|
|
||
|
for alg, hsh_base64 in pdu.hashes.items():
|
||
|
print alg, hsh_base64
|
||
|
store._store_pdu_content_hash_txn(cursor, pdu.pdu_id, pdu.origin, alg, decode_base64(hsh_base64))
|
||
|
|
||
|
except:
|
||
|
print "FAILED_", pdu.pdu_id, pdu.origin, pdu.prev_pdus
|
||
|
|
||
|
def main():
|
||
|
conn = sqlite3.connect(sys.argv[1])
|
||
|
cursor = conn.cursor()
|
||
|
select_pdus(cursor)
|
||
|
conn.commit()
|
||
|
|
||
|
if __name__=='__main__':
|
||
|
main()
|