Page MenuHomePhabricator

Replace on-wiki raw HTML overrides for "MediaWiki:Copyright" etc. and set $wgAllowRawHtmlCopyrightMessages = false
Closed, ResolvedPublic

Related Objects

Event Timeline

About 150 of those overrides are not used, as they override MediaWiki:Copyright, but the wiki uses MediaWiki:Wikimedia-copyright instead. The wikis have been configured this way since the migration to dual license in 2009 (rEWME6b1869934e4e: Prepping for site default overrides of copyright/TOS statements for Wikimedia…). It seems like a good opportunity for a bit of cleanup, so I'll start by deleting those.

To delete those pages, I wrote myself the following script, which I executed in my browser while logged in as "Bartosz Dziewoński (WMF)".

I also set my global preferences on that account to add pages I delete to my watchlist, and to enable all possible email notifications, to make sure I don't miss it if anyone comments about these deletions. So far I only received a lot of new user welcome messages ;)

async function doDelete( list ) {
	const urls = list.trim().split( /\s+/ );

	for ( const url of urls ) {
		const apiUrl = url.replace( /\/wiki\/.+$/, '/w/api.php' );
		const pageTitle = url.replace( /^.+\/wiki\//, '' );

		const api = new mw.ForeignApi( apiUrl, {
			parameters: {
				assert: 'user',
				assertuser: mw.config.get( 'wgUserName' )
			}
		} );

		await api.postWithToken( 'csrf', {
			action: 'delete',
			title: pageTitle,
			reason: 'Copyright message updates ([[phab:T375789|T375789]]): Delete unused message, the copyright footer on this wiki uses [[MediaWiki:Wikimedia-copyright]] instead since the [[m:Licensing update|2009 licensing update]]'
		} )
			.then( data => console.log( data ) )
			.catch( ( code, data ) => console.log( code, data ) );

		await new Promise( resolve => setTimeout( resolve, 10000 ) );
	}
}

doDelete( `
https://af.wikipedia.org/wiki/MediaWiki:Copyright
https://als.wikipedia.org/wiki/MediaWiki:Copyright
https://am.wikipedia.org/wiki/መልዕክት:Copyright
https://ang.wikipedia.org/wiki/MediaWiki:Copyright
https://ar.wikibooks.org/wiki/ميدياويكي:Copyright
https://ar.wikipedia.org/wiki/ميدياويكي:Copyright
https://ar.wikiquote.org/wiki/ميدياويكي:Copyright
https://ar.wikisource.org/wiki/ميدياويكي:Copyright
https://ar.wikiversity.org/wiki/ميدياويكي:Copyright
https://ar.wiktionary.org/wiki/ميدياويكي:Copyright
https://arz.wikipedia.org/wiki/ميدياويكى:Copyright
https://as.wikipedia.org/wiki/মিডিয়াৱিকি:Copyright
https://bar.wikipedia.org/wiki/MediaWiki:Copyright
https://be-tarask.wikipedia.org/wiki/MediaWiki:Copyright
https://bg.wikipedia.org/wiki/МедияУики:Copyright
https://bg.wiktionary.org/wiki/МедияУики:Copyright
https://bn.wikipedia.org/wiki/মিডিয়াউইকি:Copyright
https://bug.wikipedia.org/wiki/MediaWiki:Copyright
https://ca.wikipedia.org/wiki/MediaWiki:Copyright
https://cbk-zam.wikipedia.org/wiki/MediaWiki:Copyright
https://cdo.wikipedia.org/wiki/MediaWiki:Copyright
https://ceb.wikipedia.org/wiki/MediaWiki:Copyright
https://co.wikipedia.org/wiki/MediaWiki:Copyright
https://cs.wikipedia.org/wiki/MediaWiki:Copyright
https://csb.wikipedia.org/wiki/MediaWiki:Copyright
https://csb.wiktionary.org/wiki/MediaWiki:Copyright
https://cy.wikipedia.org/wiki/MediaWici:Copyright
https://cy.wikisource.org/wiki/MediaWici:Copyright
https://cy.wiktionary.org/wiki/MediaWici:Copyright
https://da.wikibooks.org/wiki/MediaWiki:Copyright
https://da.wikipedia.org/wiki/MediaWiki:Copyright
https://de.wikiquote.org/wiki/MediaWiki:Copyright
https://de.wikisource.org/wiki/MediaWiki:Copyright
https://de.wikivoyage.org/wiki/MediaWiki:Copyright
https://diq.wikipedia.org/wiki/MediaWiki:Copyright
https://el.wikipedia.org/wiki/MediaWiki:Copyright
https://el.wikisource.org/wiki/MediaWiki:Copyright
https://el.wiktionary.org/wiki/MediaWiki:Copyright
https://en.wikibooks.org/wiki/MediaWiki:Copyright
https://en.wikiquote.org/wiki/MediaWiki:Copyright
https://en.wikisource.org/wiki/MediaWiki:Copyright
https://en.wikiversity.org/wiki/MediaWiki:Copyright
https://en.wikivoyage.org/wiki/MediaWiki:Copyright
https://eo.wikipedia.org/wiki/MediaWiki:Copyright
https://eo.wiktionary.org/wiki/MediaWiki:Copyright
https://es.wikipedia.org/wiki/MediaWiki:Copyright
https://es.wikiquote.org/wiki/MediaWiki:Copyright
https://et.wikisource.org/wiki/MediaWiki:Copyright
https://eu.wikipedia.org/wiki/MediaWiki:Copyright
https://fa.wikivoyage.org/wiki/مدیاویکی:Copyright
https://fi.wikipedia.org/wiki/Järjestelmäviesti:Copyright
https://fiu-vro.wikipedia.org/wiki/MediaWiki:Copyright
https://fo.wikipedia.org/wiki/MediaWiki:Copyright
https://fr.wikipedia.org/wiki/MediaWiki:Copyright
https://fr.wikivoyage.org/wiki/MediaWiki:Copyright
https://fr.wiktionary.org/wiki/MediaWiki:Copyright
https://frp.wikipedia.org/wiki/MediaWiki:Copyright
https://fur.wikipedia.org/wiki/MediaWiki:Copyright
https://ga.wikipedia.org/wiki/MediaWiki:Copyright
https://ga.wiktionary.org/wiki/MediaWiki:Copyright
https://gd.wiktionary.org/wiki/MediaWiki:Copyright
https://gl.wiktionary.org/wiki/MediaWiki:Copyright
https://gv.wikipedia.org/wiki/MediaWiki:Copyright
https://he.wikipedia.org/wiki/מדיה_ויקי:Copyright
https://he.wiktionary.org/wiki/מדיה_ויקי:Copyright
https://hi.wikipedia.org/wiki/मीडियाविकि:Copyright
https://hr.wikipedia.org/wiki/MediaWiki:Copyright
https://hsb.wikipedia.org/wiki/MediaWiki:Copyright
https://hu.wikipedia.org/wiki/MediaWiki:Copyright
https://hy.wiktionary.org/wiki/MediaWiki:Copyright
https://id.wikipedia.org/wiki/MediaWiki:Copyright
https://ie.wikipedia.org/wiki/MediaWiki:Copyright
https://ii.wikipedia.org/wiki/MediaWiki:Copyright
https://io.wikipedia.org/wiki/MediaWiki:Copyright
https://io.wiktionary.org/wiki/MediaWiki:Copyright
https://it.wikiquote.org/wiki/MediaWiki:Copyright
https://ka.wikipedia.org/wiki/მედიავიკი:Copyright
https://kk.wiktionary.org/wiki/МедиаУики:Copyright
https://kn.wikipedia.org/wiki/ಮೀಡಿಯವಿಕಿ:Copyright
https://ko.wikibooks.org/wiki/미디어위키:Copyright
https://ko.wikisource.org/wiki/미디어위키:Copyright
https://la.wikisource.org/wiki/MediaWiki:Copyright
https://li.wikipedia.org/wiki/MediaWiki:Copyright
https://lij.wikipedia.org/wiki/MediaWiki:Copyright
https://lmo.wikipedia.org/wiki/MediaWiki:Copyright
https://lt.wikipedia.org/wiki/MediaWiki:Copyright
https://map-bms.wikipedia.org/wiki/MédhiaWiki:Copyright
https://mi.wikipedia.org/wiki/MediaWiki:Copyright
https://mk.wikipedia.org/wiki/МедијаВики:Copyright
https://mr.wikipedia.org/wiki/मिडियाविकी:Copyright
https://mr.wiktionary.org/wiki/मिडियाविकी:Copyright
https://nah.wikipedia.org/wiki/Huiquimedia:Copyright
https://ne.wikibooks.org/wiki/मीडियाविकि:Copyright
https://ne.wikipedia.org/wiki/मीडियाविकि:Copyright
https://new.wikipedia.org/wiki/मिडियाविकि:Copyright
https://nl.wikibooks.org/wiki/MediaWiki:Copyright
https://nl.wikipedia.org/wiki/MediaWiki:Copyright
https://nl.wikiquote.org/wiki/MediaWiki:Copyright
https://nl.wikisource.org/wiki/MediaWiki:Copyright
https://nl.wiktionary.org/wiki/MediaWiki:Copyright
https://no.wikiquote.org/wiki/MediaWiki:Copyright
https://no.wikisource.org/wiki/MediaWiki:Copyright
https://nrm.wikipedia.org/wiki/MediaWiki:Copyright
https://oc.wikipedia.org/wiki/MediaWiki:Copyright
https://pl.wikibooks.org/wiki/MediaWiki:Copyright
https://pl.wikipedia.org/wiki/MediaWiki:Copyright
https://pl.wikiquote.org/wiki/MediaWiki:Copyright
https://pl.wikisource.org/wiki/MediaWiki:Copyright
https://pms.wikipedia.org/wiki/MediaWiki:Copyright
https://pt.wikiquote.org/wiki/MediaWiki:Copyright
https://qu.wikipedia.org/wiki/MediaWiki:Copyright
https://ro.wikibooks.org/wiki/MediaWiki:Copyright
https://ro.wikipedia.org/wiki/MediaWiki:Copyright
https://roa-rup.wikipedia.org/wiki/MediaWiki:Copyright
https://ru.wikibooks.org/wiki/MediaWiki:Copyright
https://ru.wikipedia.org/wiki/MediaWiki:Copyright
https://ru.wikiquote.org/wiki/MediaWiki:Copyright
https://ru.wikisource.org/wiki/MediaWiki:Copyright
https://ru.wikivoyage.org/wiki/MediaWiki:Copyright
https://scn.wikipedia.org/wiki/MediaWiki:Copyright
https://scn.wiktionary.org/wiki/MediaWiki:Copyright
https://sco.wikipedia.org/wiki/MediaWiki:Copyright
https://sd.wikipedia.org/wiki/ذريعات_وڪي:Copyright
https://sd.wiktionary.org/wiki/ذريعات_وڪي:Copyright
https://shn.wikivoyage.org/wiki/မီႇတီႇယႃႇဝီႇၶီႇ:Copyright
https://sk.wikibooks.org/wiki/MediaWiki:Copyright
https://sl.wikibooks.org/wiki/MediaWiki:Copyright
https://sl.wiktionary.org/wiki/MediaWiki:Copyright
https://sq.wiktionary.org/wiki/MediaWiki:Copyright
https://st.wiktionary.org/wiki/MediaWiki:Copyright
https://su.wikipedia.org/wiki/MédiaWiki:Copyright
https://sv.wikipedia.org/wiki/MediaWiki:Copyright
https://sv.wikisource.org/wiki/MediaWiki:Copyright
https://sv.wikivoyage.org/wiki/MediaWiki:Copyright
https://sv.wiktionary.org/wiki/MediaWiki:Copyright
https://ta.wikipedia.org/wiki/மீடியாவிக்கி:Copyright
https://ta.wiktionary.org/wiki/மீடியாவிக்கி:Copyright
https://te.wikipedia.org/wiki/మీడియావికీ:Copyright
https://th.wikipedia.org/wiki/มีเดียวิกิ:Copyright
https://tl.wikibooks.org/wiki/MediaWiki:Copyright
https://tl.wikipedia.org/wiki/MediaWiki:Copyright
https://tl.wiktionary.org/wiki/MediaWiki:Copyright
https://tr.wiktionary.org/wiki/MediaWiki:Copyright
https://vi.wikibooks.org/wiki/MediaWiki:Copyright
https://vi.wikipedia.org/wiki/MediaWiki:Copyright
https://vi.wikiquote.org/wiki/MediaWiki:Copyright
https://vls.wikipedia.org/wiki/MediaWiki:Copyright
https://war.wikipedia.org/wiki/MedyaWiki:Copyright
https://zh-classical.wikipedia.org/wiki/MediaWiki:Copyright
https://zh-yue.wikipedia.org/wiki/MediaWiki:Copyright
` );

I also deleted a couple of overrides for MediaWiki:History_copyright that were empty, which is the same as the default value.

async function doDelete( list ) {
	const urls = list.trim().split( /\s+/ );

	for ( const url of urls ) {
		const apiUrl = url.replace( /\/wiki\/.+$/, '/w/api.php' );
		const pageTitle = url.replace( /^.+\/wiki\//, '' );

		const api = new mw.ForeignApi( apiUrl, {
			parameters: {
				assert: 'user',
				assertuser: mw.config.get( 'wgUserName' )
			}
		} );

		await api.postWithToken( 'csrf', {
			action: 'delete',
			title: pageTitle,
			reason: 'Copyright message updates ([[phab:T375789|T375789]]): Delete empty message, identical to the default'
		} )
			.then( data => console.log( data ) )
			.catch( ( code, data ) => console.log( code, data ) );

		await new Promise( resolve => setTimeout( resolve, 10000 ) );
	}
}

doDelete( `
https://gu.wikipedia.org/wiki/મીડિયાવિકિ:History_copyright
https://ja.wikibooks.org/wiki/MediaWiki:History_copyright
https://ja.wikiquote.org/wiki/MediaWiki:History_copyright
https://ka.wikipedia.org/wiki/მედიავიკი:History_copyright
https://tr.wikipedia.org/wiki/MediaWiki:History_copyright
https://ur.wikipedia.org/wiki/میڈیاویکی:History_copyright
` );

Next steps will have to wait until next week, after the changes from T45646 are live on all wikis. I started thinking about how to do them already.

  • I could just create MediaWiki:Wikimedia-copyright-footer and delete MediaWiki:Wikimedia-copyright, but those pages often have long histories, and it would be nice to keep them.
  • To do that, I could move MediaWiki:Wikimedia-copyright to MediaWiki:Wikimedia-copyright-footer and then edit it, but that means that for at least a few seconds, wrong markup will be shown in the copyright footer on all pages, and I'd like to avoid this disruption.
  • After thinking about it for a bit, the ideal approach seems to be creating MediaWiki:Wikimedia-copyright-footer first, and then history-merging MediaWiki:Wikimedia-copyright into it.

I tried moving and history-merging MediaWiki: namespace pages locally, and it went alright, although I found a few bugs:

Maybe we could resolve them before proceeding. I proposed patches: https://gerrit.wikimedia.org/r/q/topic:mediawiki-ns-redirects

I already created the new -footer page on dewiki a few days ago. I intented to proceed exactly the way you stated above, creating first and then history-merging later. Is everything ready for the change? Then I could do this for dewiki already.

Edit: Ah I think I have to wait until thursday?

That's right, the change that starts using the new messages will be deployed to dewiki on Thursday (assuming no unforeseen issues happen – please check T375657: 1.43.0-wmf.26 deployment blockers for any updates about that).

Feel free to make the updates on dewiki once that happens, and I will skip it. (I'll also skip and manually review any other projects where either the old or new messages have been edited in the meantime.)

For some reason, the script that checks legal conformity of the footer, failed with:

ERROR: Error while downloading https:///wiki/Wikipedia:Text_of_the_Creative_Commons_Attribution-ShareAlike_4.0_International_License: <urlopen error no host given>

I believe it is because the script assumes absolute URLs. Will fix it.

Change #1079973 had a related patch set uploaded (by Jcrespo; author: Jcrespo):

[operations/puppet@production] check footer legal complience: Add support for relative URLs

https://gerrit.wikimedia.org/r/1079973

I wrote myself another script to do the edits. It does some ugly regexp replacements, and then displays a diff of the wikitext and the resulting parsed HTML, and either saves the changes or skips depending on whether I think the diff looks correct. The regexp replacements are not always correct, but that's okay due to the manual review.

image.png (2×3 px, 494 KB)

It also generates a log of the diffs, which I will share here once I'm done editing.

function getDiffTable() {
	return $( '<table>' ).addClass( 'diff' ).append(
		$( '<col>' ).addClass( 'diff-marker' ),
		$( '<col>' ).addClass( 'diff-content' ),
		$( '<col>' ).addClass( 'diff-marker' ),
		$( '<col>' ).addClass( 'diff-content' ),
		$( '<thead>' ).append(
			$( '<tr>' ).addClass( 'diff-title' ).append(
				$( '<td>' )
					.attr( 'colspan', 2 )
					.addClass( 'diff-otitle diff-side-deleted' )
					.text( mw.msg( 'currentrev' ) ),
				$( '<td>' )
					.attr( 'colspan', 2 )
					.addClass( 'diff-ntitle diff-side-added' )
					.text( mw.msg( 'yourtext' ) )
			)
		),
		$( '<tbody>' )
	);
}

function stripOuterParagraph( html ) {
	let m;
	if ( ( m = html.match( /^<p>(.*)\n?<\/p>\n?/s ) ) && !m[ 1 ].includes( '</p>' ) ) {
		html = m[ 1 ];
	}
	return html;
}

let LOG = '<link rel="stylesheet" href="https://meta.wikimedia.org/w/load.php?lang=en&only=styles&modules=mediawiki.skinning.interface|mediawiki.diff.styles|mediawiki.codex.messagebox.styles|skins.vector.styles">\n';

async function doUpdate( list ) {
	await mw.loader.using( 'mediawiki.page.preview' );
	await mw.loader.using( 'oojs-ui' );

	const urls = list.trim().split( /\s+/ );

	const titleMap = {
		'Wikimedia-copyright': 'Wikimedia-copyright-footer',
		Copyright: 'Copyright-footer',
		History_copyright: 'Copyright-footer-history'
	};

	for ( const url of urls ) {
		const apiUrl = url.replace( /\/wiki\/.+$/, '/w/api.php' );
		const oldPageTitle = url.replace( /^.+\/wiki\//, '' );
		const newPageTitle = oldPageTitle.replace( /:([^\/]+)/, ( _, t ) => ':' + titleMap[ t ] );

		const $header = $( '<strong>' ).append(
			$( '<a>' ).attr( 'href', url ).text( url ),
			$( '<span>' ).text( ' → ' + newPageTitle )
		);

		// non-anonymous mw.ForeignApi with CentralAuth adds some overhead, so avoid it if possible
		const writeApi = new mw.ForeignApi( apiUrl, {
			parameters: {
				formatversion: 2,
				assert: 'user',
				assertuser: mw.config.get( 'wgUserName' )
			}
		} );
		const readApi = new mw.ForeignApi( apiUrl, {
			parameters: {
				formatversion: 2
			},
			anonymous: true,
			headers: {
				'Promise-Non-Write-API-Action': 'true'
			}
		} );

		const newPageMissing = ( await readApi.get( {
			prop: 'revisions',
			titles: newPageTitle
		} ) ).query.pages[ 0 ].missing;
		if ( !newPageMissing ) {
			await OO.ui.alert(
				$( '<div>' )
					.append( $header )
					.append( $( '<p>' ).text( 'New page already exists' ) ),
				{ size: 'larger' }
			);
			continue;
		}

		const oldContent = ( await readApi.get( {
			prop: 'revisions',
			titles: oldPageTitle,
			rvprop: 'content',
			rvslots: 'main'
		} ) ).query.pages[ 0 ].revisions[ 0 ].slots.main.content;

		const newContent = oldContent
			.replaceAll( url.replace( /\/wiki\/.+$/, '' ), '' )
			.replaceAll( url.replace( /\/wiki\/.+$/, '' ).replace( 'https:', 'http:' ), '' )
			.replaceAll( url.replace( /\/wiki\/.+$/, '' ).replace( 'https:', '' ), '' )
			.replaceAll( /<a\b[^>]*><\/a>/g, '' )
			.replaceAll( /<a\b[^>]*?\bhref=['"]*((?:https?:)?\/\/[^'" ]+).*?>([^<]+)<\/a>/g, '[$1 $2]' )
			.replaceAll( /<a\b[^>]*?\bhref=['"]*\/wiki\/([^'" ]+).*?>([^<]+)<\/a>/g,
				( _, $1, $2 ) => `[[${ decodeURI( $1 ).replaceAll( '_', ' ' ) }|${ $2 }]]` )
			.replaceAll( /<a\b[^>]*?\bhref=['"]*(?:\{\{SERVER\}\})?\{\{localurle?:([^}]+)\}\}.*?>([^<]+)<\/a>/g, '[[$1|$2]]' )
			.replaceAll( /\n\n+/g, '\n' );

		if ( oldContent === newContent ) {
			await OO.ui.alert(
				$( '<div>' )
					.append( $header )
					.append( $( '<p>' ).text( 'No changes' ) ),
				{ size: 'larger' }
			);
			continue;
		}
		const oldHtml = ( await readApi.post( {
			action: 'expandtemplates',
			title: 'TEST PAGE',
			text: oldContent,
			prop: 'wikitext'
		} ) ).expandtemplates.wikitext;

		const newHtml = stripOuterParagraph( ( await readApi.post( {
			action: 'parse',
			title: 'TEST PAGE',
			text: newContent,
			prop: 'text',
			wrapoutputclass: '',
			disablelimitreport: true
		} ) ).parse.text ).trim();

		const diffOfWikitext = ( await readApi.post( {
			action: 'compare',
			uselang: 'en',
			fromslots: 'main',
			'fromtext-main': oldContent,
			'fromcontentmodel-main': 'wikitext',
			toslots: 'main',
			'totext-main': newContent,
			'tocontentmodel-main': 'wikitext',
			slots: 'main'
		} ) ).compare.bodies.main;

		const diffOfHtml = ( await readApi.post( {
			action: 'compare',
			uselang: 'en',
			fromslots: 'main',
			'fromtext-main': oldHtml,
			'fromcontentmodel-main': 'wikitext',
			toslots: 'main',
			'totext-main': newHtml,
			'tocontentmodel-main': 'wikitext',
			slots: 'main'
		} ) ).compare.bodies.main;

		const $table = getDiffTable();
		$table.find( 'tbody' ).html( diffOfWikitext );

		$table.append(
			$( '<thead>' ).append(
				$( '<tr>' ).addClass( 'diff-title' ).append(
					$( '<td>' )
						.attr( 'colspan', 2 )
						.addClass( 'diff-otitle diff-side-deleted' )
						.text( 'Old HTML' ),
					$( '<td>' )
						.attr( 'colspan', 2 )
						.addClass( 'diff-ntitle diff-side-added' )
						.text( 'New HTML (after parsing)' )
				)
			),
			$( '<tbody>' ).append(
				$( '<tr>' ).append(
					$( '<td>' )
						.attr( 'colspan', 2 )
						.html( oldHtml ),
					$( '<td>' )
						.attr( 'colspan', 2 )
						.html( newHtml )
				)
			)
		);

		$table.append( $( '<tbody>' ).html( diffOfHtml ) );
		$table.css( 'background', 'white' );

		const $msg = $( '<div>' ).addClass( 'diff-editfont-monospace diff-contentalign-left' )
			.append( $header )
			.append( $table );

		const okay = await OO.ui.confirm( $msg, { size: 'larger' } );
		LOG += ( mw.util.messageBox( $msg[ 0 ], okay ? 'success' : 'warning' ) ).outerHTML;
		if ( !okay ) {
			continue;
		}

		await writeApi.postWithToken( 'csrf', {
			action: 'edit',
			title: newPageTitle,
			text: newContent,
			createonly: true,
			summary: `Copyright message updates ([[phab:T375789|T375789]]): Migrate [[${ oldPageTitle }]] to [[${ newPageTitle }]], now using wikitext markup instead of raw HTML`
		} )
			.then( ( data ) => console.log( data ) )
			.catch( ( code, data ) => console.log( code, data ) );

		await new Promise( ( resolve ) => setTimeout( resolve, 1000 ) );

		await writeApi.postWithToken( 'csrf', {
			action: 'mergehistory',
			from: oldPageTitle,
			to: newPageTitle,
			reason: 'Copyright message updates ([[phab:T375789|T375789]])'
		} )
			.then( ( data ) => console.log( data ) )
			.catch( ( code, data ) => console.log( code, data ) );
	}

	OO.ui.alert( 'All done!' );
}

doUpdate( `
https://als.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://am.wikipedia.org/wiki/መልዕክት:Wikimedia-copyright
https://ar.wikinews.org/wiki/ميدياويكي:Copyright
https://ar.wikipedia.org/wiki/ميدياويكي:Wikimedia-copyright
https://ar.wikisource.org/wiki/ميدياويكي:Wikimedia-copyright
https://as.wikipedia.org/wiki/মিডিয়াৱিকি:Wikimedia-copyright
https://azb.wikipedia.org/wiki/مدیاویکی:Wikimedia-copyright
https://bar.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://bd.wikimedia.org/wiki/মিডিয়াউইকি:Wikimedia-copyright
https://be-tarask.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://bg.wikinews.org/wiki/МедияУики:Copyright
https://bg.wikipedia.org/wiki/МедияУики:History_copyright
https://bg.wikipedia.org/wiki/МедияУики:Wikimedia-copyright
https://bn.wikibooks.org/wiki/মিডিয়াউইকি:Wikimedia-copyright
https://bn.wikipedia.org/wiki/মিডিয়াউইকি:Wikimedia-copyright
https://bn.wikisource.org/wiki/মিডিয়াউইকি:Wikimedia-copyright
https://bn.wiktionary.org/wiki/মিডিয়াউইকি:Wikimedia-copyright
https://bs.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://ca.wikinews.org/wiki/MediaWiki:Copyright
https://ca.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://cdo.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://commons.wikimedia.org/wiki/MediaWiki:Wikimedia-copyright
https://cs.wikipedia.org/wiki/MediaWiki:History_copyright
https://da.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://de.wikinews.org/wiki/MediaWiki:Copyright
https://de.wikiquote.org/wiki/MediaWiki:Wikimedia-copyright
https://de.wikisource.org/wiki/MediaWiki:Wikimedia-copyright
https://de.wikivoyage.org/wiki/MediaWiki:Wikimedia-copyright
https://de.wiktionary.org/wiki/MediaWiki:Wikimedia-copyright
https://el.wikinews.org/wiki/MediaWiki:Copyright
https://el.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://en.wikibooks.org/wiki/MediaWiki:Wikimedia-copyright
https://en.wikinews.org/wiki/MediaWiki:Copyright
https://en.wikinews.org/wiki/MediaWiki:Wikimedia-copyright
https://en.wikiquote.org/wiki/MediaWiki:Wikimedia-copyright
https://en.wikisource.org/wiki/MediaWiki:Wikimedia-copyright
https://en.wikiversity.org/wiki/MediaWiki:Wikimedia-copyright
https://en.wikivoyage.org/wiki/MediaWiki:Wikimedia-copyright
https://en.wiktionary.org/wiki/MediaWiki:Wikimedia-copyright
https://eo.wikinews.org/wiki/MediaWiki:Copyright
https://es.wikinews.org/wiki/MediaWiki:Copyright
https://es.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://fa.wikipedia.org/wiki/مدیاویکی:Wikimedia-copyright
https://fi.wikinews.org/wiki/Järjestelmäviesti:Copyright
https://fi.wikipedia.org/wiki/Järjestelmäviesti:History_copyright
https://fi.wikipedia.org/wiki/Järjestelmäviesti:Wikimedia-copyright
https://fr.wikibooks.org/wiki/MediaWiki:Wikimedia-copyright
https://fr.wikinews.org/wiki/MediaWiki:Copyright
https://fr.wikipedia.org/wiki/MediaWiki:History_copyright
https://fr.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://fr.wiktionary.org/wiki/MediaWiki:Wikimedia-copyright
https://frp.wikipedia.org/wiki/MediaWiki:History_copyright
https://frr.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://ga.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://gl.wikibooks.org/wiki/MediaWiki:Wikimedia-copyright
https://gl.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://gl.wikiquote.org/wiki/MediaWiki:Wikimedia-copyright
https://gl.wikisource.org/wiki/MediaWiki:Wikimedia-copyright
https://got.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://he.wikipedia.org/wiki/מדיה_ויקי:History_copyright
https://he.wikiquote.org/wiki/מדיה_ויקי:History_copyright
https://he.wikiquote.org/wiki/מדיה_ויקי:Wikimedia-copyright
https://he.wiktionary.org/wiki/מדיה_ויקי:History_copyright
https://hi.wikipedia.org/wiki/मीडियाविकि:Wikimedia-copyright
https://hu.wikinews.org/wiki/MediaWiki:Copyright
https://hu.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://id.wikipedia.org/wiki/MediaWiki:Copyright
https://ii.wikipedia.org/wiki/MediaWiki:Copyright
https://is.wikipedia.org/wiki/Melding:Wikimedia-copyright
https://it.wikinews.org/wiki/MediaWiki:Copyright
https://it.wikiquote.org/wiki/MediaWiki:Wikimedia-copyright
https://it.wikiversity.org/wiki/MediaWiki:Wikimedia-copyright
https://it.wikivoyage.org/wiki/MediaWiki:Wikimedia-copyright
https://ja.wikinews.org/wiki/MediaWiki:Copyright
https://ka.wikipedia.org/wiki/მედიავიკი:Wikimedia-copyright
https://kk.wikipedia.org/wiki/МедиаУики:Wikimedia-copyright
https://ko.wikinews.org/wiki/미디어위키:Copyright
https://ko.wikipedia.org/wiki/미디어위키:Wikimedia-copyright
https://ko.wikiquote.org/wiki/미디어위키:Wikimedia-copyright
https://krc.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://lb.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://li.wiktionary.org/wiki/MediaWiki:Wikimedia-copyright
https://lmo.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://lt.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://lv.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://mai.wikipedia.org/wiki/मेडियाविकि:Wikimedia-copyright
https://map-bms.wikipedia.org/wiki/MédhiaWiki:Wikimedia-copyright
https://mk.wikipedia.org/wiki/МедијаВики:Wikimedia-copyright
https://mr.wikipedia.org/wiki/मिडियाविकी:Wikimedia-copyright
https://ms.wikipedia.org/wiki/MediaWiki:History_copyright
https://nds.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://nl.wikibooks.org/wiki/MediaWiki:Wikimedia-copyright
https://nl.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://nn.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://no.wikinews.org/wiki/MediaWiki:Copyright
https://nrm.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://nv.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://oc.wikipedia.org/wiki/MediaWiki:History_copyright
https://oc.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://pa.wikipedia.org/wiki/ਮੀਡੀਆਵਿਕੀ:Wikimedia-copyright
https://pa.wiktionary.org/wiki/ਮੀਡੀਆਵਿਕੀ:Wikimedia-copyright
https://pfl.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://pl.wikinews.org/wiki/MediaWiki:Copyright
https://ps.wikivoyage.org/wiki/ميډياويکي:Wikimedia-copyright
https://pt.wikibooks.org/wiki/MediaWiki:Wikimedia-copyright
https://pt.wikinews.org/wiki/MediaWiki:Copyright
https://pt.wikipedia.org/wiki/MediaWiki:History_copyright
https://pt.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://rm.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://ro.wikinews.org/wiki/MediaWiki:Copyright
https://ro.wikivoyage.org/wiki/MediaWiki:Wikimedia-copyright
https://ru.wikimedia.org/wiki/MediaWiki:Wikimedia-copyright
https://ru.wikinews.org/wiki/MediaWiki:Copyright
https://ru.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://se.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://simple.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://sk.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://sl.wikipedia.org/wiki/MediaWiki:History_copyright
https://sl.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://species.wikimedia.org/wiki/MediaWiki:Wikimedia-copyright
https://sq.wikinews.org/wiki/MediaWiki:Copyright
https://sq.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://stq.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://sv.wikinews.org/wiki/MediaWiki:Copyright
https://sv.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://ta.wikinews.org/wiki/மீடியாவிக்கி:Copyright
https://test.wikidata.org/wiki/MediaWiki:Wikimedia-copyright
https://th.wikinews.org/wiki/มีเดียวิกิ:Copyright
https://th.wikipedia.org/wiki/มีเดียวิกิ:Wikimedia-copyright
https://ti.wikipedia.org/wiki/ሜድያዊኪ:Wikimedia-copyright
https://tl.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://tr.wikinews.org/wiki/MediaWiki:Copyright
https://tr.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://uk.wikinews.org/wiki/MediaWiki:Copyright
https://uk.wikisource.org/wiki/MediaWiki:Wikimedia-copyright
https://ur.wikipedia.org/wiki/میڈیاویکی:Wikimedia-copyright
https://ur.wikiquote.org/wiki/میڈیاویکی:Wikimedia-copyright
https://vec.wikisource.org/wiki/MediaWiki:Wikimedia-copyright
https://vi.wikibooks.org/wiki/MediaWiki:History_copyright
https://vi.wikibooks.org/wiki/MediaWiki:Wikimedia-copyright
https://vi.wikipedia.org/wiki/MediaWiki:History_copyright
https://vi.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://vi.wikisource.org/wiki/MediaWiki:Wikimedia-copyright
https://vi.wiktionary.org/wiki/MediaWiki:History_copyright
https://wa.wiktionary.org/wiki/MediaWiki:Wikimedia-copyright
https://wikimania2007.wikimedia.org/wiki/MediaWiki:Copyright
https://www.mediawiki.org/wiki/MediaWiki:Copyright
https://yo.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://zh-classical.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://zh-yue.wikipedia.org/wiki/MediaWiki:History_copyright
https://zh-yue.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://zh.wikibooks.org/wiki/MediaWiki:History_copyright
https://zh.wikibooks.org/wiki/MediaWiki:Wikimedia-copyright
https://zh.wikinews.org/wiki/MediaWiki:Copyright
https://zh.wikipedia.org/wiki/MediaWiki:History_copyright
https://zh.wikipedia.org/wiki/MediaWiki:Wikimedia-copyright
https://zh.wikiquote.org/wiki/MediaWiki:History_copyright
https://zh.wikiquote.org/wiki/MediaWiki:Wikimedia-copyright
https://zh.wikisource.org/wiki/MediaWiki:Wikimedia-copyright
https://zh.wikivoyage.org/wiki/MediaWiki:Wikimedia-copyright
https://zh.wiktionary.org/wiki/MediaWiki:History_copyright
https://zh.wiktionary.org/wiki/MediaWiki:Wikimedia-copyright
` );

Change #1079973 merged by Jcrespo:

[operations/puppet@production] check footer legal complience: Add support for relative URLs

https://gerrit.wikimedia.org/r/1079973

There are a few wikis that I wasn't able to edit (either because they're closed or due to abuse filters), a few wikis where the links to license etc. are incorrect, and a few with more complex problems. I'll update them manually or reach out to folks.

I noticed several messages where, after the recent upgrade to CC BY-SA 4.0 license, the link to license text was pointing to a page that does not exist. I corrected all of the links I found to use https://creativecommons.org/licenses/by-sa/4.0/ instead, and sent a quick email to legal@ asking if there's something better that could be done.

https://bs.wikipedia.org/w/index.php?diff=3660058
https://gl.wikipedia.org/w/index.php?diff=6864524
https://gl.wikibooks.org/w/index.php?diff=20618
https://gl.wikiquote.org/w/index.php?diff=22171
https://gl.wikisource.org/w/index.php?diff=21374
https://mk.wikipedia.org/w/index.php?diff=5283421
https://pa.wikipedia.org/w/index.php?diff=770957

I've made around 300 edits / deletions / page moves today. There are just a few of the old messages left: https://global-search.toolforge.org/?q=.*&regex=1&namespaces=8&title=(Copyright|History+copyright|Wikimedia-copyright)(%2F.*)%3F – they are either using complex markup (images and unbalanced list items), or I've been unable to edit or delete them due to abuse filters or the wiki being locked down. I will figure out what to do with them later this week.

OK, all done.

The most… interesting override I encountered was https://de.wiktionary.org/w/index.php?title=MediaWiki:Wikimedia-copyright-footer&action=edit&oldid=9979183, which is used to display "see also" ("Siehe auch") messages on German Wiktionary when it has entries for both lowercase-initial and uppercase-initial versions of the same word, e.g. https://de.wiktionary.org/wiki/Haus and https://de.wiktionary.org/wiki/haus. A piece of JavaScript (https://de.wiktionary.org/w/index.php?title=MediaWiki:Common.js&oldid=9894405#L-319) moves this message from the page footer to the top of the article. Luckily it was possible to make it work in the wikitext version too, so I didn't have to figure out how to do that better… (although it would be nice).

Several Wikinews add small icons representing the license in the footer (e.g. https://en.wikinews.org/). They all used different icons, and updating those was a bit of a chore.

Many projects also use these overrides to add non-copyright-related links to the footer, such as pageview statistics or contact links (e.g. https://th.wikipedia.org/, https://als.wikipedia.org/). I was able to automate most of these replacements, but ended up doing a few unusual ones by hand. Maybe this could be a normal MediaWiki feature, it would be easier to maintain.

There are three pages I wasn't able to edit:

You can find all of the edits I made here: https://guc.toolforge.org/?by=date&user=Bartosz+Dziewoński+(WMF) (this tool does not list deletions, alas I don't think there's a convenient way to find them).

Change #1080805 had a related patch set uploaded (by Bartosz Dziewoński; author: Bartosz Dziewoński):

[operations/mediawiki-config@master] Set $wgAllowRawHtmlCopyrightMessages = false

https://gerrit.wikimedia.org/r/1080805

Looks done now

Probably @Andrew or @bd808

Change #1080805 merged by jenkins-bot:

[operations/mediawiki-config@master] Set $wgAllowRawHtmlCopyrightMessages = false

https://gerrit.wikimedia.org/r/1080805

Mentioned in SAL (#wikimedia-operations) [2024-10-17T13:27:14Z] <urbanecm@deploy2002> Started scap sync-world: Backport for [[gerrit:1080805|Set $wgAllowRawHtmlCopyrightMessages = false (T375789)]], [[gerrit:1080828|tests: ensure maintenance base class has always been requierd (T377391 T357535)]]

Mentioned in SAL (#wikimedia-operations) [2024-10-17T13:29:28Z] <urbanecm@deploy2002> cscott, urbanecm, matmarex: Backport for [[gerrit:1080805|Set $wgAllowRawHtmlCopyrightMessages = false (T375789)]], [[gerrit:1080828|tests: ensure maintenance base class has always been requierd (T377391 T357535)]] synced to the testservers (https://wikitech.wikimedia.org/wiki/Mwdebug)

Mentioned in SAL (#wikimedia-operations) [2024-10-17T13:35:22Z] <urbanecm@deploy2002> Finished scap sync-world: Backport for [[gerrit:1080805|Set $wgAllowRawHtmlCopyrightMessages = false (T375789)]], [[gerrit:1080828|tests: ensure maintenance base class has always been requierd (T377391 T357535)]] (duration: 08m 07s)

Probably @Andrew or @bd808

{{Done}} https://labtestwikitech.wikimedia.org/w/index.php?title=Special:Log&logid=945

I had to use mwscript createAndPromote --wiki=labtestwiki --interface-admin --force --reason 'Enable editing rawhtml ([[phab:T375789]])' BryanDavis-labtest to give my labtestwiki account the ability to modify that file. No accounts on labtestwiki had the interface admin right prior to this action. This was likely an accidental loss of rights following editsitecss/editsitejs being revoked from the sysop group quite a while ago now.