Commit aa4e3251 authored by jan.koester's avatar jan.koester
Browse files

test

parent 41830b11
Loading
Loading
Loading
Loading
Loading
+2 −0
Changes for data/admin.html: 2 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -72,6 +72,7 @@
                <li id="nav-wingpo" style="display:none"><a href="#" onclick="loadWinGpos(); return false;">Windows GPOs</a></li>
                <li id="nav-winscripts" style="display:none"><a href="#" onclick="loadWinScripts(); return false;">Windows-Skripte</a></li>
                <li id="nav-oauth" style="display:none"><a href="#" onclick="loadOAuthClients(); return false;">OAuth-Clients</a></li>
                <li id="nav-radius" style="display:none"><a href="#" onclick="loadRadiusClients(); return false;">RADIUS-Clients</a></li>
                <li id="nav-dns" style="display:none"><a href="#" onclick="loadDns(); return false;">DNS</a></li>
                <li id="nav-sessions"><a href="#" onclick="loadSessions(); return false;">Sessions</a></li>
                <li id="nav-server" style="display:none"><a href="#" onclick="loadServerConfig(); return false;">Server</a></li>
@@ -1530,6 +1531,7 @@ window.onload = function() {
            document.getElementById('nav-wingpo').style.display = '';
            document.getElementById('nav-winscripts').style.display = '';
            document.getElementById('nav-oauth').style.display = '';
            document.getElementById('nav-radius').style.display = '';
        }
        if (data.superadmin || gpo[GPO_EXPORT_IMPORT])
            document.getElementById('nav-export').style.display = '';
+82 −0
Changes for data/dirviews.js: 82 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -573,3 +573,85 @@ function deleteOAuthClient(i) {
    if (!confirm('Client "' + c.name + '" löschen? Ausgestellte Refresh-Tokens werden damit unbrauchbar.')) return;
    dirPost("oauthdelete", c.id, {}, function() { loadOAuthClients(); });
}

/* ================= RADIUS clients (switches, access points, VPN) ================= */
var g_radiusClients = [];
var RADIUS_GROUPATTR = [['none', 'keine'], ['filter-id', 'Filter-Id (eine je Gruppe)'], ['class', 'Class (eine je Gruppe)']];

function loadRadiusClients() {
    currentView = loadRadiusClients;
    setActiveNav('nav-radius');
    loadDomainSelector(function() {
        if (needRealDomain('RADIUS-Clients')) return;
        ajaxGet(dirApi("radiuslist"), function(err, data) {
            if (err) { showError(dirErr(err)); return; }
            g_radiusClients = data.clients || [];
            var h = '<h3>RADIUS</h3>';
            h += '<p class="hint">Switches, WLAN-Access-Points (WPA-Enterprise / 802.1X), VPN-Gateways und Captive Portals melden Benutzer per RADIUS an (UDP 1812, Accounting 1813). Verfahren: PAP, MS-CHAPv2, EAP-PEAP (MSCHAPv2), EAP-TTLS (PAP/MSCHAPv2).</p>';
            h += '<table class="admin-table userlist"><tr><th>Name</th><th>Adresse</th><th>Gruppen</th><th>VLANs</th><th>Gruppen-Attribut</th><th>Actions</th></tr>';
            for (var i = 0; i < g_radiusClients.length; i++) {
                var c = g_radiusClients[i];
                h += '<tr><td>' + escapeHtml(c.name) + '</td><td><code>' + escapeHtml(c.address) + '</code></td>';
                h += '<td>' + (c.groups.length ? escapeHtml(c.groups.join(', ')) : '<em>alle</em>') + '</td>';
                h += '<td>' + escapeHtml(c.vlans.trim().split('\n').filter(function(x) { return x; }).join(', ')) + '</td>';
                h += '<td>' + escapeHtml(c.group_attr) + '</td><td><ul>';
                h += '<li><a class="button" href="#" onclick="editRadiusClient(' + i + '); return false;">Bearbeiten</a></li>';
                h += '<li><a class="button" href="#" onclick="newRadiusSecret(' + i + '); return false;">Neues Secret</a></li>';
                h += '<li><a class="button danger" href="#" onclick="deleteRadiusClient(' + i + '); return false;">Delete</a></li>';
                h += '</ul></td></tr>';
            }
            if (!g_radiusClients.length) h += '<tr><td colspan="6"><em>keine Clients</em></td></tr>';
            h += '</table><p><a class="button" href="#" onclick="editRadiusClient(-1); return false;">Neuer Client</a></p>';
            setContent(h);
        });
    }, true);
}

