Jump to content

User:Quarl/rollback.js

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Quarl (talk | contribs) at 07:13, 18 January 2006 (window.x). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// Rollback button.

// requires wikipage.js, md5.js

// based on http://sam.zoy.org/wikipedia/godmode-light.js

// <pre><nowiki>

// -----------------------------------------------------------------------------
// God-like Monobook skin
// (c) 2005 Sam Hocevar <sam@zoy.org>
// $Id: godmode-light.js 980 2005-11-12 01:51:51Z sam $
// -----------------------------------------------------------------------------

// -----------------------------------------------------------------------------
// Language support, taken from phase3/languages/*
// -----------------------------------------------------------------------------
var rollbacklink = 'rollback';
var cantrollback = 'Cannot revert edit; last contributor is only author of this page.';
var alreadyrolled = 'Cannot rollback last edit of [[$1]] by [[User:$2|$2]] ([[User talk:$2|Talk]]); someone else has edited or rolled back the page already. Last edit was by [[User:$3|$3]] ([[User talk:$3|Talk]]). ';
var revertpage = 'Reverted edits by [[Special:Contributions/$2|$2]] to last version by $1';

// -----------------------------------------------------------------------------
// XMLHttpRequest support
// -----------------------------------------------------------------------------
if (document.implementation.createDocument) {
  var xmlparser = new DOMParser();
}

function XMLParse(string) {
  if (document.implementation.createDocument) {
    return xmlparser.parseFromString(string, "text/xml");
  } else if (window.ActiveXObject) {
    var xmldoc = new ActiveXObject("Microsoft.XMLDOM");
    xmldoc.async = "false";
    ret = xmldoc.loadXML(string);      
    if (!ret)
      return null;
    return xmldoc.documentElement;
  }
  return null;
}

var xmlhttp;

// -----------------------------------------------------------------------------
// Our nice Revert functions
// -----------------------------------------------------------------------------
var gml_vandal, gml_editor;

function PerformRevert() {
    if (queryVars['fakeaction'] != 'rollback') return;

    var token = queryVars['token'];
    gml_vandal = queryVars['vandal'];

  document.getElementById('bodyContent').innerHTML = 'Please wait, reverting edits by ' + gml_vandal + '...';
  // Avoid XSS kiddies by using a special token
  if (!token || token != rollback_mkToken(gml_vandal)) {
    document.getElementById('bodyContent').innerHTML += '<br />Bad authentication token!';
    return;
  }

  xmlhttp = HTTPClient();
  if (!xmlhttp)
    return;
  document.getElementById('bodyContent').innerHTML += '<br />Getting article history...';
  xmlhttp.open("GET", wikiPage.qurl + '&action=history&limit=50', true);
  xmlhttp.onreadystatechange = RevertStepTwo;
  xmlhttp.send(null);
}

function RevertStepTwo() {
  if (xmlhttp.readyState != 4)
    return
  var l;
  var oldid;
  // Get the vandal and new editor names
  //gml_vandal = gml_vandal.replace(/_/g, ' ');
  gml_editor = '';
  doc = XMLParse(xmlhttp.responseText);
  l = doc.getElementById('pagehistory').getElementsByTagName('li');
  //l = doc.selectSingleNode('//*[@id="pagehistory"]').getElementsByTagName('li');
  for (i = 0; i < l.length; i++) {
    var name = l[i].getElementsByTagName('span')[0].getElementsByTagName('a')[0].innerHTML.replace(/_/g, ' ');
    if (i == 0 && name != gml_vandal) {
      document.getElementById('bodyContent').innerHTML += '<br />Error: Last editor is ' + name + ', not ' + gml_vandal + '!';
      return;
    } else if (i > 0 && name != gml_vandal) {
      oldid = l[i].getElementsByTagName('input')[0].value;
      gml_editor = name;
      break;
    }
  }
  if (gml_editor == '') {
    document.getElementById('bodyContent').innerHTML += '<br />Error: ' + gml_vandal + ' is the only editor!';
    return;
  }

  xmlhttp = HTTPClient();
  if (!xmlhttp)
    return;

  var url = wikiPage.qurl + '&action=edit&oldid=' + oldid;
  document.getElementById('bodyContent').innerHTML += '<br />Getting article edit form (GET' + url + ')...';
  xmlhttp.open('GET', url, true);
  xmlhttp.onreadystatechange = RevertStepThree;
  xmlhttp.send(null);
}

