Rename display name: SvxPortal -> Reflector Dashboard (technical identifiers unchanged)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
SvxPortal auth drop-in
|
Reflector Dashboard auth drop-in
|
||||||
|
|
||||||
Endpoints:
|
Endpoints:
|
||||||
- /svxportal/auth/login.php (POST JSON {user, pass})
|
- /svxportal/auth/login.php (POST JSON {user, pass})
|
||||||
|
|||||||
+3
-3
@@ -1,6 +1,6 @@
|
|||||||
# SvxPortal — installation HOWTO
|
# Reflector Dashboard — installation HOWTO
|
||||||
|
|
||||||
SvxPortal is the web front-end for a SvxReflector: node map, monitor,
|
Reflector Dashboard is the web front-end for a SvxReflector: node map, monitor,
|
||||||
last-heard, talkgroup list, user accounts and reflector admin pages. It has
|
last-heard, talkgroup list, user accounts and reflector admin pages. It has
|
||||||
two parts, both in this repository:
|
two parts, both in this repository:
|
||||||
|
|
||||||
@@ -171,7 +171,7 @@ If you do not have one, add an SMTP relay instead and no MTA is needed:
|
|||||||
```php
|
```php
|
||||||
'mail' => [
|
'mail' => [
|
||||||
'from' => 'no-reply@example.com',
|
'from' => 'no-reply@example.com',
|
||||||
'from_name' => 'SvxPortal',
|
'from_name' => 'Reflector Dashboard',
|
||||||
'host' => 'smtp.example.com', // SSL SMTP (implicit TLS)
|
'host' => 'smtp.example.com', // SSL SMTP (implicit TLS)
|
||||||
'port' => 465,
|
'port' => 465,
|
||||||
'user' => 'smtp-user',
|
'user' => 'smtp-user',
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# SvxPortal web
|
# Reflector Dashboard web
|
||||||
|
|
||||||
Web front-end for a [SvxReflector](https://github.com/sm0svx/svxlink): live node
|
Web front-end for a [SvxReflector](https://github.com/sm0svx/svxlink): live node
|
||||||
list and map, monitor, last-heard, talkgroup list, user accounts with e-mail
|
list and map, monitor, last-heard, talkgroup list, user accounts with e-mail
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
@@ -18,7 +18,7 @@ $me = acct_get($uuid);
|
|||||||
$lvl = acct_admin_level($uuid);
|
$lvl = acct_admin_level($uuid);
|
||||||
if ($lvl < 2) { header('Location: /'); exit; }
|
if ($lvl < 2) { header('Location: /'); exit; }
|
||||||
|
|
||||||
$page_title = 'Admin · Accounts — SvxPortal';
|
$page_title = 'Admin · Accounts — Reflector Dashboard';
|
||||||
require __DIR__ . '/header.php';
|
require __DIR__ . '/header.php';
|
||||||
?>
|
?>
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
@@ -18,7 +18,7 @@ $me = acct_get($uuid);
|
|||||||
$lvl = acct_admin_level($uuid);
|
$lvl = acct_admin_level($uuid);
|
||||||
if ($lvl < 2) { header('Location: /'); exit; }
|
if ($lvl < 2) { header('Location: /'); exit; }
|
||||||
|
|
||||||
$page_title = 'Admin · Global Bans — SvxPortal';
|
$page_title = 'Admin · Global Bans — Reflector Dashboard';
|
||||||
require __DIR__ . '/header.php';
|
require __DIR__ . '/header.php';
|
||||||
?>
|
?>
|
||||||
<div class="container py-4" style="max-width:800px;">
|
<div class="container py-4" style="max-width:800px;">
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
@@ -18,7 +18,7 @@ $me = acct_get($uuid);
|
|||||||
$lvl = acct_admin_level($uuid);
|
$lvl = acct_admin_level($uuid);
|
||||||
if ($lvl < 2) { header('Location: /'); exit; }
|
if ($lvl < 2) { header('Location: /'); exit; }
|
||||||
|
|
||||||
$page_title = 'Admin · Certificates — SvxPortal';
|
$page_title = 'Admin · Certificates — Reflector Dashboard';
|
||||||
require __DIR__ . '/header.php';
|
require __DIR__ . '/header.php';
|
||||||
?>
|
?>
|
||||||
<div class="container py-4" style="max-width:900px;">
|
<div class="container py-4" style="max-width:900px;">
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
@@ -18,7 +18,7 @@ $me = acct_get($uuid);
|
|||||||
$lvl = acct_admin_level($uuid);
|
$lvl = acct_admin_level($uuid);
|
||||||
if ($lvl < 2) { header('Location: /'); exit; }
|
if ($lvl < 2) { header('Location: /'); exit; }
|
||||||
|
|
||||||
$page_title = 'Admin · Config — SvxPortal';
|
$page_title = 'Admin · Config — Reflector Dashboard';
|
||||||
require __DIR__ . '/header.php';
|
require __DIR__ . '/header.php';
|
||||||
?>
|
?>
|
||||||
<div class="container py-4" style="max-width:800px;">
|
<div class="container py-4" style="max-width:800px;">
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
@@ -18,7 +18,7 @@ $me = acct_get($uuid);
|
|||||||
$lvl = acct_admin_level($uuid);
|
$lvl = acct_admin_level($uuid);
|
||||||
if ($lvl < 2) { header('Location: /'); exit; }
|
if ($lvl < 2) { header('Location: /'); exit; }
|
||||||
|
|
||||||
$page_title = 'Admin · Control — SvxPortal';
|
$page_title = 'Admin · Control — Reflector Dashboard';
|
||||||
require __DIR__ . '/header.php';
|
require __DIR__ . '/header.php';
|
||||||
?>
|
?>
|
||||||
<div class="container py-4" style="max-width:800px;">
|
<div class="container py-4" style="max-width:800px;">
|
||||||
|
|||||||
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
@@ -17,7 +17,7 @@ if (!is_string($uuid) || $uuid === '') { header('Location: /'); exit; }
|
|||||||
$me = acct_get($uuid);
|
$me = acct_get($uuid);
|
||||||
if (acct_admin_level($uuid) < 2) { header('Location: /'); exit; }
|
if (acct_admin_level($uuid) < 2) { header('Location: /'); exit; }
|
||||||
|
|
||||||
$page_title = 'Admin · MQTT — SvxPortal';
|
$page_title = 'Admin · MQTT — Reflector Dashboard';
|
||||||
require __DIR__ . '/header.php';
|
require __DIR__ . '/header.php';
|
||||||
?>
|
?>
|
||||||
<div class="container py-4" style="max-width:640px;">
|
<div class="container py-4" style="max-width:640px;">
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
@@ -18,7 +18,7 @@ $me = acct_get($uuid);
|
|||||||
$lvl = acct_admin_level($uuid);
|
$lvl = acct_admin_level($uuid);
|
||||||
if ($lvl < 2) { header('Location: /'); exit; }
|
if ($lvl < 2) { header('Location: /'); exit; }
|
||||||
|
|
||||||
$page_title = 'Admin · Node Auth — SvxPortal';
|
$page_title = 'Admin · Node Auth — Reflector Dashboard';
|
||||||
require __DIR__ . '/header.php';
|
require __DIR__ . '/header.php';
|
||||||
?>
|
?>
|
||||||
<div class="container py-4" style="max-width:900px;">
|
<div class="container py-4" style="max-width:900px;">
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
@@ -19,7 +19,7 @@ if (!is_string($uuid) || $uuid === '') { header('Location: /'); exit; }
|
|||||||
// a read-only table.
|
// a read-only table.
|
||||||
$lvl = acct_admin_level($uuid);
|
$lvl = acct_admin_level($uuid);
|
||||||
|
|
||||||
$page_title = 'TG List — SvxPortal';
|
$page_title = 'TG List — Reflector Dashboard';
|
||||||
require __DIR__ . '/header.php';
|
require __DIR__ . '/header.php';
|
||||||
?>
|
?>
|
||||||
<div class="container py-4" style="max-width:1000px;">
|
<div class="container py-4" style="max-width:1000px;">
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
<!-- SvxPortal — Copyright (C) 2026 SA7AUX (Björn) — SPDX-License-Identifier: AGPL-3.0-or-later — see LICENSE -->
|
<!-- Reflector Dashboard — Copyright (C) 2026 SA7AUX (Björn) — SPDX-License-Identifier: AGPL-3.0-or-later — see LICENSE -->
|
||||||
</main>
|
</main>
|
||||||
<footer style="text-align:center; padding:16px; color:rgba(0,255,255,.4); font-size:.75rem; border-top:1px solid rgba(0,255,255,.15);">
|
<footer style="text-align:center; padding:16px; color:rgba(0,255,255,.4); font-size:.75rem; border-top:1px solid rgba(0,255,255,.15);">
|
||||||
© 2026 SA7AUX. All rights reserved.
|
© 2026 SA7AUX. All rights reserved.
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
@@ -53,13 +53,13 @@ $link = $base . '/auth/reset_password.php?tid=' . urlencode($tid) . '&token=' .
|
|||||||
|
|
||||||
$name = $acct['firstname'] ?? $callsign;
|
$name = $acct['firstname'] ?? $callsign;
|
||||||
$body = "Hello {$name},\n\n";
|
$body = "Hello {$name},\n\n";
|
||||||
$body .= "A password reset was requested for your SvxPortal account ({$callsign}).\n\n";
|
$body .= "A password reset was requested for your Reflector Dashboard account ({$callsign}).\n\n";
|
||||||
$body .= "Click the link below to set a new password:\n\n";
|
$body .= "Click the link below to set a new password:\n\n";
|
||||||
$body .= "{$link}\n\n";
|
$body .= "{$link}\n\n";
|
||||||
$body .= "This link is valid for 1 hour.\n\n";
|
$body .= "This link is valid for 1 hour.\n\n";
|
||||||
$body .= "If you did not request this, you can ignore this email.\n\n";
|
$body .= "If you did not request this, you can ignore this email.\n\n";
|
||||||
$body .= "73,\nSvxPortal";
|
$body .= "73,\nReflector Dashboard";
|
||||||
|
|
||||||
mail_send($email, "Password reset - SvxPortal", $body);
|
mail_send($email, "Password reset - Reflector Dashboard", $body);
|
||||||
|
|
||||||
json_out(['ok' => true, 'message' => 'If the account exists, a reset link has been sent.']);
|
json_out(['ok' => true, 'message' => 'If the account exists, a reset link has been sent.']);
|
||||||
|
|||||||
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
@@ -21,7 +21,7 @@ header('Cache-Control: no-store');
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||||
<title><?= $page_title ?? 'SvxPortal' ?></title>
|
<title><?= $page_title ?? 'Reflector Dashboard' ?></title>
|
||||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||||
<style>
|
<style>
|
||||||
:root{ color-scheme:dark; --bg:#000; --fg:#00ffff; --fg2:rgba(0,255,255,.75); --line:rgba(0,255,255,.35); }
|
:root{ color-scheme:dark; --bg:#000; --fg:#00ffff; --fg2:rgba(0,255,255,.75); --line:rgba(0,255,255,.35); }
|
||||||
|
|||||||
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
@@ -404,7 +404,7 @@ function mail_send(string $to, string $subject, string $body): bool {
|
|||||||
$user = $m['user'] ?? '';
|
$user = $m['user'] ?? '';
|
||||||
if ($host !== '' && $user !== '') {
|
if ($host !== '' && $user !== '') {
|
||||||
return smtp_send_ssl($host, (int)($m['port'] ?? 465), $user, (string)($m['pass'] ?? ''),
|
return smtp_send_ssl($host, (int)($m['port'] ?? 465), $user, (string)($m['pass'] ?? ''),
|
||||||
$from, (string)($m['from_name'] ?? 'SvxPortal'), $to, $subject, $body);
|
$from, (string)($m['from_name'] ?? 'Reflector Dashboard'), $to, $subject, $body);
|
||||||
}
|
}
|
||||||
$headers = "From: $from\r\nContent-Type: text/plain; charset=UTF-8\r\n";
|
$headers = "From: $from\r\nContent-Type: text/plain; charset=UTF-8\r\n";
|
||||||
return @mail($to, $subject, $body, $headers);
|
return @mail($to, $subject, $body, $headers);
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
@@ -114,7 +114,7 @@ do {
|
|||||||
$admin_nodes = array_values(array_unique($admin_nodes));
|
$admin_nodes = array_values(array_unique($admin_nodes));
|
||||||
sort($admin_nodes);
|
sort($admin_nodes);
|
||||||
|
|
||||||
$page_title = 'Profile — SvxPortal';
|
$page_title = 'Profile — Reflector Dashboard';
|
||||||
require __DIR__ . '/header.php';
|
require __DIR__ . '/header.php';
|
||||||
?>
|
?>
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
@@ -54,10 +54,10 @@ $link = $base . '/auth/verify.php?tid=' . urlencode($tid) . '&token=' . urlencod
|
|||||||
$first = (string)($me['firstname'] ?? '');
|
$first = (string)($me['firstname'] ?? '');
|
||||||
$call = (string)($me['callsign'] ?? '');
|
$call = (string)($me['callsign'] ?? '');
|
||||||
$body = "Hello {$first},\n\n";
|
$body = "Hello {$first},\n\n";
|
||||||
$body .= "Here is a new email verification link for your SvxPortal account ({$call}):\n\n";
|
$body .= "Here is a new email verification link for your Reflector Dashboard account ({$call}):\n\n";
|
||||||
$body .= "{$link}\n\n";
|
$body .= "{$link}\n\n";
|
||||||
$body .= "This link is valid for 24 hours.\n\n";
|
$body .= "This link is valid for 24 hours.\n\n";
|
||||||
$body .= "73,\nSvxPortal";
|
$body .= "73,\nReflector Dashboard";
|
||||||
$sent = mail_send($email, "Verify your email - SvxPortal", $body);
|
$sent = mail_send($email, "Verify your email - Reflector Dashboard", $body);
|
||||||
|
|
||||||
json_out(['ok' => true, 'email_sent' => $sent]);
|
json_out(['ok' => true, 'email_sent' => $sent]);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
@@ -49,7 +49,7 @@ function he(string $s): string { return htmlspecialchars($s, ENT_QUOTES, 'UTF-8'
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||||
<title>Reset Password — SvxPortal</title>
|
<title>Reset Password — Reflector Dashboard</title>
|
||||||
<style>
|
<style>
|
||||||
:root{ color-scheme:dark; --bg:#000; --fg:#00ffff; --fg2:rgba(0,255,255,.75); --line:rgba(0,255,255,.35); }
|
:root{ color-scheme:dark; --bg:#000; --fg:#00ffff; --fg2:rgba(0,255,255,.75); --line:rgba(0,255,255,.35); }
|
||||||
html, body{ height:100%; background:var(--bg); color:var(--fg); margin:0; font-family:system-ui,sans-serif; }
|
html, body{ height:100%; background:var(--bg); color:var(--fg); margin:0; font-family:system-ui,sans-serif; }
|
||||||
@@ -69,10 +69,10 @@ function he(string $s): string { return htmlspecialchars($s, ENT_QUOTES, 'UTF-8'
|
|||||||
<h3 style="margin-top:0;">Reset Password</h3>
|
<h3 style="margin-top:0;">Reset Password</h3>
|
||||||
<?php if ($done): ?>
|
<?php if ($done): ?>
|
||||||
<div class="ok">Password changed successfully!</div>
|
<div class="ok">Password changed successfully!</div>
|
||||||
<p><a href="/">Back to SvxPortal</a></p>
|
<p><a href="/">Back to Reflector Dashboard</a></p>
|
||||||
<?php elseif ($error && ($_SERVER['REQUEST_METHOD'] !== 'POST' || $tid === '' || $token === '')): ?>
|
<?php elseif ($error && ($_SERVER['REQUEST_METHOD'] !== 'POST' || $tid === '' || $token === '')): ?>
|
||||||
<div class="err"><?=he($error)?></div>
|
<div class="err"><?=he($error)?></div>
|
||||||
<p><a href="/">Back to SvxPortal</a></p>
|
<p><a href="/">Back to Reflector Dashboard</a></p>
|
||||||
<?php else: ?>
|
<?php else: ?>
|
||||||
<?php if ($error): ?><div class="err"><?=he($error)?></div><?php endif; ?>
|
<?php if ($error): ?><div class="err"><?=he($error)?></div><?php endif; ?>
|
||||||
<form method="post">
|
<form method="post">
|
||||||
|
|||||||
+4
-4
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
@@ -99,12 +99,12 @@ $r->expire($k, 60 * 60 * 24);
|
|||||||
$base = rtrim(cfg()['base_url'], '/');
|
$base = rtrim(cfg()['base_url'], '/');
|
||||||
$link = $base . '/auth/verify.php?tid=' . urlencode($tid) . '&token=' . urlencode($secret);
|
$link = $base . '/auth/verify.php?tid=' . urlencode($tid) . '&token=' . urlencode($secret);
|
||||||
$body = "Hello {$firstname},\n\n";
|
$body = "Hello {$firstname},\n\n";
|
||||||
$body .= "Thank you for registering on SvxPortal with callsign {$callsign}.\n\n";
|
$body .= "Thank you for registering on Reflector Dashboard with callsign {$callsign}.\n\n";
|
||||||
$body .= "Please verify your email address by clicking the link below:\n\n";
|
$body .= "Please verify your email address by clicking the link below:\n\n";
|
||||||
$body .= "{$link}\n\n";
|
$body .= "{$link}\n\n";
|
||||||
$body .= "This link is valid for 24 hours.\n\n";
|
$body .= "This link is valid for 24 hours.\n\n";
|
||||||
$body .= "After email verification, an administrator will review and activate your account.\n\n";
|
$body .= "After email verification, an administrator will review and activate your account.\n\n";
|
||||||
$body .= "73,\nSvxPortal";
|
$body .= "73,\nReflector Dashboard";
|
||||||
$mail_sent = mail_send($email, "Verify your email - SvxPortal", $body);
|
$mail_sent = mail_send($email, "Verify your email - Reflector Dashboard", $body);
|
||||||
|
|
||||||
json_out(['ok' => true, 'callsign' => $callsign, 'email_sent' => $mail_sent]);
|
json_out(['ok' => true, 'callsign' => $callsign, 'email_sent' => $mail_sent]);
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
@@ -19,7 +19,7 @@ $lvl = acct_admin_level($uuid);
|
|||||||
// who are NOT admins use the separate self-service page (admin_tglist.php).
|
// who are NOT admins use the separate self-service page (admin_tglist.php).
|
||||||
if ($lvl < 2) { header('Location: /'); exit; }
|
if ($lvl < 2) { header('Location: /'); exit; }
|
||||||
|
|
||||||
$page_title = 'Admin · TG List — SvxPortal';
|
$page_title = 'Admin · TG List — Reflector Dashboard';
|
||||||
require __DIR__ . '/header.php';
|
require __DIR__ . '/header.php';
|
||||||
?>
|
?>
|
||||||
<div class="container py-4" style="max-width:1000px;">
|
<div class="container py-4" style="max-width:1000px;">
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
@@ -15,7 +15,7 @@ start_session();
|
|||||||
$uuid = $_SESSION['uid'] ?? null;
|
$uuid = $_SESSION['uid'] ?? null;
|
||||||
if (!is_string($uuid) || $uuid === '') { header('Location: /'); exit; }
|
if (!is_string($uuid) || $uuid === '') { header('Location: /'); exit; }
|
||||||
|
|
||||||
$page_title = 'Request a TG — SvxPortal';
|
$page_title = 'Request a TG — Reflector Dashboard';
|
||||||
require __DIR__ . '/header.php';
|
require __DIR__ . '/header.php';
|
||||||
?>
|
?>
|
||||||
<div class="container py-4" style="max-width:640px;">
|
<div class="container py-4" style="max-width:640px;">
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
|
|||||||
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
@@ -47,5 +47,5 @@ header('Content-Type: text/html; charset=utf-8');
|
|||||||
echo "<!doctype html><meta charset='utf-8'><title>Verified</title><body style='font-family:system-ui;background:#000;color:#0ff;padding:20px;'>
|
echo "<!doctype html><meta charset='utf-8'><title>Verified</title><body style='font-family:system-ui;background:#000;color:#0ff;padding:20px;'>
|
||||||
<h2>OK</h2>
|
<h2>OK</h2>
|
||||||
<div>Your e-mail is verified. Your account is now registered and waiting for an admin to approve it — once that is done you can sign in.</div>
|
<div>Your e-mail is verified. Your account is now registered and waiting for an admin to approve it — once that is done you can sign in.</div>
|
||||||
<div style='margin-top:12px;'><a href='/svxportal/' style='color:#0ff;'>Back to SvxPortal</a></div>
|
<div style='margin-top:12px;'><a href='/svxportal/' style='color:#0ff;'>Back to Reflector Dashboard</a></div>
|
||||||
</body>";
|
</body>";
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
+1
-1
@@ -417,7 +417,7 @@
|
|||||||
"repo": "web",
|
"repo": "web",
|
||||||
"hash": "a703cfb",
|
"hash": "a703cfb",
|
||||||
"type": "feature",
|
"type": "feature",
|
||||||
"summary": "SvxPortal remembers the last view across reloads (Ctrl+Shift+R lands where you were), and TG Monitor gets a search box — type a TG number to see who is on it, or a callsign/node to see which talkgroups it is on"
|
"summary": "Reflector Dashboard remembers the last view across reloads (Ctrl+Shift+R lands where you were), and TG Monitor gets a search box — type a TG number to see who is on it, or a callsign/node to see which talkgroups it is on"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"date": "2026-07-28",
|
"date": "2026-07-28",
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
<!doctype html>
|
<!doctype html>
|
||||||
<!-- SvxPortal — Copyright (C) 2026 SA7AUX (Björn) — SPDX-License-Identifier: AGPL-3.0-or-later — see LICENSE -->
|
<!-- Reflector Dashboard — Copyright (C) 2026 SA7AUX (Björn) — SPDX-License-Identifier: AGPL-3.0-or-later — see LICENSE -->
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||||
<title>Help & Guides — SvxPortal | SvxLink nodes, reflector, build from source</title>
|
<title>Help & Guides — Reflector Dashboard | SvxLink nodes, reflector, build from source</title>
|
||||||
<meta name="description" content="SvxPortal help & guides: register your SvxLink node, certificates, talkgroups and trunks — plus how to compile SvxLink from source on Debian, Ubuntu and Raspberry Pi, and how to find the right deb packages.">
|
<meta name="description" content="Reflector Dashboard help & guides: register your SvxLink node, certificates, talkgroups and trunks — plus how to compile SvxLink from source on Debian, Ubuntu and Raspberry Pi, and how to find the right deb packages.">
|
||||||
<link rel="canonical" href="https://svxportal.sa7aux.se/help.html">
|
<link rel="canonical" href="https://svxportal.sa7aux.se/help.html">
|
||||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||||
<style>
|
<style>
|
||||||
@@ -55,7 +55,7 @@
|
|||||||
<body>
|
<body>
|
||||||
<nav class="navbar navbar-dark">
|
<nav class="navbar navbar-dark">
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<a class="navbar-brand" href="/">SvxPortal</a>
|
<a class="navbar-brand" href="/">Reflector Dashboard</a>
|
||||||
<span class="navbar-text small me-auto ms-3">Help</span>
|
<span class="navbar-text small me-auto ms-3">Help</span>
|
||||||
<a href="/" class="btn btn-sm btn-outline-secondary" onclick="if(history.length>1){history.back();return false;}">Back</a>
|
<a href="/" class="btn btn-sm btn-outline-secondary" onclick="if(history.length>1){history.back();return false;}">Back</a>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
+5
-5
@@ -1,5 +1,5 @@
|
|||||||
<!doctype html>
|
<!doctype html>
|
||||||
<!-- SvxPortal — Copyright (C) 2026 SA7AUX (Björn) — SPDX-License-Identifier: AGPL-3.0-or-later — see LICENSE -->
|
<!-- Reflector Dashboard — Copyright (C) 2026 SA7AUX (Björn) — SPDX-License-Identifier: AGPL-3.0-or-later — see LICENSE -->
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
@@ -8,18 +8,18 @@
|
|||||||
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
|
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
|
||||||
<meta http-equiv="Pragma" content="no-cache" />
|
<meta http-equiv="Pragma" content="no-cache" />
|
||||||
<meta http-equiv="Expires" content="0" />
|
<meta http-equiv="Expires" content="0" />
|
||||||
<title>SvxPortal — SvxLink Reflector | Nodes, Lastheard, CTCSS & Map</title>
|
<title>Reflector Dashboard — SvxLink Reflector | Nodes, Lastheard, CTCSS & Map</title>
|
||||||
<meta name="description" content="SvxPortal — live dashboard for the SA7AUX SvxLink reflector: connected nodes, reflector clients, talkgroup monitor, lastheard, CTCSS tone table and node map for amateur radio / ham radio." />
|
<meta name="description" content="Reflector Dashboard — live dashboard for the SA7AUX SvxLink reflector: connected nodes, reflector clients, talkgroup monitor, lastheard, CTCSS tone table and node map for amateur radio / ham radio." />
|
||||||
<link rel="canonical" href="https://svxportal.sa7aux.se/" />
|
<link rel="canonical" href="https://svxportal.sa7aux.se/" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="https://svxportal.sa7aux.se/" />
|
<meta property="og:url" content="https://svxportal.sa7aux.se/" />
|
||||||
<meta property="og:title" content="SvxPortal — SvxLink Reflector" />
|
<meta property="og:title" content="Reflector Dashboard — SvxLink Reflector" />
|
||||||
<meta property="og:description" content="Live nodes, lastheard, talkgroup monitor, CTCSS table and map for the SA7AUX SvxLink reflector." />
|
<meta property="og:description" content="Live nodes, lastheard, talkgroup monitor, CTCSS table and map for the SA7AUX SvxLink reflector." />
|
||||||
<script type="application/ld+json">
|
<script type="application/ld+json">
|
||||||
{
|
{
|
||||||
"@context": "https://schema.org",
|
"@context": "https://schema.org",
|
||||||
"@type": "WebSite",
|
"@type": "WebSite",
|
||||||
"name": "SvxPortal",
|
"name": "Reflector Dashboard",
|
||||||
"url": "https://svxportal.sa7aux.se/",
|
"url": "https://svxportal.sa7aux.se/",
|
||||||
"description": "Live dashboard for the SA7AUX SvxLink amateur radio reflector",
|
"description": "Live dashboard for the SA7AUX SvxLink amateur radio reflector",
|
||||||
"publisher": { "@type": "Organization", "name": "SA7AUX", "url": "https://sa7aux.se/" }
|
"publisher": { "@type": "Organization", "name": "SA7AUX", "url": "https://sa7aux.se/" }
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# SvxPortal web — nginx server block.
|
# Reflector Dashboard web — nginx server block.
|
||||||
# Install: sudo cp install/nginx-svxportal.conf /etc/nginx/sites-available/svxportal
|
# Install: sudo cp install/nginx-svxportal.conf /etc/nginx/sites-available/svxportal
|
||||||
# sudo ln -s /etc/nginx/sites-available/svxportal /etc/nginx/sites-enabled/
|
# sudo ln -s /etc/nginx/sites-available/svxportal /etc/nginx/sites-enabled/
|
||||||
# sudo nginx -t && sudo systemctl reload nginx
|
# sudo nginx -t && sudo systemctl reload nginx
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Dedicated Redis instance for SvxPortal (unix socket only, no TCP port).
|
# Dedicated Redis instance for Reflector Dashboard (unix socket only, no TCP port).
|
||||||
# Install: sudo cp install/redis-svxportal.conf /etc/redis/redis-svxportal.conf
|
# Install: sudo cp install/redis-svxportal.conf /etc/redis/redis-svxportal.conf
|
||||||
# sudo mkdir -p /var/lib/redis-svxportal && sudo chown redis:redis /var/lib/redis-svxportal
|
# sudo mkdir -p /var/lib/redis-svxportal && sudo chown redis:redis /var/lib/redis-svxportal
|
||||||
# sudo systemctl enable --now redis-server@svxportal
|
# sudo systemctl enable --now redis-server@svxportal
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Example svxreflector.conf as used together with SvxPortal (layout of a live reflector).
|
# Example svxreflector.conf as used together with Reflector Dashboard (layout of a live reflector).
|
||||||
# All secrets are CHANGEME, hostnames are my.domain.com / peer.domain.com. Adjust to your site.
|
# All secrets are CHANGEME, hostnames are my.domain.com / peer.domain.com. Adjust to your site.
|
||||||
# The web admin pages read this file to find CERT_PKI_DIR and to manage [USERS]/[PASSWORDS].
|
# The web admin pages read this file to find CERT_PKI_DIR and to manage [USERS]/[PASSWORDS].
|
||||||
#
|
#
|
||||||
@@ -68,7 +68,7 @@ SUBJECT_ALT_NAME=DNS:my.domain.com,IP:192.0.2.1
|
|||||||
EMAIL_ADDRESS=admin@my.domain.com
|
EMAIL_ADDRESS=admin@my.domain.com
|
||||||
|
|
||||||
# [USERS] maps a node callsign to a password-group name; [PASSWORDS] holds the
|
# [USERS] maps a node callsign to a password-group name; [PASSWORDS] holds the
|
||||||
# group's secret. SvxPortal's "svxreflector-users" helper adds entries of the
|
# group's secret. Reflector Dashboard's "svxreflector-users" helper adds entries of the
|
||||||
# form CALL=CALL here (one group per node). Several nodes may share one group.
|
# form CALL=CALL here (one group per node). Several nodes may share one group.
|
||||||
[USERS]
|
[USERS]
|
||||||
MYCALL-AC=MYCALL-AC
|
MYCALL-AC=MYCALL-AC
|
||||||
@@ -114,7 +114,7 @@ SECRET_dmr=CHANGEME
|
|||||||
SECRET_pbx=CHANGEME
|
SECRET_pbx=CHANGEME
|
||||||
|
|
||||||
###################################################################
|
###################################################################
|
||||||
# MQTT status publishing (used by the node control pages in SvxPortal).
|
# MQTT status publishing (used by the node control pages in Reflector Dashboard).
|
||||||
[MQTT]
|
[MQTT]
|
||||||
HOST=127.0.0.1
|
HOST=127.0.0.1
|
||||||
PORT=1883
|
PORT=1883
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# svxdr — live-data daemon for SvxPortal. Install:
|
# svxdr — live-data daemon for Reflector Dashboard. Install:
|
||||||
# sudo cp install/systemd/svxdr.service /etc/systemd/system/ && sudo systemctl daemon-reload && sudo systemctl enable --now svxdr
|
# sudo cp install/systemd/svxdr.service /etc/systemd/system/ && sudo systemctl daemon-reload && sudo systemctl enable --now svxdr
|
||||||
# Build and configure per INSTALL.md section 9.
|
# Build and configure per INSTALL.md section 9.
|
||||||
[Unit]
|
[Unit]
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env php
|
#!/usr/bin/env php
|
||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* svx-mkadmin.php — interaktiv provisionering av ett SvxPortal-konto (t.ex. admin).
|
* svx-mkadmin.php — interaktiv provisionering av ett Reflector Dashboard-konto (t.ex. admin).
|
||||||
*
|
*
|
||||||
* Återanvänder portalens EGEN auth/lib.php, så redis-anslutning (socket/lösen/db),
|
* Återanvänder portalens EGEN auth/lib.php, så redis-anslutning (socket/lösen/db),
|
||||||
* nyckelprefix, uuid-generering, callsign-normalisering och lösenordshashning
|
* nyckelprefix, uuid-generering, callsign-normalisering och lösenordshashning
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// svxdr — live-data daemon for SvxPortal (nodelist + proxy + astmeta + xlink)
|
// svxdr — live-data daemon for Reflector Dashboard (nodelist + proxy + astmeta + xlink)
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// svxdr — live-data daemon for SvxPortal (nodelist + proxy + astmeta + xlink)
|
// svxdr — live-data daemon for Reflector Dashboard (nodelist + proxy + astmeta + xlink)
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// svxdr — live-data daemon for SvxPortal (nodelist + proxy + astmeta + xlink)
|
// svxdr — live-data daemon for Reflector Dashboard (nodelist + proxy + astmeta + xlink)
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// svxdr — live-data daemon for SvxPortal (nodelist + proxy + astmeta + xlink)
|
// svxdr — live-data daemon for Reflector Dashboard (nodelist + proxy + astmeta + xlink)
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// svxdr — live-data daemon for SvxPortal (nodelist + proxy + astmeta + xlink)
|
// svxdr — live-data daemon for Reflector Dashboard (nodelist + proxy + astmeta + xlink)
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// svxdr — live-data daemon for SvxPortal (nodelist + proxy + astmeta + xlink)
|
// svxdr — live-data daemon for Reflector Dashboard (nodelist + proxy + astmeta + xlink)
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// svxdr — live-data daemon for SvxPortal (nodelist + proxy + astmeta + xlink)
|
// svxdr — live-data daemon for Reflector Dashboard (nodelist + proxy + astmeta + xlink)
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// svxdr — live-data daemon for SvxPortal (nodelist + proxy + astmeta + xlink)
|
// svxdr — live-data daemon for Reflector Dashboard (nodelist + proxy + astmeta + xlink)
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// svxdr — live-data daemon for SvxPortal (nodelist + proxy + astmeta + xlink)
|
// svxdr — live-data daemon for Reflector Dashboard (nodelist + proxy + astmeta + xlink)
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// svxdr — live-data daemon for SvxPortal (nodelist + proxy + astmeta + xlink)
|
// svxdr — live-data daemon for Reflector Dashboard (nodelist + proxy + astmeta + xlink)
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// svxdr — live-data daemon for SvxPortal (nodelist + proxy + astmeta + xlink)
|
// svxdr — live-data daemon for Reflector Dashboard (nodelist + proxy + astmeta + xlink)
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* SvxPortal — web front-end for SvxReflector
|
* Reflector Dashboard — web front-end for SvxReflector
|
||||||
* Copyright (C) 2026 SA7AUX (Björn)
|
* Copyright (C) 2026 SA7AUX (Björn)
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*
|
*
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// SvxPortal — web front-end for SvxReflector
|
// Reflector Dashboard — web front-end for SvxReflector
|
||||||
// Copyright (C) 2026 SA7AUX (Björn)
|
// Copyright (C) 2026 SA7AUX (Björn)
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
//
|
//
|
||||||
|
|||||||
Reference in New Issue
Block a user