These are needed for OAuth grants. Note that we don't bother with a 'viewmyoptions' right, since the majority will be determinable from just observing the interface. Note that the fact of having a confirmed email address cannot be reliably hidden, and if the user has 'sendemail' they may be able to determine the real name and email address by sending an email to another account that they control. Change-Id: I3f03dd010020e8d43cc2d3bca7b3ef7196d1c548
204 lines
5.7 KiB
PHP
204 lines
5.7 KiB
PHP
<?php
|
|
/**
|
|
* Base code to format metadata.
|
|
*
|
|
* Copyright 2004, Evan Prodromou <evan@wikitravel.org>.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
* http://www.gnu.org/copyleft/gpl.html
|
|
*
|
|
* @author Evan Prodromou <evan@wikitravel.org>
|
|
* @file
|
|
*/
|
|
|
|
abstract class RdfMetaData {
|
|
const RDF_TYPE_PREFS = 'application/rdf+xml,text/xml;q=0.7,application/xml;q=0.5,text/rdf;q=0.1';
|
|
|
|
/**
|
|
* Constructor
|
|
* @param $article Article object
|
|
*/
|
|
public function __construct( Page $article ) {
|
|
$this->mArticle = $article;
|
|
}
|
|
|
|
abstract public function show();
|
|
|
|
protected function setup() {
|
|
global $wgOut, $wgRequest;
|
|
|
|
$httpaccept = isset( $_SERVER['HTTP_ACCEPT'] ) ? $_SERVER['HTTP_ACCEPT'] : null;
|
|
$rdftype = wfNegotiateType( wfAcceptToPrefs( $httpaccept ), wfAcceptToPrefs( self::RDF_TYPE_PREFS ) );
|
|
|
|
if ( !$rdftype ) {
|
|
throw new HttpError( 406, wfMessage( 'notacceptable' ) );
|
|
}
|
|
|
|
$wgOut->disable();
|
|
$wgRequest->response()->header( "Content-type: {$rdftype}; charset=utf-8" );
|
|
$wgOut->sendCacheControl();
|
|
return true;
|
|
}
|
|
|
|
protected function reallyFullUrl() {
|
|
return $this->mArticle->getTitle()->getFullURL();
|
|
}
|
|
|
|
protected function basics() {
|
|
global $wgLanguageCode, $wgSitename;
|
|
|
|
$this->element( 'title', $this->mArticle->getTitle()->getText() );
|
|
$this->pageOrString( 'publisher', wfMessage( 'aboutpage' )->text(), $wgSitename );
|
|
$this->element( 'language', $wgLanguageCode );
|
|
$this->element( 'type', 'Text' );
|
|
$this->element( 'format', 'text/html' );
|
|
$this->element( 'identifier', $this->reallyFullUrl() );
|
|
$this->element( 'date', $this->date( $this->mArticle->getTimestamp() ) );
|
|
|
|
$lastEditor = User::newFromId( $this->mArticle->getUser() );
|
|
$this->person( 'creator', $lastEditor );
|
|
|
|
foreach ( $this->mArticle->getContributors() as $user ) {
|
|
$this->person( 'contributor', $user );
|
|
}
|
|
|
|
$this->rights();
|
|
}
|
|
|
|
protected function element( $name, $value ) {
|
|
$value = htmlspecialchars( $value );
|
|
print "\t\t<dc:{$name}>{$value}</dc:{$name}>\n";
|
|
}
|
|
|
|
protected function date( $timestamp ) {
|
|
return substr( $timestamp, 0, 4 ) . '-'
|
|
. substr( $timestamp, 4, 2 ) . '-'
|
|
. substr( $timestamp, 6, 2 );
|
|
}
|
|
|
|
protected function pageOrString( $name, $page, $str ) {
|
|
if ( $page instanceof Title ) {
|
|
$nt = $page;
|
|
} else {
|
|
$nt = Title::newFromText( $page );
|
|
}
|
|
|
|
if ( !$nt || $nt->getArticleID() == 0 ) {
|
|
$this->element( $name, $str );
|
|
} else {
|
|
$this->page( $name, $nt );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param $name string
|
|
* @param $title Title
|
|
*/
|
|
protected function page( $name, $title ) {
|
|
$this->url( $name, $title->getFullURL() );
|
|
}
|
|
|
|
protected function url( $name, $url ) {
|
|
$url = htmlspecialchars( $url );
|
|
print "\t\t<dc:{$name} rdf:resource=\"{$url}\" />\n";
|
|
}
|
|
|
|
protected function person( $name, User $user ) {
|
|
global $wgHiddenPrefs;
|
|
|
|
if ( $user->isAnon() ) {
|
|
$this->element( $name, wfMessage( 'anonymous' )->numParams( 1 )->text() );
|
|
} else {
|
|
$real = $user->getRealName();
|
|
if ( $real && !in_array( 'realname', $wgHiddenPrefs ) ) {
|
|
$this->element( $name, $real );
|
|
} else {
|
|
$userName = $user->getName();
|
|
$this->pageOrString(
|
|
$name,
|
|
$user->getUserPage(),
|
|
wfMessage( 'siteuser', $userName, $userName )->text()
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Takes an arg, for future enhancement with different rights for
|
|
* different pages.
|
|
*/
|
|
protected function rights() {
|
|
global $wgRightsPage, $wgRightsUrl, $wgRightsText;
|
|
|
|
if ( $wgRightsPage && ( $nt = Title::newFromText( $wgRightsPage ) )
|
|
&& ( $nt->getArticleID() != 0 ) ) {
|
|
$this->page( 'rights', $nt );
|
|
} elseif ( $wgRightsUrl ) {
|
|
$this->url( 'rights', $wgRightsUrl );
|
|
} elseif ( $wgRightsText ) {
|
|
$this->element( 'rights', $wgRightsText );
|
|
}
|
|
}
|
|
|
|
protected function getTerms( $url ) {
|
|
global $wgLicenseTerms;
|
|
|
|
if ( $wgLicenseTerms ) {
|
|
return $wgLicenseTerms;
|
|
} else {
|
|
$known = $this->getKnownLicenses();
|
|
if ( isset( $known[$url] ) ) {
|
|
return $known[$url];
|
|
} else {
|
|
return array();
|
|
}
|
|
}
|
|
}
|
|
|
|
protected function getKnownLicenses() {
|
|
$ccLicenses = array( 'by', 'by-nd', 'by-nd-nc', 'by-nc',
|
|
'by-nc-sa', 'by-sa' );
|
|
$ccVersions = array( '1.0', '2.0' );
|
|
$knownLicenses = array();
|
|
|
|
foreach ( $ccVersions as $version ) {
|
|
foreach ( $ccLicenses as $license ) {
|
|
if ( $version == '2.0' && substr( $license, 0, 2 ) != 'by' ) {
|
|
# 2.0 dropped the non-attribs licenses
|
|
continue;
|
|
}
|
|
$lurl = "http://creativecommons.org/licenses/{$license}/{$version}/";
|
|
$knownLicenses[$lurl] = explode( '-', $license );
|
|
$knownLicenses[$lurl][] = 're';
|
|
$knownLicenses[$lurl][] = 'di';
|
|
$knownLicenses[$lurl][] = 'no';
|
|
if ( !in_array( 'nd', $knownLicenses[$lurl] ) ) {
|
|
$knownLicenses[$lurl][] = 'de';
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Handle the GPL and LGPL, too. */
|
|
|
|
$knownLicenses['http://creativecommons.org/licenses/GPL/2.0/'] =
|
|
array( 'de', 're', 'di', 'no', 'sa', 'sc' );
|
|
$knownLicenses['http://creativecommons.org/licenses/LGPL/2.1/'] =
|
|
array( 'de', 're', 'di', 'no', 'sa', 'sc' );
|
|
$knownLicenses['http://www.gnu.org/copyleft/fdl.html'] =
|
|
array( 'de', 're', 'di', 'no', 'sa', 'sc' );
|
|
|
|
return $knownLicenses;
|
|
}
|
|
}
|