From OrganicDesign Wiki
<?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;
}