function RevertStepThree() {
  if (xmlhttp.readyState != 4)
    return
  var form, newform, l;
  // Insert the downloaded form in our current page, using
  // only hidden form inputs.
  doc = XMLParse(xmlhttp.responseText);
  form = doc.getElementById('editform');
  newform = document.createElement('form');
  l = form.getElementsByTagName('textarea');
  for (i = l.length; i--; ) {
    var t = document.createElement('input');
    t.type = 'hidden';
    t.name = l[i].name;
    t.value = l[i].value;
    newform.appendChild(t);
  }
  l = form.getElementsByTagName('input');
  for (i = l.length; i--; ) {
    if (l[i].name == 'wpSummary') {
      l[i].value = revertpage.replace(/\$1/g, gml_editor).replace(/\$2/g, gml_vandal);
    } else if (l[i].name == 'wpMinoredit') {
      l[i].value = '1';
    } else if (l[i].name == 'wpWatchthis') {
      if (!l[i].checked)
        continue; // Don't touch the "watch" status
      l[i].value = "on";
    } else if (l[i].name == 'wpPreview') {
      continue;
    } else if (l[i].name == 'wpDiff') {
      continue;
    }
    l[i].type = 'hidden';
    newform.appendChild(l[i]);
  }
  newform.name = form.name;
  newform.method = form.method;
  newform.id = form.id;
  newform.action = form.action;
  document.getElementById('bodyContent').innerHTML += '<br />Submitting form...';
  document.getElementById('bodyContent').appendChild(newform);
  // Submit the form
  newform.submit();
}

function rollback_link_to_username(link) {
    return link && (new WikiPage(link)).article;
}

function rollback_mkToken(vandal) {
    return hex_md5(wikiPage.page + '%' + vandal + '%' + document.cookie);
}

// -----------------------------------------------------------------------------
// Add revert buttons to the page
// -----------------------------------------------------------------------------
function rollback_AddButtonDiff() {
    var difftag = getElementsByClass('diff-ntitle',document.getElementById('bodyContent'),'td')[0];
window.Xdifftag=difftag;
    if (!difftag) return;

    // if toplink has an oldid then this is not a diff against current revision.
    var toplink = difftag.getElementsByTagName('a')[0].href;
window.Xtoplinik=toplink;
    if (toplink.match(/oldid=/)) return;

    var vandal = rollback_link_to_username(difftag.getElementsByTagName('a')[1]);
window.Xvandal=vandal;
    if (!vandal) { alert("Couldn't parse username in diff page!"); return; }

    var url = wikiPage.qurl + '&fakeaction=rollback&vandal=' + escape(vandal) + '&token=' + escape(rollback_mkToken(vandal));
    var newtext = ' &nbsp;&nbsp;&nbsp;<strong>[<a href="' + url + '">' + rollbacklink + '</a>]</strong> ';

    difftag.innerHTML = difftag.innerHTML.replace(/(<\/a>\))(<br)/i, '$1'+newtext+'$2');
}

function rollback_AddButtonContributions() {
  var l, article = wikiPage.page, vandal;

  // Add 'revert' links to a contributions page
  if (wikiPage.article == 'Special:Contributions') {
    var wp = new WikiPage(document.getElementById('contentSub').getElementsByTagName('a')[0]);
    vandal = wp.article;
    if (!vandal) { alert("Couldn't parse user for Special:Contributions page"); return; }

    l = document.getElementById('bodyContent').getElementsByTagName('li');
    for (i = 0; i < l.length; i++) {
      var t = l[i].innerHTML
      // If we are already a sysop on this wiki, abort
      if (t.indexOf('>' + rollbacklink + '</a>]') != -1)
          break;
      //if (t.indexOf('&amp;diff=0') != -1) {
      if (t.indexOf('<strong> (') != -1) {
        article = l[i].getElementsByTagName('a')[0].href.split('&')[0].replace(/[^\/]*\/\/[^\/]*/, '');
        l[i].innerHTML += ' [<a href="' + article + '&fakeaction=rollback&vandal=' + vandal + '&token=' + hex_md5(article + vandal + document.cookie) + '">' + rollbacklink + '</a>]';
      }
    }
  }
}

function rollback_Load() {
    PerformRevert();
    rollback_AddButtonDiff();
    rollback_AddButtonContributions();
}

addOnloadHook(rollback_Load);

// </nowiki></pre>