Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
36c4ab8
Add Phase 1 of hub/downlink echomail distribution system
awehttam Aug 8, 2026
7ad64d7
Add Phase 2 of hub/downlink echomail distribution system: delivery
awehttam Aug 8, 2026
0e4c6a7
Add Phase 3 netmail routing and fix outbound netmail to downlinks
awehttam Aug 8, 2026
3779f40
Allow plaintext auth fallback for registered downlinks
awehttam Aug 8, 2026
e46c5a9
Add Downlink Queue viewer to /binkp and overhaul binkp_test_client.php
awehttam Aug 8, 2026
4ddc552
Fix netmail relay routing gap and duplicate PID/tearline/missing Via
awehttam Aug 8, 2026
ba7f46c
Fix spurious "Sent file not found" warning for hub node deliveries
awehttam Aug 8, 2026
b17f039
Remove HUB_ROUTE_NETMAIL flag - it silently dropped real replies to p…
awehttam Aug 8, 2026
b6a8223
Fix Boss Address field resetting to the wrong AKA when editing a point
awehttam Aug 8, 2026
7122cff
Relay inbound echomail from downlinks/points to the uplink; fix dupli…
awehttam Aug 8, 2026
b0dee01
Add echomail composing support to binkp_test_client.php
awehttam Aug 8, 2026
bc09efd
Fix unreadable Type badge on the Downlink Queue tab
awehttam Aug 8, 2026
120849c
Purge old sent/failed hub_node_outbound packets in database_maintenan…
awehttam Aug 8, 2026
fc5542c
Add Downlinks documentation and cross-link it from index/UPGRADING/MA…
awehttam Aug 8, 2026
dc2c476
Restructure hub/point proposal: split TIC/file distribution into Phas…
awehttam Aug 8, 2026
abef234
Use 8.3-compatible filenames for hub node outbound packets
awehttam Aug 8, 2026
c5e9470
Implement Phase 4 (TIC/File Area Distribution) of the hub/point proposal
awehttam Aug 8, 2026
3648f85
Scope AreaFix/FileFix self-service subscriptions to a node's own netw…
awehttam Aug 8, 2026
23af07c
Add Areafix/FileFix robot passwords and server-side processor (Phase 5)
awehttam Aug 8, 2026
2eb69d7
Domain-scope the admin hub node echoarea/filearea subscription checklist
awehttam Aug 8, 2026
56f124b
Add AreaFix %RESCAN command for echomail
awehttam Aug 9, 2026
0fda82e
Document AreaFix %RESCAN in the hub/point proposal and Downlinks guide
awehttam Aug 9, 2026
03f9731
Rename BinkP admin menu labels and relabel status page tabs
awehttam Aug 9, 2026
cc69442
Bundle hub node outbound echomail/netmail into one packet at delivery…
awehttam Aug 9, 2026
5958f30
Add opt-in outbound compression for hub node bundles, retry failed se…
awehttam Aug 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 74 additions & 3 deletions config/i18n/de/common.php
Original file line number Diff line number Diff line change
Expand Up @@ -326,7 +326,7 @@
'ui.base.admin.licensing' => 'Lizenzierung',
'ui.base.admin.bbs_settings' => 'BBS-Einstellungen',
'ui.base.admin.appearance' => 'Aussehen',
'ui.base.admin.binkp_configuration' => 'BinkP-Konfiguration',
'ui.base.admin.binkp_configuration' => 'BinkP-Uplinks',
'ui.base.admin.template_editor' => 'Template Bearbeitenor',
'ui.base.admin.i18n_overrides' => 'Language Overrides',
'ui.base.admin.docs' => 'Dokumentation',
Expand Down Expand Up @@ -3326,8 +3326,25 @@
'ui.binkp.uplinks' => 'Uplinks',
'ui.binkp.status_tab' => 'Status',
'ui.binkp.uplinks_tab' => 'Uplinks',
'ui.binkp.queues_tab' => 'Warteschlangen',
'ui.binkp.kept_packets_tab' => 'Kept Packets',
'ui.binkp.queues_tab' => 'Uplink-Warteschlangen',
'ui.binkp.hub_outbound_tab' => 'Downlink-Warteschlange',
'ui.binkp.hub_outbound_heading' => 'Downlink-Ausgangswarteschlange',
'ui.binkp.hub_outbound.downlink' => 'Downlink',
'ui.binkp.hub_outbound.type' => 'Typ',
'ui.binkp.hub_outbound.size' => 'Größe',
'ui.binkp.hub_outbound.attempts' => 'Versuche',
'ui.binkp.hub_outbound.created' => 'Erstellt',
'ui.binkp.hub_outbound.sent_next' => 'Gesendet / Nächster Versuch',
'ui.binkp.hub_outbound.error' => 'Fehler',
'ui.binkp.hub_outbound.empty' => 'Keine Downlink-Pakete in der Warteschlange',
'ui.binkp.hub_outbound.inspect' => 'Untersuchen',
'ui.binkp.hub_outbound.load_failed' => 'Downlink-Warteschlange konnte nicht geladen werden',
'ui.binkp.hub_outbound.tic_fields' => 'TIC-Felder',
'ui.binkp.hub_outbound.tic_area' => 'Bereich',
'ui.binkp.hub_outbound.tic_file' => 'Datei',
'ui.binkp.hub_outbound.tic_desc' => 'Beschreibung',
'ui.binkp.hub_outbound.tic_ldesc' => 'Ausführliche Beschreibung',
'ui.binkp.kept_packets_tab' => 'Aufbewahrte Uplink-Pakete',
'ui.binkp.kept_packets_locked' => 'Diese Funktion erfordert eine registrierte Lizenz.',
'ui.binkp.kept_packets_register' => 'Register to unlock',
'ui.binkp.logs_tab' => 'Logs',
Expand Down Expand Up @@ -5342,4 +5359,58 @@
'ui.echoareas_import.rule_na_comments' => 'Zeilen, die mit <code>%</code> oder <code>;</code> beginnen, werden als Kommentare behandelt und übersprungen.',
'ui.echoareas_import.error_choose_na' => 'Bitte wähle eine .NA-Datei zum Importieren aus.',
'ui.echoareas_import.error_open_na' => 'Die hochgeladene .NA-Datei konnte nicht geöffnet werden.',
'ui.base.admin.hub_nodes' => 'BinkP-Downlinks',
'ui.admin.hub_nodes.page_title' => 'Downlinks',
'ui.admin.hub_nodes.heading' => 'Downlinks',
'ui.admin.hub_nodes.intro' => 'Verwalte untergeordnete FTN-Knoten und Points, an die diese BBS Echomail verteilt.',
'ui.admin.hub_nodes.add_node' => 'Downlink hinzufügen',
'ui.admin.hub_nodes.edit_node' => 'Downlink bearbeiten',
'ui.admin.hub_nodes.type' => 'Typ',
'ui.admin.hub_nodes.type_node' => 'Knoten',
'ui.admin.hub_nodes.type_point' => 'Point',
'ui.admin.hub_nodes.address' => 'Adresse',
'ui.admin.hub_nodes.boss_address' => 'Boss-Adresse',
'ui.admin.hub_nodes.point_number' => 'Point-Nummer',
'ui.admin.hub_nodes.name' => 'Name',
'ui.admin.hub_nodes.sysop_name' => 'Sysop-Name',
'ui.admin.hub_nodes.session_password' => 'Sitzungspasswort',
'ui.admin.hub_nodes.session_password_help' => 'Wird verwendet, um diesen untergeordneten Knoten zu authentifizieren, wenn er sich mit uns verbindet. Leer lassen, um das vorhandene Passwort beizubehalten.',
'ui.admin.hub_nodes.packet_password' => 'Paketpasswort',
'ui.admin.hub_nodes.areafix_password' => 'AreaFix-Passwort',
'ui.admin.hub_nodes.areafix_password_help' => 'Passwort, das dieser Downlink zur Verwaltung seiner Bereichsabonnements per AreaFix-Netmail senden muss. Leer lassen, um das bestehende Passwort zu behalten; unbesetzt lassen, um AreaFix fur diesen Downlink zu deaktivieren.',
'ui.admin.hub_nodes.filefix_password' => 'FileFix-Passwort',
'ui.admin.hub_nodes.filefix_password_help' => 'Passwort, das dieser Downlink zur Verwaltung seiner Dateibereichsabonnements per FileFix-Netmail senden muss. Leer lassen, um das bestehende Passwort zu behalten; unbesetzt lassen, um FileFix fur diesen Downlink zu deaktivieren.',
'ui.admin.hub_nodes.inet_host' => 'Internet-Host',
'ui.admin.hub_nodes.inet_host_help' => 'Alternativer Host für Push-Zustellung. Points haben in der Regel keinen erreichbaren Host und werden nur abgeholt (Pull).',
'ui.admin.hub_nodes.port' => 'Port',
'ui.admin.hub_nodes.enabled' => 'Aktiviert',
'ui.admin.hub_nodes.hold_mail' => 'Mail zurückhalten',
'ui.admin.hub_nodes.compress_outbound' => 'Ausgang komprimieren',
'ui.admin.hub_nodes.compress_outbound_help' => 'Gebündelte ausgehende Echomail/Netmail statt als Roh-Paket in ein ZIP-Arcmail-Bundle packen. Nur aktivieren, wenn die Gegenstelle eine weitere BinktermPHP-Instanz oder ein Mailer ist, der Bundle-Erweiterungen automatisch erkennt.',
'ui.admin.hub_nodes.allow_inbound_echomail' => 'Echomail von diesem untergeordneten Knoten annehmen',
'ui.admin.hub_nodes.allow_inbound_netmail' => 'Netmail von diesem untergeordneten Knoten annehmen',
'ui.admin.hub_nodes.max_packet_kb' => 'Maximale Paketgröße (KB)',
'ui.admin.hub_nodes.max_packet_kb_help' => '0 = unbegrenzt',
'ui.admin.hub_nodes.queue_retention_days' => 'Warteschlangen-Aufbewahrung (Tage)',
'ui.admin.hub_nodes.notes' => 'Notizen',
'ui.admin.hub_nodes.flags' => 'Merkmale',
'ui.admin.hub_nodes.queue' => 'Aufbewahrung',
'ui.admin.hub_nodes.disabled' => 'Deaktiviert',
'ui.admin.hub_nodes.days' => 'Tage',
'ui.admin.hub_nodes.delete_confirm' => 'Diesen Downlink löschen?',
'ui.admin.hub_nodes.load_failed' => 'Downlinks konnten nicht geladen werden',
'ui.admin.hub_nodes.save_failed' => 'Downlink konnte nicht gespeichert werden',
'ui.admin.hub_nodes.saved' => 'Downlink gespeichert',
'ui.admin.hub_nodes.delete_failed' => 'Downlink konnte nicht gelöscht werden',
'ui.admin.hub_nodes.deleted' => 'Downlink gelöscht',
'ui.admin.hub_nodes.areas.title' => 'Bereichsabonnements',
'ui.admin.hub_nodes.areas.none' => 'Keine Echobereiche gefunden',
'ui.admin.hub_nodes.areas.load_failed' => 'Bereichsabonnements konnten nicht geladen werden',
'ui.admin.hub_nodes.areas.save_failed' => 'Bereichsabonnements konnten nicht gespeichert werden',
'ui.admin.hub_nodes.areas.saved' => 'Bereichsabonnements gespeichert',
'ui.admin.hub_nodes.fileareas.title' => 'Dateibereichsabonnements',
'ui.admin.hub_nodes.fileareas.none' => 'Keine Dateibereiche gefunden',
'ui.admin.hub_nodes.fileareas.load_failed' => 'Dateibereichsabonnements konnten nicht geladen werden',
'ui.admin.hub_nodes.fileareas.save_failed' => 'Dateibereichsabonnements konnten nicht gespeichert werden',
'ui.admin.hub_nodes.fileareas.saved' => 'Dateibereichsabonnements gespeichert',
];
10 changes: 10 additions & 0 deletions config/i18n/de/errors.php
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,8 @@
'errors.binkp.kept_packets.license_required' => 'Ansehening packet files requires registration',
'errors.binkp.kept_packets.inspect_failed' => 'Failed to inspect packet',
'errors.binkp.queue.inspect_failed' => 'Failed to inspect queue packet',
'errors.binkp.hub_outbound.list_failed' => 'Downlink-Warteschlange konnte nicht geladen werden',
'errors.binkp.hub_outbound.invalid_id' => 'Ungültige Warteschlangen-ID',
'errors.binkp.uplink.address_hostname_required' => 'Hinzufügenress and hostname sind erforderlich',
'errors.binkp.uplink.address_required' => 'Uplink address ist erforderlich',
'errors.messages.forward_email.email_required' => 'An email address ist erforderlich',
Expand Down Expand Up @@ -769,4 +771,12 @@
'errors.admin.appearance.term_menu_keys.duplicate_key' => 'Jede Menütaste muss eindeutig sein',
'errors.admin.appearance.term_menu_keys.quit_required' => 'Für Beenden muss eine Taste zugewiesen sein',
'errors.admin.appearance.term_menu_keys.save_failed' => 'Die Menütasteneinstellungen konnten nicht gespeichert werden',
'errors.admin.hub_nodes.load_failed' => 'Downlinks konnten nicht geladen werden',
'errors.admin.hub_nodes.save_failed' => 'Downlink konnte nicht gespeichert werden',
'errors.admin.hub_nodes.delete_failed' => 'Downlink konnte nicht gelöscht werden',
'errors.admin.hub_nodes.areas_load_failed' => 'Bereichsabonnements konnten nicht geladen werden',
'errors.admin.hub_nodes.areas_save_failed' => 'Bereichsabonnements konnten nicht gespeichert werden',
'errors.admin.hub_nodes.fileareas_load_failed' => 'Dateibereichsabonnements konnten nicht geladen werden',
'errors.admin.hub_nodes.fileareas_save_failed' => 'Dateibereichsabonnements konnten nicht gespeichert werden',
'errors.admin.hub_nodes.next_point_failed' => 'Die nächste Point-Nummer konnte nicht ermittelt werden',
];
77 changes: 74 additions & 3 deletions config/i18n/en/common.php
Original file line number Diff line number Diff line change
Expand Up @@ -326,7 +326,7 @@
'ui.base.admin.licensing' => 'Licensing',
'ui.base.admin.bbs_settings' => 'BBS Settings',
'ui.base.admin.appearance' => 'Appearance',
'ui.base.admin.binkp_configuration' => 'Binkp Configuration',
'ui.base.admin.binkp_configuration' => 'BinkP Uplinks',
'ui.base.admin.template_editor' => 'Template Editor',
'ui.base.admin.i18n_overrides' => 'Language Overrides',
'ui.base.admin.docs' => 'Documentation',
Expand Down Expand Up @@ -3346,8 +3346,25 @@
'ui.binkp.uplinks' => 'Uplinks',
'ui.binkp.status_tab' => 'Status',
'ui.binkp.uplinks_tab' => 'Uplinks',
'ui.binkp.queues_tab' => 'Queues',
'ui.binkp.kept_packets_tab' => 'Kept Packets',
'ui.binkp.queues_tab' => 'Uplink Queues',
'ui.binkp.hub_outbound_tab' => 'Downlink Queue',
'ui.binkp.hub_outbound_heading' => 'Downlink Outbound Queue',
'ui.binkp.hub_outbound.downlink' => 'Downlink',
'ui.binkp.hub_outbound.type' => 'Type',
'ui.binkp.hub_outbound.size' => 'Size',
'ui.binkp.hub_outbound.attempts' => 'Attempts',
'ui.binkp.hub_outbound.created' => 'Created',
'ui.binkp.hub_outbound.sent_next' => 'Sent / Next Attempt',
'ui.binkp.hub_outbound.error' => 'Error',
'ui.binkp.hub_outbound.empty' => 'No queued downlink packets',
'ui.binkp.hub_outbound.inspect' => 'Inspect',
'ui.binkp.hub_outbound.load_failed' => 'Failed to load downlink queue',
'ui.binkp.hub_outbound.tic_fields' => 'TIC Fields',
'ui.binkp.hub_outbound.tic_area' => 'Area',
'ui.binkp.hub_outbound.tic_file' => 'File',
'ui.binkp.hub_outbound.tic_desc' => 'Description',
'ui.binkp.hub_outbound.tic_ldesc' => 'Long Description',
'ui.binkp.kept_packets_tab' => 'Uplink Kept Packets',
'ui.binkp.kept_packets_locked' => 'This feature requires a registered license.',
'ui.binkp.kept_packets_register' => 'Register to unlock',
'ui.binkp.logs_tab' => 'Logs',
Expand Down Expand Up @@ -5235,6 +5252,60 @@
'ui.admin.networks.deleted' => 'Network deleted',
'ui.admin.networks.change_domain_failed' => 'Failed to change domain',
'ui.admin.networks.domain_changed' => 'Domain changed',
'ui.base.admin.hub_nodes' => 'BinkP Downlinks',
'ui.admin.hub_nodes.page_title' => 'Downlinks',
'ui.admin.hub_nodes.heading' => 'Downlinks',
'ui.admin.hub_nodes.intro' => 'Manage subordinate FTN nodes and points this BBS distributes echomail to.',
'ui.admin.hub_nodes.add_node' => 'Add Downlink',
'ui.admin.hub_nodes.edit_node' => 'Edit Downlink',
'ui.admin.hub_nodes.type' => 'Type',
'ui.admin.hub_nodes.type_node' => 'Node',
'ui.admin.hub_nodes.type_point' => 'Point',
'ui.admin.hub_nodes.address' => 'Address',
'ui.admin.hub_nodes.boss_address' => 'Boss Address',
'ui.admin.hub_nodes.point_number' => 'Point Number',
'ui.admin.hub_nodes.name' => 'Name',
'ui.admin.hub_nodes.sysop_name' => 'Sysop Name',
'ui.admin.hub_nodes.session_password' => 'Session Password',
'ui.admin.hub_nodes.session_password_help' => 'Used to authenticate this subordinate when it connects to us. Leave blank to keep the existing password.',
'ui.admin.hub_nodes.packet_password' => 'Packet Password',
'ui.admin.hub_nodes.areafix_password' => 'AreaFix Password',
'ui.admin.hub_nodes.areafix_password_help' => 'Password this subordinate must send to manage its echo area subscriptions via AreaFix netmail. Leave blank to keep the existing password; leave unset to disable AreaFix for this subordinate.',
'ui.admin.hub_nodes.filefix_password' => 'FileFix Password',
'ui.admin.hub_nodes.filefix_password_help' => 'Password this subordinate must send to manage its file area subscriptions via FileFix netmail. Leave blank to keep the existing password; leave unset to disable FileFix for this subordinate.',
'ui.admin.hub_nodes.inet_host' => 'Internet Host',
'ui.admin.hub_nodes.inet_host_help' => 'Override host for push delivery. Points typically have no routable host and are pull-only.',
'ui.admin.hub_nodes.port' => 'Port',
'ui.admin.hub_nodes.enabled' => 'Enabled',
'ui.admin.hub_nodes.hold_mail' => 'Hold Mail',
'ui.admin.hub_nodes.compress_outbound' => 'Compress Outbound',
'ui.admin.hub_nodes.compress_outbound_help' => 'Pack bundled outbound echomail/netmail into a ZIP arcmail bundle instead of a raw packet. Only enable this if the downlink is another BinktermPHP instance or a mailer that auto-detects bundle extensions.',
'ui.admin.hub_nodes.allow_inbound_echomail' => 'Accept Echomail From This Subordinate',
'ui.admin.hub_nodes.allow_inbound_netmail' => 'Accept Netmail From This Subordinate',
'ui.admin.hub_nodes.max_packet_kb' => 'Max Packet Size (KB)',
'ui.admin.hub_nodes.max_packet_kb_help' => '0 = unlimited',
'ui.admin.hub_nodes.queue_retention_days' => 'Queue Retention (Days)',
'ui.admin.hub_nodes.notes' => 'Notes',
'ui.admin.hub_nodes.flags' => 'Flags',
'ui.admin.hub_nodes.queue' => 'Retention',
'ui.admin.hub_nodes.disabled' => 'Disabled',
'ui.admin.hub_nodes.days' => 'days',
'ui.admin.hub_nodes.delete_confirm' => 'Delete this downlink?',
'ui.admin.hub_nodes.load_failed' => 'Failed to load downlinks',
'ui.admin.hub_nodes.save_failed' => 'Failed to save downlink',
'ui.admin.hub_nodes.saved' => 'Downlink saved',
'ui.admin.hub_nodes.delete_failed' => 'Failed to delete downlink',
'ui.admin.hub_nodes.deleted' => 'Downlink deleted',
'ui.admin.hub_nodes.areas.title' => 'Area Subscriptions',
'ui.admin.hub_nodes.areas.none' => 'No echoareas found',
'ui.admin.hub_nodes.areas.load_failed' => 'Failed to load area subscriptions',
'ui.admin.hub_nodes.areas.save_failed' => 'Failed to save area subscriptions',
'ui.admin.hub_nodes.areas.saved' => 'Area subscriptions saved',
'ui.admin.hub_nodes.fileareas.title' => 'File Area Subscriptions',
'ui.admin.hub_nodes.fileareas.none' => 'No file areas found',
'ui.admin.hub_nodes.fileareas.load_failed' => 'Failed to load file area subscriptions',
'ui.admin.hub_nodes.fileareas.save_failed' => 'Failed to save file area subscriptions',
'ui.admin.hub_nodes.fileareas.saved' => 'File area subscriptions saved',
'ui.settings.tab.pgp' => 'PGP',
'ui.settings.pgp.heading' => 'PGP Keys',
'ui.settings.pgp.help' => 'Upload public keys, generate BBS-managed private keys, and choose which public key is your primary listing on the keyserver.',
Expand Down
10 changes: 10 additions & 0 deletions config/i18n/en/errors.php
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,8 @@
'errors.binkp.kept_packets.license_required' => 'Viewing packet files requires registration',
'errors.binkp.kept_packets.inspect_failed' => 'Failed to inspect packet',
'errors.binkp.queue.inspect_failed' => 'Failed to inspect queue packet',
'errors.binkp.hub_outbound.list_failed' => 'Failed to load downlink queue',
'errors.binkp.hub_outbound.invalid_id' => 'Invalid queue item id',
'errors.binkp.uplink.address_hostname_required' => 'Address and hostname are required',
'errors.binkp.uplink.address_required' => 'Uplink address is required',
'errors.messages.forward_email.email_required' => 'An email address is required',
Expand Down Expand Up @@ -747,6 +749,14 @@
'errors.admin.networks.change_domain_failed' => 'Failed to change domain',
'errors.admin.networks.delete_in_use' => 'Network is in use',
'errors.admin.networks.delete_failed' => 'Failed to delete network',
'errors.admin.hub_nodes.load_failed' => 'Failed to load downlinks',
'errors.admin.hub_nodes.save_failed' => 'Failed to save downlink',
'errors.admin.hub_nodes.delete_failed' => 'Failed to delete downlink',
'errors.admin.hub_nodes.areas_load_failed' => 'Failed to load area subscriptions',
'errors.admin.hub_nodes.areas_save_failed' => 'Failed to save area subscriptions',
'errors.admin.hub_nodes.fileareas_load_failed' => 'Failed to load file area subscriptions',
'errors.admin.hub_nodes.fileareas_save_failed' => 'Failed to save file area subscriptions',
'errors.admin.hub_nodes.next_point_failed' => 'Failed to determine next point number',
'errors.meshcore.invalid_node_id' => 'Node ID must be 12 or 64 lowercase hex characters.',
'errors.meshcore.contact_exists' => 'A contact with this node ID already exists.',
'errors.meshcore.not_found' => 'Contact not found.',
Expand Down
Loading
Loading