diff mod_admin_web2/admin_web2/www_files/js/main.js @ 6520:7eb114975cec

mod_admin_web2: Fork of admin_web for prosody 13.0. It is a fork because it changes access rights and might be insecure. Mark as alpha.
author Menel <menel@snikket.de>
date Fri, 24 Apr 2026 12:40:13 +0200
parents mod_admin_web/admin_web/www_files/js/main.js@1630c6ed3814
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_admin_web2/admin_web2/www_files/js/main.js	Fri Apr 24 12:40:13 2026 +0200
@@ -0,0 +1,255 @@
+var BOSH_SERVICE = '/http-bind/';
+var show_log = false;
+
+Strophe.addNamespace('C2SSTREAM', 'http://prosody.im/streams/c2s');
+Strophe.addNamespace('S2SSTREAM', 'http://prosody.im/streams/s2s');
+Strophe.addNamespace('ADMINSUB', 'http://prosody.im/adminsub');
+Strophe.addNamespace('CAPS', 'http://jabber.org/protocol/caps');
+
+var localJID = null;
+var connection   = null;
+
+var adminsubHost = null;
+var adhocControl = new Adhoc('#adhocDisplay', function() {});
+
+function log(msg) {
+    var entry = $('<div></div>').append(document.createTextNode(msg));
+    $('#log').append(entry);
+}
+
+function rawInput(data) {
+    log('RECV: ' + data);
+}
+
+function rawOutput(data) {
+    log('SENT: ' + data);
+}
+
+function _cbNewS2S(e) {
+    var items, item, entry, tmp, retract, id, jid, infos, info, metadata;
+    items = e.getElementsByTagName('item');
+    for (i = 0; i < items.length; i++) {
+        item = items[i];
+        id = item.attributes.getNamedItem('id').value;
+        jid = item.getElementsByTagName('session')[0].attributes.getNamedItem('jid').value;
+        infos = item.getElementsByTagName('info');
+
+        entry = $('<li id="' + id + '">' + jid + '</li>');
+        if (tmp = item.getElementsByTagName('encrypted')[0]) {
+            if (tmp.getElementsByTagName('valid')[0]) {
+                entry.append('<img src="images/secure.png" title="encrypted (certificate valid)" alt=" (secure) (encrypted)" />');
+            } else {
+                entry.append('<img src="images/encrypted.png" title="encrypted (certificate invalid)" alt=" (encrypted)" />');
+            }
+        }
+        if (item.getElementsByTagName('compressed')[0]) {
+            entry.append('<img src="images/compressed.png" title="compressed" alt=" (compressed)" />');
+        }
+        metadata = $('<ul/>').css('display', 'none');
+        entry.on('click', function() {
+            $(this).find("ul").slideToggle();
+        });
+        metadata.appendTo(entry);
+        for (j = 0; j < infos.length; j++) {
+            info = infos[j];
+            metadata.append('<li><b>' + info.attributes.getNamedItem('name').value + ':</b> ' + info.textContent + '</li>');
+        }
+        if (infos.length == 0)
+            metadata.append('<li>No information available</li>');
+
+        if (items[i].getElementsByTagName('out')[0]) {
+            entry.appendTo('#s2sout');
+        } else {
+            entry.appendTo('#s2sin');
+        }
+    }
+    retract = e.getElementsByTagName('retract')[0];
+    if (retract) {
+        id = retract.attributes.getNamedItem('id').value;
+        $('#' + id).remove();
+    }
+    return true;
+}
+
+function _cbNewC2S(e) {
+    var items, item, entry, retract, id, jid, infos, info, metadata;
+    items = e.getElementsByTagName('item');
+    for (i = 0; i < items.length; i++) {
+        item = items[i];
+        id = item.attributes.getNamedItem('id').value;
+        jid = item.getElementsByTagName('session')[0].attributes.getNamedItem('jid').value;
+        infos = item.getElementsByTagName('info');
+        entry = $('<li id="' + id + '">' + jid + '</li>');
+        if (item.getElementsByTagName('encrypted')[0]) {
+            entry.append('<img src="images/encrypted.png" title="encrypted" alt=" (encrypted)" />');
+        }
+        if (item.getElementsByTagName('compressed')[0]) {
+            entry.append('<img src="images/compressed.png" title="compressed" alt=" (compressed)" />');
+        }
+        metadata = $('<ul/>').css('display', 'none');
+        entry.on('click', function() {
+            $(this).find("ul").slideToggle();
+        });
+        metadata.appendTo(entry);
+        for (j = 0; j < infos.length; j++) {
+            info = infos[j];
+            metadata.append('<li><b>' + info.attributes.getNamedItem('name').value + ':</b> ' + info.textContent + '</li>');
+        }
+        if (infos.length == 0)
+            metadata.append('<li>No information available</li>');
+        entry.appendTo('#c2s');
+    }
+    retract = e.getElementsByTagName('retract')[0];
+    if (retract) {
+        id = retract.attributes.getNamedItem('id').value;
+        $('#' + id).remove();
+    }
+    return true;
+}
+
+function _cbAdminSub(e) {
+    var node = e.getElementsByTagName('items')[0].attributes.getNamedItem('node').value;
+    if (node == Strophe.NS.C2SSTREAM) {
+        _cbNewC2S(e);
+    } else if (node == Strophe.NS.S2SSTREAM) {
+        _cbNewS2S(e);
+    }
+
+    return true;
+}
+
+function onConnect(status) {
+    if (status == Strophe.Status.CONNECTING) {
+        log('Strophe is connecting.');
+    } else if (status == Strophe.Status.CONNFAIL) {
+        alert('Connection failed (Wrong host?)');
+        log('Strophe failed to connect.');
+        showConnect();
+    } else if (status == Strophe.Status.DISCONNECTING) {
+        log('Strophe is disconnecting.');
+    } else if (status == Strophe.Status.DISCONNECTED) {
+        log('Strophe is disconnected.');
+        showConnect();
+    } else if (status == Strophe.Status.AUTHFAIL) {
+        alert('Wrong username and/or password');
+        log('Authentication failed');
+        if (connection) {
+            connection.disconnect();
+        }
+    } else if (status == Strophe.Status.CONNECTED) {
+        log('Strophe is connected.');
+        connection.sendIQ($iq({to: connection.domain, type: 'get', id: connection.getUniqueId()}).c('adminsub', {xmlns: Strophe.NS.ADMINSUB})
+            .c('adminfor'), function(e) {
+                var items;
+                var domainpart = Strophe.getDomainFromJid(connection.jid);
+                items = e.getElementsByTagName('item');
+                if (items.length == 0) {
+                    alert("You are not an administrator");
+                    connection.disconnect();
+                    return false;
+                }
+                for (i = 0; i < items.length; i++) {
+                    var host = $(items[i]).text();
+                    $('<option/>').text(host).prop('selected', host == domainpart).appendTo('#host');
+                }
+                showDisconnect();
+                adminsubHost = $('#host').val();
+                adhocControl.checkFeatures(adminsubHost,
+                    function () { adhocControl.getCommandNodes(function (result) { $('#adhocDisplay').empty(); $('#adhocCommands').html(result); }) },
+                    function () { $('#adhocCommands').empty(); $('#adhocDisplay').html('<p>This host does not support commands</p>'); });
+                connection.addHandler(_cbAdminSub, Strophe.NS.ADMINSUB + '#event', 'message');
+                connection.send($iq({to: adminsubHost, type: 'set', id: connection.getUniqueId()}).c('adminsub', {xmlns: Strophe.NS.ADMINSUB})
+                    .c('subscribe', {node: Strophe.NS.C2SSTREAM}));
+                connection.send($iq({to: adminsubHost, type: 'set', id: connection.getUniqueId()}).c('adminsub', {xmlns: Strophe.NS.ADMINSUB})
+                    .c('subscribe', {node: Strophe.NS.S2SSTREAM}));
+                connection.sendIQ($iq({to: adminsubHost, type: 'get', id: connection.getUniqueId()}).c('adminsub', {xmlns: Strophe.NS.ADMINSUB})
+                    .c('items', {node: Strophe.NS.S2SSTREAM}), _cbNewS2S);
+                connection.sendIQ($iq({to: adminsubHost, type: 'get', id: connection.getUniqueId()}).c('adminsub', {xmlns: Strophe.NS.ADMINSUB})
+                    .c('items', {node: Strophe.NS.C2SSTREAM}), _cbNewC2S);
+        });
+    }
+}
+
+function showConnect() {
+    $('#login').show();
+    $('#menu').hide();
+    $('#main').hide();
+    $('#s2sin').empty();
+    $('#s2sout').empty();
+    $('#c2s').empty();
+    $('#host').empty();
+}
+
+function showDisconnect() {
+    $('#s2sList').hide();
+    $('#c2sList').hide();
+    $('#login').hide();
+
+    $('#menu').show();
+    $('#main').show();
+    $('#adhoc').show();
+}
+
+$(document).ready(function () {
+    connection = new Strophe.Connection(BOSH_SERVICE);
+    if (show_log) {
+        $('#log_container').show();
+        connection.rawInput = rawInput;
+        connection.rawOutput = rawOutput;
+    }
+
+    $("#log_toggle").click(function () {
+        $("#log").toggle();
+    });
+
+    $('#cred').on('submit', function (event) {
+        var button = $('#connect').get(0);
+        var jid = $('#jid');
+        var pass = $('#pass');
+        localJID = jid.get(0).value;
+
+        $('#log').empty();
+        connection.connect(localJID, pass.get(0).value, onConnect);
+        event.preventDefault();
+    });
+
+    $('#logout').click(function (event) {
+        connection.disconnect();
+        event.preventDefault();
+    });
+
+    $('#adhocMenu, #serverMenu, #clientMenu').click(function (event) {
+        event.preventDefault();
+        var tab = $(this).attr('href');
+        $('#main > div').hide();
+        $(tab).fadeIn('fast');
+    });
+
+    $('#host').on('change', function (event) {
+        connection.send($iq({to: adminsubHost, type: 'set', id: connection.getUniqueId()}).c('adminsub', {xmlns: Strophe.NS.ADMINSUB})
+            .c('unsubscribe', {node: Strophe.NS.C2SSTREAM}));
+        connection.send($iq({to: adminsubHost, type: 'set', id: connection.getUniqueId()}).c('adminsub', {xmlns: Strophe.NS.ADMINSUB})
+            .c('unsubscribe', {node: Strophe.NS.S2SSTREAM}));
+        adminsubHost = $(this).val();
+        adhocControl.checkFeatures(adminsubHost,
+            function () { adhocControl.getCommandNodes(function (result) { $('#adhocDisplay').empty(); $('#adhocCommands').html(result); }) },
+            function () { $('#adhocCommands').empty(); $('#adhocDisplay').html('<p>This host does not support commands</p>'); });
+        $('#s2sin').empty();
+        $('#s2sout').empty();
+        $('#c2s').empty();
+        connection.send($iq({to: adminsubHost, type: 'set', id: connection.getUniqueId()}).c('adminsub', {xmlns: Strophe.NS.ADMINSUB})
+            .c('subscribe', {node: Strophe.NS.C2SSTREAM}));
+        connection.send($iq({to: adminsubHost, type: 'set', id: connection.getUniqueId()}).c('adminsub', {xmlns: Strophe.NS.ADMINSUB})
+            .c('subscribe', {node: Strophe.NS.S2SSTREAM}));
+        connection.sendIQ($iq({to: adminsubHost, type: 'get', id: connection.getUniqueId()}).c('adminsub', {xmlns: Strophe.NS.ADMINSUB})
+            .c('items', {node: Strophe.NS.S2SSTREAM}), _cbNewS2S);
+        connection.sendIQ($iq({to: adminsubHost, type: 'get', id: connection.getUniqueId()}).c('adminsub', {xmlns: Strophe.NS.ADMINSUB})
+            .c('items', {node: Strophe.NS.C2SSTREAM}), _cbNewC2S);
+    });
+});
+
+window.onunload = window.onbeforeunload = function() {
+    if (connection) {
+        connection.disconnect();
+    }
+}