From e51d8c7de39f02be99ad4786c22e446f5c72da22 Mon Sep 17 00:00:00 2001 From: Believethehype Date: Thu, 30 Nov 2023 22:47:30 +0100 Subject: [PATCH] make nip89 events deleteable --- utils/admin_utils.py | 24 ++++++++++-------------- utils/dvmconfig.py | 4 +++- utils/nip89_utils.py | 24 +++++++++++++++++++++++- utils/nostr_utils.py | 8 +------- 4 files changed, 37 insertions(+), 23 deletions(-) diff --git a/utils/admin_utils.py b/utils/admin_utils.py index d2ebae1..21af43f 100644 --- a/utils/admin_utils.py +++ b/utils/admin_utils.py @@ -1,12 +1,14 @@ # ADMINISTRARIVE DB MANAGEMENT import time +from datetime import timedelta -from nostr_sdk import Keys, EventBuilder, PublicKey +from nostr_sdk import Keys, EventBuilder, PublicKey, Client, Filter, EventId from utils.database_utils import get_from_sql_table, list_db, delete_from_sql_table, update_sql_table, \ get_or_add_user, clean_db from utils.dvmconfig import DVMConfig -from utils.nip89_utils import nip89_announce_tasks, NIP89Config, nip89_delete_announcement +from utils.nip89_utils import nip89_announce_tasks, NIP89Config, nip89_delete_announcement, \ + fetch_nip89_paramters_for_deletion from utils.nostr_utils import send_event, update_profile @@ -24,7 +26,7 @@ class AdminConfig: LUD16: str = "" -def admin_make_database_updates(adminconfig: AdminConfig = None, dvmconfig: DVMConfig = None, client=None): +def admin_make_database_updates(adminconfig: AdminConfig = None, dvmconfig: DVMConfig = None, client: Client = None): # This is called on start of Server, Admin function to manually whitelist/blacklist/add balance/delete users if adminconfig is None or dvmconfig is None: return @@ -32,7 +34,8 @@ def admin_make_database_updates(adminconfig: AdminConfig = None, dvmconfig: DVMC if not isinstance(adminconfig, AdminConfig): return - if ((adminconfig.WHITELISTUSER is True or adminconfig.UNWHITELISTUSER is True or adminconfig.BLACKLISTUSER is True or adminconfig.DELETEUSER is True) + if (( + adminconfig.WHITELISTUSER is True or adminconfig.UNWHITELISTUSER is True or adminconfig.BLACKLISTUSER is True or adminconfig.DELETEUSER is True) and adminconfig.USERNPUB == ""): return @@ -52,7 +55,6 @@ def admin_make_database_updates(adminconfig: AdminConfig = None, dvmconfig: DVMC user = get_from_sql_table(db, publickey) print(str(user.name) + " is whitelisted: " + str(user.iswhitelisted)) - if adminconfig.UNWHITELISTUSER: user = get_from_sql_table(db, publickey) update_sql_table(db, user.npub, user.balance, False, False, user.nip05, user.lud16, user.name, user.lastactive) @@ -76,15 +78,9 @@ def admin_make_database_updates(adminconfig: AdminConfig = None, dvmconfig: DVMC # TODO make this callable delete_previous_announcement = False if delete_previous_announcement: - # privkey from sender - keys = Keys.from_sk_str("") - print("Pubkey generated from Private Key " + keys.public_key().to_hex()) - - print("Pubkey of Event: " + "") #pubkey from event, to compare to given privkey - dtag = "" #dtag from event - event_id = "" #id of event - nip89_delete_announcement(event_id, keys, dtag, client, dvmconfig) + eventid = "" #Id of Event to delete + keys = Keys.from_sk_str("") # Private key from sender of Event (e.g. the key of an nip89 announcement you want to delete) + fetch_nip89_paramters_for_deletion(keys, eventid, client, dvmconfig) if adminconfig.UPDATE_PROFILE: update_profile(dvmconfig, lud16=adminconfig.LUD16) - diff --git a/utils/dvmconfig.py b/utils/dvmconfig.py index 39aaa09..8cfedad 100644 --- a/utils/dvmconfig.py +++ b/utils/dvmconfig.py @@ -14,7 +14,9 @@ class DVMConfig: RELAY_LIST = ["wss://relay.damus.io", "wss://nostr-pub.wellorder.net", "wss://nos.lol", "wss://nostr.wine", "wss://relay.nostfiles.dev", "wss://nostr.mom", "wss://nostr.oxtr.dev", "wss://relay.nostr.bg", - "wss://relay.f7z.io"] + "wss://relay.f7z.io", "wss://pablof7z.nostr1.com", "wss://purplepag.es", "wss://nos.lol", + "wss://relay.snort.social", "wss://offchain.pub/", + "wss://nostr-pub.wellorder.net"] RELAY_TIMEOUT = 3 LNBITS_INVOICE_KEY = '' diff --git a/utils/nip89_utils.py b/utils/nip89_utils.py index 56c0314..b44299c 100644 --- a/utils/nip89_utils.py +++ b/utils/nip89_utils.py @@ -4,7 +4,7 @@ from hashlib import sha256 from pathlib import Path import dotenv -from nostr_sdk import Tag, Keys, EventBuilder, Filter, Alphabet, PublicKey, Event, Client +from nostr_sdk import Tag, Keys, EventBuilder, Filter, Alphabet, PublicKey, Event, Client, EventId from utils.definitions import EventDefinitions from utils.nostr_utils import send_event @@ -34,6 +34,28 @@ def nip89_announce_tasks(dvm_config, client): print("Announced NIP 89 for " + dvm_config.NIP89.NAME) + +def fetch_nip89_paramters_for_deletion( keys, eventid, client, dvmconfig): + + print("Pubkey generated from Private Key " + keys.public_key().to_hex()) + idfilter = Filter().id(EventId.from_hex(eventid)).limit(1) + nip89events = client.get_events_of([idfilter], timedelta(seconds=dvmconfig.RELAY_TIMEOUT)) + d_tag = "" + for event in nip89events: + print(event.as_json()) + for tag in event.tags(): + if tag.as_vec()[0] == "d": + d_tag = tag.as_vec()[1] + if d_tag == "": + print("No dtag found") + return + + pubkey = event.pubkey().to_hex() + print("Pubkey of Event: " + pubkey) + event_id = event.id().to_hex() + nip89_delete_announcement(event_id, keys, d_tag, client, dvmconfig) + print("NIP89 announcement deleted from known relays!") + def nip89_delete_announcement(eid: str, keys: Keys, dtag: str, client: Client, config): e_tag = Tag.parse(["e", eid]) a_tag = Tag.parse(["a", str(EventDefinitions.KIND_ANNOUNCEMENT) + ":" + keys.public_key().to_hex() + ":" + dtag]) diff --git a/utils/nostr_utils.py b/utils/nostr_utils.py index f64f47b..3847629 100644 --- a/utils/nostr_utils.py +++ b/utils/nostr_utils.py @@ -72,10 +72,9 @@ def send_event(event: Event, client: Client, dvm_config) -> EventId: def check_and_decrypt_tags(event, dvm_config): try: - tags = [] + is_encrypted = False p = "" - sender = event.pubkey() for tag in event.tags(): if tag.as_vec()[0] == 'encrypted': is_encrypted = True @@ -106,10 +105,8 @@ def check_and_decrypt_tags(event, dvm_config): def check_and_decrypt_own_tags(event, dvm_config): try: - tags = [] is_encrypted = False p = "" - sender = event.pubkey() for tag in event.tags(): if tag.as_vec()[0] == 'encrypted': is_encrypted = True @@ -187,6 +184,3 @@ def add_pk_to_env_file(dtag, oskey): dotenv.load_dotenv(env_path, verbose=True, override=True) dotenv.set_key(env_path, dtag, oskey) - -def generate_private_key(): - return Keys.generate()