MediaWiki:Gadget-hideuser.js

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/*
    Support for local hiding of user names.

    Authors: [[:m:User:DerHexer]] and [[:m:User:Erwin]], July 2009 - August 2009
    License: Quadruple licensed GFDL, GPL, LGPL and Creative Commons Attribution 3.0 (CC-BY-3.0)

    This tool uses code from SBHandler at Meta.
        [[:m:MediaWiki:Gadget-SBHandler.js]]
        Author: [[:m:User:Erwin]], October 2008 - February 2009
        License: Quadruple licensed GFDL, GPL, LGPL and Creative Commons Attribution 3.0 (CC-BY-3.0)

    Which in turn uses code from DelReqHandler at Commons.
        [[:Commons:MediaWiki:Gadget-DelReqHandler.js]] (oldid=15093612)
        Author: [[:Commons:User:Lupo]], October 2007 - January 2008
        License: Quadruple licensed GFDL, GPL, LGPL and Creative Commons Attribution 3.0 (CC-BY-3.0)

    Tested only in Firefox.
*/
// <nowiki>
/*jshint browser:true, jquery:true */
/*global mw */
  function newRequest()
   {
     try {
       if (window.XMLHttpRequest) {
         return new XMLHttpRequest();
       } else {
         return new ActiveXObject("MSXML2.XMLHTTP");
       }
     } catch (e) {
       return false;
     }
   }

