Merge pull request #4507 from Ansuel/wifiblacklist
authorJo-Philipp Wich <jo@mein.io>
Sat, 31 Oct 2020 21:03:53 +0000 (22:03 +0100)
committerGitHub <noreply@github.com>
Sat, 31 Oct 2020 21:03:53 +0000 (22:03 +0100)
luci-mod-status: add support for add device to wifi black/whitelist

modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js
themes/luci-theme-material/htdocs/luci-static/material/cascade.css

index 928b5959ba6054a65bc1ac843ceafd2929e349e3..1019365836d29f9a8da8280bac6f59bf7da51b57 100644 (file)
@@ -40,12 +40,28 @@ return baseclass.extend({
                return s;
        },
 
-       handleDelClient: function(wifinet, mac, ev) {
+       handleDelClient: function(wifinet, mac, ev, cmd) {
+               var exec = cmd || 'disconnect';
+
                dom.parent(ev.currentTarget, '.tr').style.opacity = 0.5;
                ev.currentTarget.classList.add('spinning');
                ev.currentTarget.disabled = true;
                ev.currentTarget.blur();
 
+               if (exec == 'addlist') {
+                       var macs = [ mac ]
+
+                       for (var mac in this.iface_maclist) {
+                               macs.push(mac)
+                       }
+
+                       uci.set('wireless', wifinet.sid, 'maclist', macs);
+
+                       return uci.save()
+                               .then(L.bind(L.ui.changes.init, L.ui.changes))
+                               .then(L.bind(L.ui.changes.displayChanges, L.ui.changes));
+               }
+
                wifinet.disconnectClient(mac, true, 5, 60000);
        },
 
@@ -188,6 +204,8 @@ return baseclass.extend({
                }, this));
        },
 
+       isDeviceAdded: {},
+
        render: function(data) {
                var seen = {},
                    radios = data[0],
@@ -218,6 +236,17 @@ return baseclass.extend({
                var rows = [];
 
                for (var i = 0; i < networks.length; i++) {
+                       var macfilter = uci.get('wireless', networks[i].sid, 'macfilter');
+
+                       if (macfilter != null && macfilter != 'disable') {
+                               this.isDeviceAdded = {};
+                               var macs = L.toArray(uci.get('wireless', networks[i].sid, 'maclist'));
+                               for (var j = 0; j < macs.length; j++) {
+                                       var mac = macs[j].toUpperCase();
+                                       this.isDeviceAdded[mac] = true;
+                               }
+                       }
+
                        for (var k = 0; k < networks[i].assoclist.length; k++) {
                                var bss = networks[i].assoclist[k],
                                    name = hosthints.getHostnameByMACAddr(bss.mac),
@@ -297,10 +326,26 @@ return baseclass.extend({
                                        if (assoclist.firstElementChild.childNodes.length < 6)
                                                assoclist.firstElementChild.appendChild(E('div', { 'class': 'th cbi-section-actions' }));
 
-                                       row.push(E('button', {
-                                               'class': 'cbi-button cbi-button-remove',
-                                               'click': L.bind(this.handleDelClient, this, networks[i], bss.mac)
-                                       }, [ _('Disconnect') ]));
+                                       if (macfilter != null && macfilter != 'disable' && !this.isDeviceAdded[bss.mac]) {
+                                               row.push(new L.ui.ComboButton('button', {
+                                                               'addlist': macfilter == 'allow' ?  _('Add to Whitelist') : _('Add to Blacklist'),
+                                                               'disconnect': _('Disconnect')
+                                                       }, {
+                                                               'click': L.bind(this.handleDelClient, this, networks[i], bss.mac),
+                                                               'sort': [ 'disconnect', 'addlist' ],
+                                                               'classes': {
+                                                                       'addlist': 'btn cbi-button cbi-button-remove',
+                                                                       'disconnect': 'btn cbi-button cbi-button-remove'
+                                                               }
+                                                       }).render()
+                                               )
+                                       }
+                                       else { 
+                                               row.push(E('button', {
+                                                       'class': 'cbi-button cbi-button-remove',
+                                                       'click': L.bind(this.handleDelClient, this, networks[i], bss.mac)
+                                               }, [ _('Disconnect') ]));
+                                       }
                                }
                                else {
                                        row.push('-');
index dfa9c5dc0335a09b51bbabb6e93a9a5fad1c613f..10d8a02bddf763f6f36b3fbec25fbb02504bac5a 100644 (file)
@@ -1414,6 +1414,23 @@ body:not(.Interfaces) .cbi-rowstyle-2:first-child {
        outline: 0;
 }
 
+.cbi-dropdown.btn {
+       min-height: 1.8rem;
+       padding-top: 0px;
+       padding-bottom: 0px;
+       padding-right: 0px;
+}
+
+.cbi-dropdown.btn > .open {
+       font-size: 0.8rem;
+       padding: 0px;
+       margin: 0 5px;
+}
+
+.cbi-dropdown.btn > div {
+       margin: 0px;
+}
+
 .cbi-dropdown > .more,
 .cbi-dropdown > ul > li[placeholder] {
        font-weight: bold;