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)
- Edge: Hold Ctrl while clicking Refresh, or 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]]