(function () {
    /**** Guard against double inclusions */
    if (window.LHHandler) {
        return;
    }

     /**** Enable the whole shebang only for stewards. */
    if ($.inArray( 'steward', mw.config.get( 'wgUserGroups', [] ) ) === -1 &&
        $.inArray( 'steward', mw.config.get( 'wgGlobalGroups', [] ) ) === -1
    ) {
        return;
    }

    var LHHandler = {
        user: '',
        projects: 0,
        completed: 0,
        error: false,

        addLinks: function() {
            // Add div with progress information and link to locally hide users.
            var container = document.createElement('div');
            container.style.cssText = 'border: 1px solid; padding: 5px; margin: 25px; float: right; width: 300px; min-height: 200px;';

            // Add container for spinner.
            var spinner = document.createElement('div');
            spinner.id = 'dspinner';
            spinner.style.cssText = 'float:right; width: 30px';
            container.appendChild(spinner);

            // Add link to hide users.
            var s = document.createElement('div');
            s.style.cssText = 'text-align: center; font-weight: bold;';

            var a = document.createElement('a');
            $(a).on('click', function (e) {
                e.preventDefault();
                LHHandler.parsePage();
            });
            a.appendChild(document.createTextNode('Suppress local users'));

            s.appendChild(a);
            container.appendChild(s);

            // Add list for logging.
            var ul = document.createElement('ul');
            ul.id = 'mw-centralauth-localhide-status';
            container.appendChild(ul);
            $('#bodyContent').prepend(container);
            LHHandler.user = document.getElementById('target').value;
        },

        parsePage: function() {
            if (!$('#mw-centralauth-status-hidden-oversight').prop('checked')) {
                LHHandler.logMsg('Please lock and suppress the global account first.', true);
                return;
            }
            // Fresh start. No errors yet.
            LHHandler.error = false;

            // Add spinner.
            var spinner = document.getElementById('dspinner');
            var img = document.createElement('img');
            img.src = '//upload.wikimedia.org/wikipedia/commons/3/32/Loader3.gif';
            img.id = 'hideuserrunning';
            img.setAttribute('height', '20px');
            img.setAttribute('width', '20px');
            img.setAttribute('alt', 'script running');
            spinner.appendChild(img);

            // Get projects.
            var trs = document.getElementById('mw-centralauth-merged')
                .getElementsByTagName('table')[0]
                .getElementsByTagName('tbody')[0]
                .getElementsByTagName('tr');

            LHHandler.projects = trs.length - 1;

            // Loop over projects.
            for (var i = 0; i < (trs.length - 1); i++) {
                var project = trs[i].getElementsByTagName('td')[1].getElementsByTagName('a')[0].innerHTML;
                /*project = project[1]+'/'+project[0];
                if(project=='mediawiki/www')project='wikipedia/mediawiki';
                if(project=='wikimedia/species')project='wikipedia/species';
                if(project=='wikimedia/meta')project='wikipedia/meta';
                if(project=='wikimedia/commons')project='wikipedia/commons';
                if(project=='org/wikisource')project='wikipedia/sources';*/
                LHHandler.retrieveLog(project);
            }
        },

        retrieveLog: function (project) {
            var query = location.protocol + '//' + project + '/w/api.php?format=xml&action=query&list=blocks';
            query += '&bkusers=' + encodeURIComponent(LHHandler.user);
            LHHandler.getRequest(query, LHHandler.checkLog, project);
        },

        checkLog: function (request, project) {
            var xml = request.responseXML;
            if ( xml ) {
                var blocklog = xml.getElementsByTagName('block');
                if(!blocklog[0] || (blocklog[0] && (blocklog[0].getAttribute('hidden') === null))) {
                    LHHandler.getToken(project);
                } else {
                    LHHandler.logMsg('Already suppressed on ' + project + '.');
                    LHHandler.checkStatus();
                }
            } else {
                // Just do it.
                LHHandler.getToken(project);
            }
        },

        getToken: function (project) {
            var query = location.protocol + '//' + project + '/w/api.php?format=xml&action=query&meta=tokens&type=csrf';
            query += '&titles=' + LHHandler.user;
            LHHandler.getRequest(query, LHHandler.blockUser, project);
        },

        blockUser: function (request, project) {
            var xml = request.responseXML;
            if ( xml ) {
                var page = xml.getElementsByTagName('tokens');
                var token;
                if (!page[0] || (page[0] && (page[0].getAttribute('csrftoken') === null))) {
                    LHHandler.logMsg('Could not get token on ' + project + '.', true);
                    LHHandler.checkStatus();
                    return;
                } else {
                    token = page[0].getAttribute('csrftoken');
                }
                var query = location.protocol + '//' + project + '/w/api.php?format=xml';
                var params = 'action=block&user=' + encodeURIComponent(LHHandler.user) + '&expiry=infinite&hidename=1&reblock=1';
                params += '&nocreate=1&autoblock=1&noemail=1&reason=Globally%20suppressed%20from%20meta%20for%20abusive%20user%20name';
                params += '&token=' + encodeURIComponent(token);
                LHHandler.postRequest(query, LHHandler.checkBlock, params, project);
            } else {
                LHHandler.logMsg('Could not get token on ' + project + '.', true);
                LHHandler.checkStatus();
            }
        },

        checkBlock: function (request, project) {
            var xml = request.responseXML;
            if ( xml ) {
                var block = xml.getElementsByTagName('block');
                if (!block[0] || (block[0] && (block[0].getAttribute('hidename') === null))) {
                    LHHandler.logMsg('Not suppressed on ' + project + '.', true);
                } else {
                    LHHandler.logMsg('Suppressed on ' + project + '.');
                }
            } else {
                LHHandler.logMsg('Could not check whether hiding succeeded on ' + project + '.', true);
            }
            LHHandler.checkStatus();
        },

        checkStatus: function() {
            // Checking status means that the process for a project has
            // ended.
            LHHandler.completed += 1;

            // Set image accordingly.
            if (LHHandler.completed == LHHandler.projects) {
                var img = document.createElement('img');
                img.setAttribute('id', 'hideuserrunning');
                img.setAttribute('height', '20px');
                img.setAttribute('width', '20px');
                var alt, src;
                if (LHHandler.error) {
                    alt = 'Script stopped with errors';
                    src = '//upload.wikimedia.org/wikipedia/commons/thumb/a/a2/X_mark.svg/525px-X_mark.svg.png';
                } else {
                    alt = 'Script stopped';
                    src = '//upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Yes_check.svg/600px-Yes_check.svg.png';
                }
                img.setAttribute('src', src);
                img.setAttribute('alt', alt);
                document.getElementById('dspinner').replaceChild(img, document.getElementById('hideuserrunning'));
            }
        },

        logMsg: function (msg, error) {
            var li = document.createElement('li');
            if (error) {
                LHHandler.error = true;
                li.setAttribute('style', 'color:red; font-weight:bold;');
            }
            li.appendChild(document.createTextNode(msg));
            document.getElementById('mw-centralauth-localhide-status').appendChild(li);
        },

        getRequest: function(url, callback, args) {
        	var test = new RegExp(mw.config.get('wgServer'));
            if (url.search(test) == -1) url = url + '&origin=' + encodeURIComponent(location.protocol + mw.config.get('wgServer'));
            var request = newRequest();
            if (request === null) {
                return null;
            }
            request.open('GET', url, true);
            request.onreadystatechange = function () {
                if(request.readyState == 4) {
                    callback(request, args);
                }
            };
            request.setRequestHeader('Origin', location.protocol + mw.config.get('wgServer'));
            request.withCredentials = true;
            request.send(null);
        },

        postRequest: function(url, callback, params, args) {
        	var test = new RegExp(mw.config.get('wgServer'));
            if(url.search(test) == -1) url = url + '&origin=' + encodeURIComponent(location.protocol + mw.config.get('wgServer'));
            var request = newRequest();
            if (request === null) {
                return null;
            }
            request.open('POST', url, true);
            request.onreadystatechange = function () {
                if(request.readyState == 4) {
                    callback(request, args);
                }
            };

            request.setRequestHeader('Content-type','application/x-www-form-urlencoded');
            request.setRequestHeader('Content-length', params.length);
            request.setRequestHeader('Origin', location.protocol + mw.config.get('wgServer'));
    		request.withCredentials = true;
            request.send(params);
        },

        setupHandler: function() {
            /**
             * Only for [[Special:CentralAuth]] via a secure connection.
             * Secure connection is needed for all projects to be at the
             * same domain, such that we can make XMLRequests to all
             * projects.
             */

            if (mw.config.get('wgCanonicalSpecialPageName') !== 'CentralAuth') {
                return;
            }
            LHHandler.addLinks();
        }

    };

    $(LHHandler.setupHandler);

    // Expose publicly
    window.LHHandler = LHHandler;
}());
// </nowiki>
// [[Category:Gadgets|LHHandler.js]]