Personal tools
Make a donation
$ 




Extension:UsDomainStates.php

From OrganicDesign Wiki

Jump to: navigation, search
<?php
# Extension:UsDomainStates[[Category:Private]]
# - Author: [http://www.organicdesign.co.nz/nad User:Nad]
# - Started: 2007-11-17
 
define('USDOMAINSTATES_VERSION','0.1.0, 2008-09-24');
$wgExtensionCredits['other'][] = array(
	'name'        => 'UsDomainStates',
	'author'      => '[http://www.organicdesign.co.nz/nad User:Nad]',
	'description' => 'Assign users with email .us email addresses into a group for their state.',
	'url'         => 'http://www.organicdesign.co.nz/Extension:UsDomainStates',
	'version'     => USDOMAINSTATES_VERSION
);
 
$wgUsDomainStates['ak'] = 'Alaska';
$wgUsDomainStates['al'] = 'Alabama';
$wgUsDomainStates['ar'] = 'Arkansas';
$wgUsDomainStates['az'] = 'Arizona';
$wgUsDomainStates['ca'] = 'California';
$wgUsDomainStates['co'] = 'Colorado';
$wgUsDomainStates['ct'] = 'Connecticut';
$wgUsDomainStates['dc'] = 'District of Columbia';
$wgUsDomainStates['de'] = 'Delaware';
$wgUsDomainStates['fl'] = 'Florida';
$wgUsDomainStates['ga'] = 'Georgia';
$wgUsDomainStates['hi'] = 'Hawaii';
$wgUsDomainStates['ia'] = 'Iowa';
$wgUsDomainStates['id'] = 'Idaho';
$wgUsDomainStates['il'] = 'Illinois';
$wgUsDomainStates['in'] = 'Indiana';
$wgUsDomainStates['ks'] = 'Kansas';
$wgUsDomainStates['ky'] = 'Kentucky';
$wgUsDomainStates['la'] = 'Louisiana';
$wgUsDomainStates['ma'] = 'Massachusetts';
$wgUsDomainStates['md'] = 'Maryland';
$wgUsDomainStates['me'] = 'Maine';
$wgUsDomainStates['mi'] = 'Michigan';
$wgUsDomainStates['mn'] = 'Minnesota';
$wgUsDomainStates['mo'] = 'Missouri';
$wgUsDomainStates['ms'] = 'Mississippi';
$wgUsDomainStates['mt'] = 'Montana';
$wgUsDomainStates['nc'] = 'North Carolina';
$wgUsDomainStates['nd'] = 'North Dakota';
$wgUsDomainStates['ne'] = 'Nebraska';
$wgUsDomainStates['nh'] = 'New Hampshire';
$wgUsDomainStates['nj'] = 'New Jersey';
$wgUsDomainStates['nm'] = 'New Mexico';
$wgUsDomainStates['nv'] = 'Nevada';
$wgUsDomainStates['ny'] = 'New York';
$wgUsDomainStates['oh'] = 'Ohio';
$wgUsDomainStates['ok'] = 'Oklahoma';
$wgUsDomainStates['or'] = 'Oregon';
$wgUsDomainStates['pa'] = 'Pennsylvania';
$wgUsDomainStates['ri'] = 'Rhode Island';
$wgUsDomainStates['sc'] = 'South Carolina';
$wgUsDomainStates['sd'] = 'South Dakota';
$wgUsDomainStates['tn'] = 'Tennessee';
$wgUsDomainStates['tx'] = 'Texas';
$wgUsDomainStates['ut'] = 'Utah';
$wgUsDomainStates['va'] = 'Virginia';
$wgUsDomainStates['vt'] = 'Vermont';
$wgUsDomainStates['wa'] = 'Washington';
$wgUsDomainStates['wi'] = 'Wisconsin';
$wgUsDomainStates['wv'] = 'West Virginia';
$wgUsDomainStates['wy'] = 'Wyoming';
$wgUsDomainStates['as'] = 'American Samoa';
$wgUsDomainStates['gu'] = 'Guam';
$wgUsDomainStates['pr'] = 'Puerto Rico';
$wgUsDomainStates['vi'] = 'U.S. Virgin Islands';
 
$wgExtensionFunctions[] = 'wfUsDomainStatesSetup';
$wgHooks['UserEffectiveGroups'][] = 'wfUsDomainStatesGroups';
 
function wfUsDomainStatesSetup() {
	global $wgUser, $wgGroupPermissions, $wgUsDomainStates;
 
	# Scan all the users for email addresses with state-groups
	$dbr  = &wfGetDB(DB_SLAVE);
	$tbl  = $dbr->tableName('user');
	$res  = $dbr->select($tbl, 'user_email', "user_email != ''", __METHOD__);
	while ($row = $dbr->fetchRow($res)) if ($group = wfUsDomainStatesGroupFromEmail($row[0])) $wgUsDomainStates[] = $group;
	$dbr->freeResult($res);
 
	# Ensure all the domsin states are valid groups
	foreach ($wgUsDomainStates as $group) $wgGroupPermissions[$group] = array();
 
	# If this article is categorised in any DomainStates, the user must belong to one of the corresponding groups to be allowed to edit
	$groups = $wgUser->getEffectiveGroups();
	$title  = Title::newFromText($_REQUEST['title']);
	if (is_object($title) && !in_array('sysop', $groups)) {
		$list = array();
		$cl   = $dbr->tableName('categorylinks');
		$id   = $title->getArticleID();
		$res  = $dbr->select($cl, 'cl_to', "cl_from = $id", __METHOD__, array('ORDER BY' => 'cl_sortkey'));
		while ($row = $dbr->fetchRow($res)) if (in_array($row[0], $wgUsDomainStates)) $list[] = $row[0];
		$dbr->freeResult($res);
		if (count($list) && !array_intersect($list, $groups)) {
			$wgGroupPermissions['*']['edit'] = false;
			$wgGroupPermissions['user']['edit'] = false;
		}
	}
}
 
/**
 * Add user to a group based on their email address and add any new groups
 */
function wfUsDomainStatesGroups(&$user, &$rights) {
	global $wgGroupPermissions;
	if ($user->isEmailConfirmed()) {
		$email = $user->getEmail();
		$group = wfUsDomainStatesGroupFromEmail($email);
		if ($group) {
			$wgGroupPermissions[$group] = array();
			$rights[] = $group;
		}
	}
	return true;
}
 
function wfUsDomainStatesGroupFromEmail($email) {
	global $wgUsDomainStates;
	$group = false;
	if     (preg_match('/.+[.@](.+?)\\.(us|gov)$/', $email, $m)) $group = $wgUsDomainStates[$m[1]];
	elseif (preg_match('/.+[.@](.+?)\\.edu$/',      $email, $m)) $group = ucfirst($m[1]);
	return $group;
}

The GNU Project Debian Linux Ubuntu Linux Wikipedia Affiliate Button MediaWiki

Content under the www.organicdesign.co.nz domain is available under the Creative Commons Attribution-ShareAlike License