diff --git a/alembic/versions/e8f2c4b6d9a1_drop_node_public_key.py b/alembic/versions/e8f2c4b6d9a1_drop_node_public_key.py new file mode 100644 index 0000000..dd40403 --- /dev/null +++ b/alembic/versions/e8f2c4b6d9a1_drop_node_public_key.py @@ -0,0 +1,43 @@ +"""Drop node_public_key table + +Revision ID: e8f2c4b6d9a1 +Revises: c6b1d8f2a9e3 +Create Date: 2026-05-25 00:00:00.000000 + +""" + +from collections.abc import Sequence + +import sqlalchemy as sa + +from alembic import op + +# revision identifiers, used by Alembic. +revision: str = "e8f2c4b6d9a1" +down_revision: str | None = "c6b1d8f2a9e3" +branch_labels: str | Sequence[str] | None = None +depends_on: str | Sequence[str] | None = None + + +def upgrade() -> None: + op.drop_index("idx_node_public_key_public_key", table_name="node_public_key") + op.drop_index("idx_node_public_key_node_id", table_name="node_public_key") + op.drop_table("node_public_key") + + +def downgrade() -> None: + op.create_table( + "node_public_key", + sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True), + sa.Column("node_id", sa.BigInteger(), nullable=False), + sa.Column("public_key", sa.String(), nullable=False), + sa.Column("first_seen_us", sa.BigInteger(), nullable=True), + sa.Column("last_seen_us", sa.BigInteger(), nullable=True), + ) + op.create_index("idx_node_public_key_node_id", "node_public_key", ["node_id"], unique=False) + op.create_index( + "idx_node_public_key_public_key", + "node_public_key", + ["public_key"], + unique=False, + ) diff --git a/meshtastic/protobuf/UPSTREAM_REV.txt b/meshtastic/protobuf/UPSTREAM_REV.txt index 3a38980..ad080a8 100644 --- a/meshtastic/protobuf/UPSTREAM_REV.txt +++ b/meshtastic/protobuf/UPSTREAM_REV.txt @@ -1 +1 @@ -cb1f89372a70b0d4b4f8caf05aec28de8d4a13e0 +59cb394dcfc4432cb216358ca26e861c7d13f462 diff --git a/meshview/lang/en.json b/meshview/lang/en.json index 1b2691a..3b6b9d9 100644 --- a/meshview/lang/en.json +++ b/meshview/lang/en.json @@ -243,7 +243,6 @@ "share_contact_qr": "Share Contact QR", "copy_url": "Copy URL", "copied": "Copied!", - "potential_impersonation": "Potential Impersonation Detected", "scan_qr_to_add": "Scan this QR code to add this node as a contact on another device." }, "packet": { diff --git a/meshview/lang/es.json b/meshview/lang/es.json index e3d6eb3..7d21ec1 100644 --- a/meshview/lang/es.json +++ b/meshview/lang/es.json @@ -229,7 +229,6 @@ "share_contact_qr": "Compartir contacto QR", "copy_url": "Copiar URL", "copied": "¡Copiado!", - "potential_impersonation": "Posible suplantación detectada", "scan_qr_to_add": "Escanea este código QR para agregar este nodo como contacto en otro dispositivo." }, diff --git a/meshview/lang/ru.json b/meshview/lang/ru.json index f914d59..f1727ba 100644 --- a/meshview/lang/ru.json +++ b/meshview/lang/ru.json @@ -224,7 +224,6 @@ "share_contact_qr": "Поделиться QR контакта", "copy_url": "Копировать URL", "copied": "Скопировано!", - "potential_impersonation": "Обнаружено возможное самозванство", "scan_qr_to_add": "Отсканируйте этот QR-код, чтобы добавить эту ноду в качестве контакта на другом устройстве." }, "packet": { diff --git a/meshview/models.py b/meshview/models.py index b450336..70fbc30 100644 --- a/meshview/models.py +++ b/meshview/models.py @@ -108,21 +108,6 @@ class Traceroute(Base): ) -class NodePublicKey(Base): - __tablename__ = "node_public_key" - - id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) - node_id: Mapped[int] = mapped_column(BigInteger, nullable=False) - public_key: Mapped[str] = mapped_column(nullable=False) - first_seen_us: Mapped[int] = mapped_column(BigInteger, nullable=True) - last_seen_us: Mapped[int] = mapped_column(BigInteger, nullable=True) - - __table_args__ = ( - Index("idx_node_public_key_node_id", "node_id"), - Index("idx_node_public_key_public_key", "public_key"), - ) - - class DailySnapshot(Base): __tablename__ = "daily_snapshot" diff --git a/meshview/mqtt_store.py b/meshview/mqtt_store.py index 82ddd0a..9e25404 100644 --- a/meshview/mqtt_store.py +++ b/meshview/mqtt_store.py @@ -12,7 +12,7 @@ from meshtastic.protobuf.config_pb2 import Config from meshtastic.protobuf.mesh_pb2 import HardwareModel from meshtastic.protobuf.portnums_pb2 import PortNum from meshview import decode_payload, mqtt_database -from meshview.models import DailySnapshot, Node, NodePublicKey, Packet, PacketSeen, Traceroute +from meshview.models import DailySnapshot, Node, Packet, PacketSeen, Traceroute logger = logging.getLogger(__name__) @@ -292,27 +292,6 @@ async def process_envelope(topic, env): ) session.add(node) - if user.public_key: - public_key_hex = user.public_key.hex() - existing_key = ( - await session.execute( - select(NodePublicKey).where( - NodePublicKey.node_id == node_id, - NodePublicKey.public_key == public_key_hex, - ) - ) - ).scalar_one_or_none() - - if existing_key: - existing_key.last_seen_us = now_us - else: - new_key = NodePublicKey( - node_id=node_id, - public_key=public_key_hex, - first_seen_us=now_us, - last_seen_us=now_us, - ) - session.add(new_key) except Exception as e: print(f"Error processing NODEINFO_APP: {e}") diff --git a/meshview/templates/node.html b/meshview/templates/node.html index d2150e7..1287179 100644 --- a/meshview/templates/node.html +++ b/meshview/templates/node.html @@ -296,32 +296,6 @@ color:#fff; } -/* --- Impersonation Warning --- */ -.impersonation-warning { - background: rgba(239, 68, 68, 0.15); - border: 1px solid rgba(239, 68, 68, 0.4); - border-radius: 8px; - padding: 12px 16px; - margin-bottom: 14px; - display: flex; - align-items: flex-start; - gap: 10px; -} -.impersonation-warning .warning-icon { - font-size: 1.2rem; -} -.impersonation-warning .warning-content { - flex: 1; -} -.impersonation-warning .warning-title { - color: #f87171; - font-weight: bold; - margin-bottom: 4px; -} -.impersonation-warning .warning-text { - font-size: 0.85rem; - color: #ccc; -} {% endblock %} {% block body %} @@ -351,15 +325,6 @@ - -
-