function editRadiusClient(i) {
    var c = i >= 0 ? g_radiusClients[i] : {name: '', address: '', groups: [], vlans: '', group_attr: 'none', require_ma: true};
    var h = '<h3>' + (i >= 0 ? escapeHtml(c.name) : 'Neuer RADIUS-Client') + '</h3>';
    h += '<p><a href="#" onclick="loadRadiusClients(); return false;">&larr; alle Clients</a></p>';
    h += '<form id="radiusform" class="admin-form" onsubmit="saveRadiusClient(' + i + '); return false;"><table>';
    h += '<tr><td><label>Name</label></td><td><input name="name" size="40" value="' + escapeHtml(c.name) + '" required></td></tr>';
    h += '<tr><td><label>Adresse</label></td><td><input name="address" size="30" value="' + escapeHtml(c.address) + '" placeholder="10.0.0.5 oder 10.0.0.0/24" required><br><span class="hint">IPv4-Adresse oder Netz (CIDR), von dem die Anfragen kommen</span></td></tr>';
    h += '<tr><td><label>Shared Secret</label></td><td><input name="secret" type="password" size="40" autocomplete="new-password"><br><span class="hint">' + (i >= 0 ? 'leer = unverändert' : 'leer = zufällig erzeugen (wird einmal angezeigt)') + '</span></td></tr>';
    h += '<tr><td><label>Erlaubte Gruppen</label></td><td><input name="groups" size="40" value="' + escapeHtml(c.groups.join(', ')) + '"><br><span class="hint">kommagetrennt; leer = alle Benutzer der Domäne</span></td></tr>';
    h += '<tr><td><label>VLAN je Gruppe</label></td><td><textarea name="vlans" rows="3" cols="40" placeholder="Mitarbeiter=20&#10;Gaeste=30">' + escapeHtml(c.vlans) + '</textarea><br><span class="hint">Gruppe=VLAN, eine pro Zeile; die erste passende gilt (Tunnel-Private-Group-ID)</span></td></tr>';
    h += '<tr><td><label>Gruppen senden als</label></td><td><select name="group_attr">';
    RADIUS_GROUPATTR.forEach(function(g) { h += '<option value="' + g[0] + '"' + (c.group_attr === g[0] ? ' selected' : '') + '>' + escapeHtml(g[1]) + '</option>'; });
    h += '</select></td></tr>';
    h += '<tr><td><label>Message-Authenticator</label></td><td><label><input type="checkbox" name="require_ma"' + (c.require_ma ? ' checked' : '') + '> verlangen (Schutz gegen BlastRADIUS; nur für sehr alte Geräte abschalten)</label></td></tr>';
    h += '<tr><td></td><td><input type="submit" class="button" value="Speichern"></td></tr></table></form>';
    setContent(h);
}

function saveRadiusClient(i) {
    var f = document.getElementById('radiusform');
    var fields = {name: f.name.value, address: f.address.value, secret: f.secret.value, groups: f.groups.value,
                  vlans: f.vlans.value, group_attr: f.group_attr.value, require_ma: f.require_ma.checked ? 'true' : 'false'};
    var action = i >= 0 ? "radiusupdate" : "radiuscreate";
    dirPost(action, i >= 0 ? g_radiusClients[i].id : "", fields, function(data) {
        if (data.secret) showRadiusSecret(f.name.value, data.secret);
        else loadRadiusClients();
    });
}

function showRadiusSecret(name, secret) {
    var h = '<h3>Shared Secret für ' + escapeHtml(name) + '</h3>';
    h += '<p><code style="user-select:all">' + escapeHtml(secret) + '</code></p>';
    h += '<p class="hint">Im Gerät (Switch, Access Point, VPN) als RADIUS-Secret eintragen.</p>';
    h += '<p><a class="button" href="#" onclick="loadRadiusClients(); return false;">Fertig</a></p>';
    setContent(h);
}

function newRadiusSecret(i) {
    var c = g_radiusClients[i];
    if (!confirm('Neues Shared Secret für "' + c.name + '"? Das alte wird sofort ungültig.')) return;
    dirPost("radiussecret", c.id, {}, function(data) { showRadiusSecret(c.name, data.secret); });
}

function deleteRadiusClient(i) {
    var c = g_radiusClients[i];
    if (!confirm('RADIUS-Client "' + c.name + '" löschen?')) return;
    dirPost("radiusdelete", c.id, {}, function() { loadRadiusClients(); });
}