From 06ef65f1838ab029eb3d0d41169b8030e1d1237b Mon Sep 17 00:00:00 2001 From: Xavier Fiechter Date: Tue, 30 Jul 2024 22:43:13 +0200 Subject: [PATCH] added new files --- django/finances/admin.py | 11 +- django/finances/electrum.py | 6 +- .../migrations/0012_auto_20240701_0932.py | 22 + django/finances/models.py | 16 +- django/finances/signals.py | 12 +- django/finances/tasks.py | 2 - django/importer/forms.py | 5 + django/importer/models.py | 9 +- django/importer/pocket.py | 4 +- django/importer/samourai.py | 153 ++++++ django/importer/tasks.py | 258 ++++++----- django/importer/templatetags/importer_tags.py | 25 +- django/importer/views.py | 2 +- django/labelbase/api.py | 5 +- django/labelbase/models.py | 4 +- django/labelbase/static/Cloud.png | Bin 0 -> 91345 bytes django/labellabor/settings.py | 3 + django/labellabor/urls.py | 6 + django/labellabor/views.py | 20 + django/requirements.txt | 3 +- django/templates/_base.html | 2 +- .../_labelbase_header_info_menu.html | 37 +- django/templates/_modal_connect_api_key.html | 35 ++ django/templates/_modal_delete_labelbase.html | 26 ++ django/templates/_modal_edit_labelbase.html | 24 + .../templates/_modal_importWizzardModal.html | 43 +- django/templates/cloud.html | 51 ++ django/templates/donate.html | 112 ++++- django/templates/label_edit.html | 3 + django/templates/labelbase.html | 435 +++++++++++------- 30 files changed, 961 insertions(+), 373 deletions(-) create mode 100644 django/finances/migrations/0012_auto_20240701_0932.py create mode 100644 django/importer/samourai.py create mode 100644 django/labelbase/static/Cloud.png create mode 100644 django/templates/_modal_connect_api_key.html create mode 100644 django/templates/_modal_delete_labelbase.html create mode 100644 django/templates/_modal_edit_labelbase.html create mode 100644 django/templates/cloud.html diff --git a/django/finances/admin.py b/django/finances/admin.py index 766fba6..ba6f402 100644 --- a/django/finances/admin.py +++ b/django/finances/admin.py @@ -2,7 +2,16 @@ from django.contrib import admin from .models import OutputStat, HistoricalPrice class OutputStatAdmin(admin.ModelAdmin): - list_display = ('type_ref_hash', 'value', 'confirmed_at_block_height', 'confirmed_at_block_time', 'get_spent_status', 'spent', 'network', 'user') + list_display = ('type_ref_hash', + 'value', + 'confirmed_at_block_height', + 'confirmed_at_block_time', + 'get_spent_status', + 'spent', + 'network', + 'user', + 'next_enc_input_attrs', + 'last_error') list_filter = ('network', 'spent') search_fields = ('type_ref_hash',) ordering = ('-confirmed_at_block_time',) diff --git a/django/finances/electrum.py b/django/finances/electrum.py index bb8459b..10f57dd 100644 --- a/django/finances/electrum.py +++ b/django/finances/electrum.py @@ -88,7 +88,8 @@ def checkup_label(label_id, loop): if utxo_resp: txid, index, address, value, blocktime, utxo_data = utxo_resp if utxo_data: - output.next_input_attributes = utxo_data + #output.next_input_attributes = utxo_data + output.set_next_input_attributes(utxo_data) if blocktime: HistoricalPrice.get_or_create_from_api(timestamp=blocktime) @@ -98,9 +99,6 @@ def checkup_label(label_id, loop): conn.last_error = None # reset error if needed unspents = loop.run_until_complete(interact_addr(conn, server_info, "blockchain.scripthash.listunspent", address)) - - - utxo_value = 0 utxo_height = 0 diff --git a/django/finances/migrations/0012_auto_20240701_0932.py b/django/finances/migrations/0012_auto_20240701_0932.py new file mode 100644 index 0000000..f357d8c --- /dev/null +++ b/django/finances/migrations/0012_auto_20240701_0932.py @@ -0,0 +1,22 @@ +# Generated by Django 3.2.25 on 2024-07-01 09:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('finances', '0011_alter_outputstat_network'), + ] + + operations = [ + migrations.RemoveField( + model_name='outputstat', + name='next_input_attributes', + ), + migrations.AddField( + model_name='outputstat', + name='next_enc_input_attrs', + field=models.TextField(default=None, null=True), + ), + ] diff --git a/django/finances/models.py b/django/finances/models.py index c184486..fb51d48 100644 --- a/django/finances/models.py +++ b/django/finances/models.py @@ -7,7 +7,10 @@ from pymempool import MempoolAPI from labelbase.receivers import compute_type_ref_hash from django.conf import settings from jsonfield import JSONField +import json from django.contrib.auth.models import User +from shared.encryption import get_fernet_key, cipher_suite + import logging @@ -42,7 +45,18 @@ class OutputStat(models.Model): confirmed_at_block_time = models.IntegerField(default=0) last_error = JSONField(default={}) - next_input_attributes = JSONField(default={}) # will be used for fee estimation + next_enc_input_attrs = models.TextField(default=None, null=True) # will be used for fee estimation + + def set_next_input_attributes(self, data): + json_data = json.dumps(data).encode('utf-8') + encrypted_data = cipher_suite.encrypt(json_data) + self.next_enc_input_attrs = encrypted_data.decode('utf-8') + + def next_input_attributes(self): + encrypted_data = self.next_enc_input_attrs.encode('utf-8') + decrypted_data = cipher_suite.decrypt(encrypted_data) + return json.loads(decrypted_data.decode('utf-8')) + MAINNET = 'mainnet' TESTNET = 'testnet' diff --git a/django/finances/signals.py b/django/finances/signals.py index 40fdbe6..22cc9a2 100644 --- a/django/finances/signals.py +++ b/django/finances/signals.py @@ -1,15 +1,10 @@ from django.contrib.auth.signals import user_logged_in +from django.contrib import messages from django.dispatch import receiver from finances.models import HistoricalPrice -from django.contrib import messages - - - - @receiver(user_logged_in) def perform_tasks_on_login(sender, user, request, **kwargs): - """ """ if user.profile.update_utxo_on_login: from finances.tasks import check_all_outputs from labelbase.models import Label @@ -17,4 +12,7 @@ def perform_tasks_on_login(sender, user, request, **kwargs): if Label.objects.filter(labelbase__user_id=user.id).exists(): messages.info(request, "Sync in progress: We are checking your unspent transaction outputs now.") # Store nearest price information. - HistoricalPrice.get_or_create_from_api(-1) + try: + HistoricalPrice.get_or_create_from_api(-1) + except Exception as ex: + logger.error(ex, exc_info=True) diff --git a/django/finances/tasks.py b/django/finances/tasks.py index fb43e22..7816cbb 100644 --- a/django/finances/tasks.py +++ b/django/finances/tasks.py @@ -1,8 +1,6 @@ import logging from background_task import background from background_task.management.commands.remove_completed import _remove_completed_task - - from labelbase.models import Label from finances.electrum import checkup_label diff --git a/django/importer/forms.py b/django/importer/forms.py index d3ae1ca..e14fe52 100644 --- a/django/importer/forms.py +++ b/django/importer/forms.py @@ -8,3 +8,8 @@ class UploadFileForm(forms.Form): choices=IMPORTER_CHOICES ) file = forms.FileField() + passphrase = forms.CharField( + widget=forms.PasswordInput(), + required=False, + max_length=100 + ) diff --git a/django/importer/models.py b/django/importer/models.py index 82cafed..11c8f31 100644 --- a/django/importer/models.py +++ b/django/importer/models.py @@ -2,15 +2,18 @@ from django.db import models from django.contrib.auth.models import User from labelbase.models import Labelbase from uuid_upload_path import upload_to +from django.conf import settings -IMPORTER_CHOICES = ( +IMPORTER_CHOICES = [ ("BIP-0329", "BIP-329 .jsonl"), # TODO: ("BIP-0329-7z-enc" , "BIP-329 (encrypted) .7z"), ("csv-bluewallet", "BlueWallet .csv"), ("csv-bitbox", "BitBox .csv"), - ("pocket-accointing", "Pocket Accointing .csv") -) + ("pocket-accointing", "Pocket Accointing .csv"), +] +if settings.SELF_HOSTED: + IMPORTER_CHOICES.append(("samourai", "Samourai .txt, (v2)")) class UploadedData(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) diff --git a/django/importer/pocket.py b/django/importer/pocket.py index bbc88ca..9d8af30 100644 --- a/django/importer/pocket.py +++ b/django/importer/pocket.py @@ -1,7 +1,5 @@ import csv -import json -from labelbase.models import Label -from labelbase.models import Labelbase +import json def validate_csv_format(csv_file_path): diff --git a/django/importer/samourai.py b/django/importer/samourai.py new file mode 100644 index 0000000..f4a1cae --- /dev/null +++ b/django/importer/samourai.py @@ -0,0 +1,153 @@ +import json +from Crypto.Cipher import AES +from Crypto.Hash import SHA256 +from Crypto.Protocol.KDF import PBKDF2 +import hashlib +import re +import base64 + +from labelbase.serializers import LabelSerializer +from labelbase.models import Label + +import logging +logger = logging.getLogger('labelbase') + +DefaultPBKDF2Iterations = 5000 +DefaultPBKDF2HMACSHA256Iterations = 15000 +DefaultSamouraiImportLabel = "Imported form samourai.txt" + + + + + +def decrypt_v1(payload, password, iterations=DefaultPBKDF2Iterations): + # V1 uses PBKDF2 for key derivation and AES for decryption + AESBlockSize = 16 + cipherdata = base64.b64decode(payload) + iv = cipherdata[:AESBlockSize] + input_data = cipherdata[AESBlockSize:] + key = PBKDF2(password, iv, dkLen=32, count=iterations) + cipher = AES.new(key, AES.MODE_CBC, iv) + decrypted = cipher.decrypt(input_data) + return decrypted.rstrip(b"\x00").decode('utf-8') + + +def decrypt_v2(payload, password, iterations=DefaultPBKDF2HMACSHA256Iterations): + # V2 uses SHA256 for key derivation and AES for decryption + encrypted_bytes = base64.b64decode(payload.replace("\n", "")) + salt = encrypted_bytes[8:16] + cipher_text = encrypted_bytes[16:] + key_iv = PBKDF2(password, salt, dkLen=48, count=iterations, hmac_hash_module=SHA256) + key = key_iv[:32] + iv = key_iv[32:] + cipher = AES.new(key, AES.MODE_CBC, iv) + decrypted = cipher.decrypt(cipher_text) + pad_len = decrypted[-1] + decrypted = decrypted[:-pad_len] + return decrypted.decode('utf-8') + + +def import_samourai_labels(labelbase, content, passphrase): + content = content.decode('utf-8') + pattern = re.compile(r'\{.*?\}') + match = pattern.search(content) + imported_lables = 0 + payload = None + if match: + json_content = match.group(0) + try: + logger.info(f"json_content {json_content}") + data = json.loads(json_content) + logger.info(f"data: {data}") + version = data.get("version", 1) + payload = data.get("payload", "") + logger.info(f"version: {version}, payload {payload}, passphrase {passphrase}") + + if payload: + if version in [1, "1"]: + decrypted_data = decrypt_v1(payload, passphrase) + elif version in [2, "2"]: + decrypted_data = decrypt_v2(payload, passphrase) + else: + logger.error(f"Unsupported backup version: {version}") + raise ValueError(f"Unsupported backup version: {version}") + logger.info(decrypted_data) + samourai_data = json.loads(decrypted_data) + logger.info(samourai_data) + + """ + DOC/KB: If the labelbase where you import your samourai.txt into, labelbase will set the fingerprint, + """ + labels = Label.objects.filter(labelbase__id=labelbase.id) + if labels.count() == 0: + if not labelbase.fingerprint: + labelbase.fingerprint = samourai_data.get('wallet').get('fingerprint') + if samourai_data.get('wallet').get('testnet'): + labelbase.network == labelbase.TESTNET + else: + labelbase.network == labelbase.MAINNET + labelbase.save() + + xpub = samourai_data.get('wallet', {}).get('accounts')[0].get('xpub') + ypub = samourai_data.get('wallet', {}).get('bip49_accounts')[0].get('ypub') + zpub = samourai_data.get('wallet', {}).get('bip84_accounts')[0].get('zpub') + + for pub in [xpub, ypub, zpub]: + if pub: + _data = { + "type": Label.TYPE_XPUB, + "ref": pub, + "label": DefaultSamouraiImportLabel, + } + _data["labelbase"] = labelbase.id + serializer = LabelSerializer(data=_data) + if serializer.is_valid(): + serializer.save() + imported_lables += 1 + + utxo_notes = samourai_data.get('meta', {}).get('utxo_notes') + logger.info(utxo_notes) + for note in utxo_notes: + _data = { + "type": Label.TYPE_TX, + "ref": note[0], + "label": note[1], + } + _data["labelbase"] = labelbase.id + serializer = LabelSerializer(data=_data) + if serializer.is_valid(): + serializer.save() + imported_lables += 1 + blocked_utxos = samourai_data.get('meta', {}).get('blocked_utxos',{}).get('blocked') + logger.info(blocked_utxos) + for utxo in blocked_utxos: + _data = { + "type": Label.TYPE_OUTPUT, + "ref": utxo.get('id','').replace("-", ":"), + "label": DefaultSamouraiImportLabel, + "spendable": False + } + _data["labelbase"] = labelbase.id + serializer = LabelSerializer(data=_data) + if serializer.is_valid(): + serializer.save() + imported_lables += 1 + return imported_lables + + else: + print("No payload found in the JSON content.") + logger.error("No payload found in the JSON content.") + return imported_lables + except json.JSONDecodeError as e: + print(f"JSONDecodeError: {e}") + logger.error(f"JSONDecodeError: {e}") + return imported_lables + except Exception as ex: + print(f"An error occurred: {ex}") + logger.error(f"An error occurred: {ex}") + logger.error(ex, exc_info=True) + return imported_lables + else: + print("No JSON found in file.") + logger.error("No JSON found in file.") + return imported_lables diff --git a/django/importer/tasks.py b/django/importer/tasks.py index a29b72b..00e30aa 100644 --- a/django/importer/tasks.py +++ b/django/importer/tasks.py @@ -2,9 +2,10 @@ from background_task import background import json import decimal -from labelbase.models import Labelbase from labelbase.serializers import LabelSerializer +import logging +logger = logging.getLogger('labelbase') from .models import UploadedData @@ -12,93 +13,132 @@ EOLSTOP = [b"", "", None, "\n"] @background(schedule=1) -def process_uploaded_data(uploaded_data_id, loop=None): - imported_lables = 0 - uploaded_data = UploadedData.objects.get(pk=uploaded_data_id) - labelbase = uploaded_data.labelbase - fp = uploaded_data.file.open() +def process_uploaded_data(uploaded_data_id, passphrase=None, loop=None): + try: + uploaded_data = UploadedData.objects.get(pk=uploaded_data_id) + imported_lables = 0 + labelbase = uploaded_data.labelbase + fp = uploaded_data.file.open() - # BIP-0329 - if uploaded_data.import_type == "BIP-0329": - while True: - buf = fp.readline() - if buf in EOLSTOP: - break - data = json.loads(buf) - data["labelbase"] = labelbase.id - serializer = LabelSerializer(data=data) - if serializer.is_valid(): - serializer.save() - imported_lables += 1 - elif uploaded_data.import_type == "BIP-0329-7z-enc": - # TODO: Implementation needed. - pass - # Bitbox App - elif uploaded_data.import_type == "csv-bitbox": - while True: - buf = fp.readline() - if buf in EOLSTOP: - break - try: - buf = str(buf.decode("utf-8")) - sbuf = buf.split(",") - # Time,Type,Amount,Unit,Fee,Address,Transaction ID,Note - for elem in [("tx", 6), ("addr", 5)]: - data = { - "type": elem[0], - "ref": sbuf[elem[1]], - "label": " ".join(sbuf[7:]), - } - data["labelbase"] = labelbase.id - serializer = LabelSerializer(data=data) - if serializer.is_valid(): - serializer.save() - imported_lables += 1 - else: - messages.add_message( - request, - messages.ERROR, - 'Could not process line "{}".'.format(buf), - ) - except Exception as ex: - messages.add_message( - request, - messages.ERROR, - 'Could not process line "{}", {}.'.format(buf, ex), - ) - # Pocket Accointing - elif uploaded_data.import_type == "pocket-accointing": - fp.close() - csv_file_path = fp.name - mempool_api = labelbase.get_mempool_api() - from .pocket import validate_csv_format, parse_csv_to_json - if validate_csv_format(csv_file_path): - for item in parse_csv_to_json(csv_file_path): - label = "Got {} {} for {:.2f} {} with reference: {} #Pocket".format(item[0].get('outSellAmount'), item[1].get( - 'inBuyAsset'), decimal.Decimal(item[2].get('inBuyAmount')), item[2].get('inBuyAsset'), item[1].get('operationId')) - txid = item[0].get('operationId') - tx = mempool_api.get_transaction(txid) - potential_utxos = [] - vouts = tx.get("vout", []) - for i in range(len(vouts)): - if vouts[i].get('value', 0) == decimal.Decimal(item[0].get('outSellAmount'))*100000000: - potential_utxos.append("{}:{}".format(txid, i )) - data = {} - if len(potential_utxos) == 1: - # label UTXO/output of tx - data = { - "type": "output", - "ref": potential_utxos[0], - "label": label, - } - if len(potential_utxos) > 1: - # mark tx, add warning tag + # BIP-0329 + if uploaded_data.import_type == "BIP-0329": + while True: + buf = fp.readline() + if buf in EOLSTOP: + break + data = json.loads(buf) + data["labelbase"] = labelbase.id + serializer = LabelSerializer(data=data) + if serializer.is_valid(): + serializer.save() + imported_lables += 1 + elif uploaded_data.import_type == "BIP-0329-7z-enc": + # TODO: Implementation needed. + pass + elif uploaded_data.import_type == "samourai": + buf = fp.read() + logger.info(buf) + print(buf) + from .samourai import import_samourai_labels + import_samourai_labels(labelbase, buf, passphrase) + # Bitbox App + elif uploaded_data.import_type == "csv-bitbox": + while True: + buf = fp.readline() + if buf in EOLSTOP: + break + try: + buf = str(buf.decode("utf-8")) + sbuf = buf.split(",") + # Time,Type,Amount,Unit,Fee,Address,Transaction ID,Note + for elem in [("tx", 6), ("addr", 5)]: + data = { + "type": elem[0], + "ref": sbuf[elem[1]], + "label": " ".join(sbuf[7:]), + } + data["labelbase"] = labelbase.id + serializer = LabelSerializer(data=data) + if serializer.is_valid(): + serializer.save() + imported_lables += 1 + else: + messages.add_message( + request, + messages.ERROR, + 'Could not process line "{}".'.format(buf), + ) + except Exception as ex: + messages.add_message( + request, + messages.ERROR, + 'Could not process line "{}", {}.'.format(buf, ex), + ) + # Pocket Accointing + elif uploaded_data.import_type == "pocket-accointing": + fp.close() + csv_file_path = fp.name + mempool_api = labelbase.get_mempool_api() + from .pocket import validate_csv_format, parse_csv_to_json + if validate_csv_format(csv_file_path): + for item in parse_csv_to_json(csv_file_path): + label = "Got {} {} for {:.2f} {} with reference: {} #Pocket".format(item[0].get('outSellAmount'), item[1].get( + 'inBuyAsset'), decimal.Decimal(item[2].get('inBuyAmount')), item[2].get('inBuyAsset'), item[1].get('operationId')) + txid = item[0].get('operationId') + tx = mempool_api.get_transaction(txid) + potential_utxos = [] + vouts = tx.get("vout", []) + for i in range(len(vouts)): + if vouts[i].get('value', 0) == decimal.Decimal(item[0].get('outSellAmount'))*100000000: + potential_utxos.append("{}:{}".format(txid, i )) + data = {} + if len(potential_utxos) == 1: + # label UTXO/output of tx + data = { + "type": "output", + "ref": potential_utxos[0], + "label": label, + } + if len(potential_utxos) > 1: + # mark tx, add warning tag + data = { + "type": "tx", + "ref": txid, + "label": "{} {}".format(label, "#W001_UTXO_NOT_FOUND"), + } + if data: + data["labelbase"] = labelbase.id + serializer = LabelSerializer(data=data) + if serializer.is_valid(): + serializer.save() + imported_lables += 1 + else: + # messages.add_message( + # request, + # messages.ERROR, + # 'Could not process record "{}".'.format(item), + # ) + pass + else: + print("ERROR") # TODO + # BlueWallet + elif uploaded_data.import_type == "csv-bluewallet": + header_row = True + while True: + buf = fp.readline() + if buf in EOLSTOP: + break + if header_row: + header_row = False + continue + try: + buf = str(buf.decode("utf-8")) + sbuf = buf.split(",") data = { "type": "tx", - "ref": txid, - "label": "{} {}".format(label, "#W001_UTXO_NOT_FOUND"), + "ref": sbuf[1], + "label": " ".join(sbuf[3:]), } - if data: data["labelbase"] = labelbase.id serializer = LabelSerializer(data=data) if serializer.is_valid(): @@ -108,50 +148,20 @@ def process_uploaded_data(uploaded_data_id, loop=None): # messages.add_message( # request, # messages.ERROR, - # 'Could not process record "{}".'.format(item), + # 'Could not process line "{}".'.format(buf), # ) pass - else: - print("ERROR") # TODO - # BlueWallet - elif uploaded_data.import_type == "csv-bluewallet": - header_row = True - while True: - buf = fp.readline() - if buf in EOLSTOP: - break - if header_row: - header_row = False - continue - try: - buf = str(buf.decode("utf-8")) - sbuf = buf.split(",") - data = { - "type": "tx", - "ref": sbuf[1], - "label": " ".join(sbuf[3:]), - } - data["labelbase"] = labelbase.id - serializer = LabelSerializer(data=data) - if serializer.is_valid(): - serializer.save() - imported_lables += 1 - else: + except Exception as ex: # messages.add_message( # request, # messages.ERROR, - # 'Could not process line "{}".'.format(buf), + # 'Could not process line "{}", {}.'.format(buf, ex), # ) pass - except Exception as ex: - # messages.add_message( - # request, - # messages.ERROR, - # 'Could not process line "{}", {}.'.format(buf, ex), - # ) - pass - # Clean up – Note: Currently we delete the upload from the file system, - # later we can store the messages.add_message messages, the state and the - # amount of importet labels in it to propagate the messages to the - # frontend/user interface. - uploaded_data.delete() + # Clean up – Note: Currently we delete the upload from the file system, + # later we can store the messages.add_message messages, the state and the + # amount of importet labels in it to propagate the messages to the + # frontend/user interface. + uploaded_data.delete() + except Exception as ex: + logger.error(ex, exc_info=True) diff --git a/django/importer/templatetags/importer_tags.py b/django/importer/templatetags/importer_tags.py index dc43461..a10cfb0 100644 --- a/django/importer/templatetags/importer_tags.py +++ b/django/importer/templatetags/importer_tags.py @@ -10,27 +10,4 @@ def genericlabeluploadform(labelbase_id): form.fields["labelbase_id"].initial = labelbase_id form.fields["import_type"].initial = "BIP-0329" return form - - -@register.simple_tag -def bip0329labeluploadform(labelbase_id): - form = UploadFileForm() - form.fields["labelbase_id"].initial = labelbase_id - form.fields["import_type"].initial = "BIP-0329" - return form - - -@register.simple_tag -def csvBlueWalletlabeluploadform(labelbase_id): - form = UploadFileForm() - form.fields["labelbase_id"].initial = labelbase_id - form.fields["import_type"].initial = "csv-bluewallet" - return form - - -@register.simple_tag -def csvBitBoxLabeluploadform(labelbase_id): - form = UploadFileForm() - form.fields["labelbase_id"].initial = labelbase_id - form.fields["import_type"].initial = "csv-bitbox" - return form + diff --git a/django/importer/views.py b/django/importer/views.py index 62e1dd1..7b72d57 100644 --- a/django/importer/views.py +++ b/django/importer/views.py @@ -30,7 +30,7 @@ def upload_labels(request): file=request.FILES["file"], ) # Schedule the background task to process the uploaded data - process_uploaded_data(uploaded_data.id) + process_uploaded_data(uploaded_data.id, passphrase=form.cleaned_data.get("passphrase", None)) messages.add_message( request, messages.INFO, diff --git a/django/labelbase/api.py b/django/labelbase/api.py index 2ec8a2d..5781795 100644 --- a/django/labelbase/api.py +++ b/django/labelbase/api.py @@ -10,6 +10,9 @@ from labelbase.models import Labelbase, Label from labelbase.serializers import LabelbaseSerializer, LabelSerializer +import logging +logger = logging.getLogger('labelbase') + class LabelbaseAPIView(APIView): """ Labelbase @@ -90,7 +93,7 @@ class LabelAPIView(APIView): "spendable": request.data.get("spendable", "null"), } - + #logger.debug(f"data: {data}") serializer = LabelSerializer(data=data) if serializer.is_valid(): serializer.save() diff --git a/django/labelbase/models.py b/django/labelbase/models.py index 6ba61fc..f719a63 100644 --- a/django/labelbase/models.py +++ b/django/labelbase/models.py @@ -130,7 +130,7 @@ class Label(models.Model): TYPE_PUBKEY = "pubkey" TYPE_INPUT = "input" TYPE_OUTPUT = "output" - TYPE_XPUT = "xpub" + TYPE_XPUB = "xpub" TYPE_CHOICES = [ (TYPE_TX, "tx"), @@ -138,7 +138,7 @@ class Label(models.Model): (TYPE_PUBKEY, "pubkey"), (TYPE_INPUT, "input"), (TYPE_OUTPUT, "output"), - (TYPE_XPUT, "xpub"), + (TYPE_XPUB, "xpub"), ] type = models.CharField( diff --git a/django/labelbase/static/Cloud.png b/django/labelbase/static/Cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..5882b4a43f2d94f6346bbf1265cdff5b7d69c8f2 GIT binary patch literal 91345 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 KQY@0U2>u^A/update//", login_required(OutputStatUpdateRedirectView.as_view()), diff --git a/django/labellabor/views.py b/django/labellabor/views.py index e83cd0f..0072354 100644 --- a/django/labellabor/views.py +++ b/django/labellabor/views.py @@ -101,6 +101,22 @@ class BitcoinAddressDatatableView(BaseDatatableView): pub = key.derive(f"m/0/{idx}").key sc = script.p2wpkh(pub) address = sc.address(NETWORKS["main"]) + elif derivation == 'm/44' and xpub.startswith("tpub"): + # BIP 44 - Legacy Addresses (P2PKH) + pub = key.derive(f"m/0/{idx}").key + sc = script.p2pkh(pub) + address = sc.address(NETWORKS["test"]) + elif derivation == 'm/49' and xpub.startswith("upub"): + # BIP 49 - SegWit Addresses (P2SH-P2WPKH) + pub = key.derive(f"m/0/{idx}").key + witness_script = script.p2wpkh(pub) + sc = script.p2sh(witness_script) + address = sc.address(NETWORKS["test"]) + elif derivation == 'm/84' and xpub.startswith("vpub"): + # BIP 84 - Native SegWit Addresses (P2WPKH) + pub = key.derive(f"m/0/{idx}").key + sc = script.p2wpkh(pub) + address = sc.address(NETWORKS["test"]) else: continue @@ -171,6 +187,10 @@ class InteroperationalView(TemplateView): template_name = "interoperational.html" +class CloudView(TemplateView): + template_name = "cloud.html" + + class HomeView(TemplateView): template_name = "home.html" diff --git a/django/requirements.txt b/django/requirements.txt index 34f0759..4f9e659 100644 --- a/django/requirements.txt +++ b/django/requirements.txt @@ -1,11 +1,12 @@ gunicorn asgiref==3.4.1 -certifi==2023.07.22 +certifi==2024.07.04 cffi==1.15.1 charset-normalizer==2.0.12 coreapi==2.3.3 coreschema==0.0.4 cryptography==42.0.4 +pycryptodome Django==3.2.25 django-appconf==1.0.5 django-bootstrap-form==3.4 diff --git a/django/templates/_base.html b/django/templates/_base.html index 1c1a6da..fe1e9f7 100644 --- a/django/templates/_base.html +++ b/django/templates/_base.html @@ -184,7 +184,7 @@ {% endif %} {% endwith %} - + {% comment %}
  • UTXOs Health
  • {% endcomment %}
  • Tree Map
  • {% comment %}
  • Stats & KPIs
  • {% endcomment %} {% if request.user.profile.use_fiatfinances %} diff --git a/django/templates/_labelbase_header_info_menu.html b/django/templates/_labelbase_header_info_menu.html index f16d081..77b9b88 100644 --- a/django/templates/_labelbase_header_info_menu.html +++ b/django/templates/_labelbase_header_info_menu.html @@ -8,30 +8,35 @@ {% endif %}
    +
    - - - {% comment %} - - Export - {% endcomment %} +--> + + + + + +
    - + + +
    + {% addtoblock "js" %} + $(document).ready(function () { - var form = $('#importLabelbaseModal form'); - form.on('submit', function () { - // Disable the OK button on form submission - $('#importLabelbaseModal button[type="submit"]').prop('disabled', true); + var form = $('#importLabelbaseModal form'); + var importTypeField = $('#id_import_type'); + var passphraseFieldGroup = $('#id_passphrase').closest('.form-group'); + + function togglePassphraseField() { + if (importTypeField.val() === 'samourai') { + passphraseFieldGroup.show(); + $('#id_passphrase').prop('disabled', false); + $('#samourai-warning').show(); + } else { + passphraseFieldGroup.hide(); + $('#id_passphrase').prop('disabled', true); + $('#id_passphrase').val('') + $('#samourai-warning').hide(); + } + } + + importTypeField.on('change', togglePassphraseField); + + // Initial call to set the correct state on page load + togglePassphraseField(); + + form.on('submit', function () { + // Disable the OK button on form submission + $('#importLabelbaseModal button[type="submit"]').prop('disabled', true); + }); }); -}); + {% endaddtoblock %} diff --git a/django/templates/cloud.html b/django/templates/cloud.html new file mode 100644 index 0000000..347533c --- /dev/null +++ b/django/templates/cloud.html @@ -0,0 +1,51 @@ +{% extends "_base.html" %} +{% load i18n %} + +{% block title %}Interoperability{% endblock %} +{% block nav_home %}active{% endblock %} + +{% block content %} +
    +

    Lbelbase

    +

    All your labels in one place.

    +
    + + + +
    + + +
    +
    +
    + ... +
    +

    Cloud

    + +

    "Use your labels here, use your labels there – Dave doesn't care."

    +

    + Be like Dave with Labelbase, your ultimate cloud-based platform for managing, merging, and synchronizing wallet labels across all your devices and wallet applications. + +Labelbase seamlessly synchronizes your labels across various wallets and systems, ensuring you have consistent and organized data wherever you go. Simplify your financial management and stay in sync with Labelbase. +

    + + +

    +

    + Get started +

    +
    +
    +
    +
    + +
    + +{% endblock %} diff --git a/django/templates/donate.html b/django/templates/donate.html index 3056ac5..dc6a32d 100644 --- a/django/templates/donate.html +++ b/django/templates/donate.html @@ -7,22 +7,106 @@ {% block content %} -
    -

    Support Labelbase: Make a difference with your donation

    -
    -

    Every contribution helps us build a better Bitcoin labeling experience.

    -

    -Choose the amount you'd like to donate to Labelbase. -

    -Your generosity ensures that our project continues to thrive and evolve, directly supporting our mission to make Bitcoin transactions more organized and transparent. -

    -Thank you for your support! + +

    +

    Support Labelbase: Keep it Going

    + +

    + Every contribution helps us continue building a better Bitcoin labeling experience. +

    +

    + Choose the amount you'd like to donate to Labelbase. +

    +

    + As a free and open-source software, your generosity is crucial to our mission. Your support ensures our project keeps thriving and evolving, directly enhancing Bitcoin label management. +

    + + + + +
    + + + + + + +
    + + + +
    + +
    + + +


    + Thank you for keeping Labelbase going.

    - - - - +
    + + Seedor powers our BTCPay Server instance, providing secure and private donations. + +
    diff --git a/django/templates/label_edit.html b/django/templates/label_edit.html index 7e4542a..e6ff81b 100644 --- a/django/templates/label_edit.html +++ b/django/templates/label_edit.html @@ -64,10 +64,13 @@
  • Fix & Manage