X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=plugins%2FDomainWhitelist%2FDomainWhitelistPlugin.php;h=76486f65b041f735a0fad43efcb19c97160b6294;hb=d6b28c64830f632bb2f4b6f3c9369b9e56ad217a;hp=8fab835991bccd91f1b13f18894a133dc79288fe;hpb=bc66211565035ed5986390fdecd089cbbb8db959;p=quix0rs-gnu-social.git diff --git a/plugins/DomainWhitelist/DomainWhitelistPlugin.php b/plugins/DomainWhitelist/DomainWhitelistPlugin.php index 8fab835991..76486f65b0 100644 --- a/plugins/DomainWhitelist/DomainWhitelistPlugin.php +++ b/plugins/DomainWhitelist/DomainWhitelistPlugin.php @@ -23,6 +23,7 @@ * @category Cache * @package StatusNet * @author Evan Prodromou + * @author Zach Copley * @copyright 2011 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @link http://status.net/ @@ -40,19 +41,46 @@ if (!defined('STATUSNET')) { * @category General * @package StatusNet * @author Evan Prodromou + * @author Zach Copley * @copyright 2011 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @link http://status.net/ */ class DomainWhitelistPlugin extends Plugin { - function onRequireValidatedEmailPlugin_Override($user, &$knownGood) + /** + * Get the path to the plugin's installation directory. Used + * to link in js files and whatnot. + * + * @return String the absolute path + */ + protected function getPath() { + return preg_replace('/^' . preg_quote(INSTALLDIR, '/') . '\//', '', dirname(__FILE__)); + } + + /** + * Link in a JavaScript script for the whitelist invite form + * + * @param Action $action Action being shown + * + * @return boolean hook flag + */ + public function onEndShowStatusNetScripts(Action $action) { + $name = $action->arg('action'); + if ($name == 'invite') { + $action->script($this->getPath() . '/js/whitelistinvite.js'); + } + return true; + } + + public function onRequireValidatedEmailPlugin_Override(User $user, &$knownGood) { $knownGood = (!empty($user->email) && $this->matchesWhitelist($user->email)); return true; } - function onEndValidateUserEmail($user, $email, &$valid) + // @TODO Most callers are given NULL as first argument + public function onEndValidateUserEmail($user, $email, &$valid) { if ($valid) { // it's otherwise valid if (!$this->matchesWhitelist($email)) { @@ -65,7 +93,7 @@ class DomainWhitelistPlugin extends Plugin } else { // TRANS: Client exception thrown when a given e-mailaddress is not in the domain whitelist. // TRANS: %s are whitelisted e-mail domains separated by comma's (localisable). - $message = sprintf(_('Email address must be in one of these domains: %s.'), + $message = sprintf(_m('Email address must be in one of these domains: %s.'), // TRANS: Separator for whitelisted domains. implode(_m('SEPARATOR',', '), $whitelist)); } @@ -75,11 +103,11 @@ class DomainWhitelistPlugin extends Plugin return true; } - function onStartAddEmailAddress($user, $email) + public function onStartAddEmailAddress(User $user, $email) { if (!$this->matchesWhitelist($email)) { // TRANS: Exception thrown when an e-mail address does not match the site's domain whitelist. - throw new Exception(_('That email address is not allowed on this site.')); + throw new Exception(_m('That email address is not allowed on this site.')); } return true; @@ -98,33 +126,153 @@ class DomainWhitelistPlugin extends Plugin { $whitelist = $this->getWhitelist(); - if (empty($whitelist)) { + if (empty($whitelist) || empty($whitelist[0])) { return true; } - $parts = explode('@', $email); - - $userDomain = strtolower($parts[1]); + $userDomain = $this->domainFromEmail($email); return in_array($userDomain, $whitelist); } + /** + * Helper function to pull out a domain from + * an email address + * + * @param string $email and email address + * @return string the domain + */ + function domainFromEmail($email) + { + $parts = explode('@', $email); + return strtolower(trim($parts[1])); + } + function getWhitelist() { $whitelist = common_config('email', 'whitelist'); if (is_array($whitelist)) { - return $whitelist; + return $this->sortWhiteList($whitelist); } else { return explode('|', $whitelist); } } - function onPluginVersion(&$versions) + /** + * This is a filter function passed in to array_filter() + * in order to strip out the user's domain, which will + * be re-inserted as the first element (see sortWhitelist() + * below). + * + * @param string $domain domain to check + * @return boolean whether to include the domain + */ + function userDomainFilter($domain) + { + $user = common_current_user(); + $userDomain = $this->domainFromEmail($user->email); + if ($userDomain == $domain) { + return false; + } + return true; + } + + /** + * This function sorts the whitelist alphabetically, and sets the + * current user's domain as the first element in the array of + * allowed domains. Mostly, this is for the JavaScript on the invite + * page--in the case of multiple allowed domains, it's nicer if the + * user's own domain is the first option, and this seemed like a good + * way to do it. + * + * @param array $whitelist whitelist of allowed email domains + * @return array an ordered or sorted version of the whitelist + */ + function sortWhitelist($whitelist) + { + $whitelist = array_unique($whitelist); + natcasesort($whitelist); + + $user = common_current_user(); + + if (!empty($user) && !empty($user->email)) { + $userDomain = $this->domainFromEmail($user->email); + + $orderedWhitelist = array_values( + array_filter( + $whitelist, + array($this, "userDomainFilter") + ) + ); + + if (in_array($userDomain, $whitelist)) { + array_unshift($orderedWhitelist, $userDomain); + } + return $orderedWhitelist; + } + + return $whitelist; + } + + /** + * Show a fancier invite form when domains are restricted to the + * whitelist. + * + * @param action $action the invite action + * @return boolean hook value + */ + function onStartShowInviteForm($action) + { + $this->showConfirmDialog($action); + $form = new WhitelistInviteForm($action, $this->getWhitelist()); + $form->show(); + return false; + } + + function showConfirmDialog($action) + { + // For JQuery UI modal dialog + $action->elementStart( + 'div', + // TRANS: Title for invitiation deletion dialog. + array('id' => 'confirm-dialog', 'title' => _m('Confirmation Required')) + ); + // TRANS: Confirmation text for invitation deletion dialog. + $action->text(_m('Really delete this invitation?')); + $action->elementEnd('div'); + } + + /** + * This is a bit of a hack. We take the values from the custom + * whitelist invite form and reformat them so they look like + * their coming from the the normal invite form. + * + * @param action &$action the invite action + * @return boolean hook value + */ + function onStartSendInvitations(&$action) + { + $emails = array(); + $usernames = $action->arg('username'); + $domains = $action->arg('domain'); + + for($i = 0; $i < count($usernames); $i++) { + if (!empty($usernames[$i])) { + $emails[] = $usernames[$i] . '@' . $domains[$i] . "\n"; + } + } + + $action->args['addresses'] = implode($emails); + + return true; + } + + function onPluginVersion(array &$versions) { $versions[] = array('name' => 'DomainWhitelist', - 'version' => STATUSNET_VERSION, - 'author' => 'Evan Prodromou', + 'version' => GNUSOCIAL_VERSION, + 'author' => 'Evan Prodromou, Zach Copley', 'homepage' => 'http://status.net/wiki/Plugin:DomainWhitelist', 'rawdescription' => // TRANS: Plugin description.