success = true;
$this->cando['external'] = true;
$this->cando['logout'] = true;
}
function trustExternal($user, $pass, $sticky = false) {
global $USERINFO, $ID;
//get user info in session
if (!empty($_SESSION[DOKU_COOKIE]['authgoogle']['info'])) {
$USERINFO['name'] = $_SESSION[DOKU_COOKIE]['authgoogle']['info']['name'];
$USERINFO['mail'] = $_SESSION[DOKU_COOKIE]['authgoogle']['info']['mail'];
$USERINFO['grps'] = $_SESSION[DOKU_COOKIE]['authgoogle']['info']['grps'];
$USERINFO['is_google'] = $_SESSION[DOKU_COOKIE]['authgoogle']['info']['is_google'];
$_SERVER['REMOTE_USER'] = $_SESSION[DOKU_COOKIE]['authgoogle']['user'];
return true;
}
//get form login info
if(!empty($user)){
if($this->checkPass($user,$pass)){
$uinfo = $this->getUserData($user);
//set user info
$USERINFO['name'] = $uinfo['name'];
$USERINFO['mail'] = $uinfo['email'];
$USERINFO['grps'] = $uinfo['grps'];
$USERINFO['pass'] = $pass;
//save data in session
$_SERVER['REMOTE_USER'] = $uinfo['name'];
$_SESSION[DOKU_COOKIE]['authgoogle']['user'] = $uinfo['name'];
$_SESSION[DOKU_COOKIE]['authgoogle']['info'] = $USERINFO;
return true;
}else{
//invalid credentials - log off
msg($this->getLang('badlogin'),-1);
return false;
}
}
//if token saved in cookies - get it
if ($_COOKIE[AUTHGOOGLE_COOKIE]) {
$_SESSION[DOKU_COOKIE]['authgoogle']['token'] = $_COOKIE[AUTHGOOGLE_COOKIE];
}
//set our referer for redirection, if we're hitting login
if (!empty($_SERVER['HTTP_REFERER'])) {
$_SESSION[DOKU_COOKIE]['authgoogle']['referer'] = $_SERVER['HTTP_REFERER'];
}
//google auth
require_once GOOGLE_API_DIR.'/Google_Client.php';
require_once GOOGLE_API_DIR.'/contrib/Google_Oauth2Service.php';
$client = new Google_Client();
$client->setApplicationName("Google Application");
$client->setClientId($this->getConf('client_id'));
$client->setClientSecret($this->getConf('client_secret'));
$client->setRedirectUri(wl('start',array('do'=>'login'),true, '&'));
$client->setAccessType('online');
$client->setApprovalPrompt('auto');
$oauth2 = new Google_Oauth2Service($client);
//get code from google redirect link
if (isset($_GET['code'])) {
//get token
try {
$client->authenticate($_GET['code']);
//save token in session
$_SESSION[DOKU_COOKIE]['authgoogle']['token'] = $client->getAccessToken();
//save token in cookies
$this->_updateCookie($_SESSION[DOKU_COOKIE]['authgoogle']['token'], time() + 60 * 60 * 24 * 365);
//redirect to login page
header("Location: ".wl('start', array('do'=>'login'), true, '&'));
die();
} catch (Exception $e) {
msg('Auth Google Error: '.$e->getMessage());
}
}
//save state and auth_url in session
$_SESSION[DOKU_COOKIE]['authgoogle']['state'] = $state;
$_SESSION[DOKU_COOKIE]['authgoogle']['auth_url'] = $client->createAuthUrl();
$_SESSION[DOKU_COOKIE]['authgoogle']['auth_url'] .= "&state=".$state;
//set token in client
if (isset($_SESSION[DOKU_COOKIE]['authgoogle']['token'])) {
try {
$client->setAccessToken($_SESSION[DOKU_COOKIE]['authgoogle']['token']);
} catch (Exception $e){
$this->logOff();
return false;
}
}
//if successed auth
if ($client->getAccessToken()) {
// If the access token is expired, ask the user to login again
if($client->isAccessTokenExpired()) {
$authUrl = $client->createAuthUrl();
header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL));
}
$user = $oauth2->userinfo->get();
$email = filter_var($user['email'], FILTER_SANITIZE_EMAIL);
//$img = filter_var($user['picture'], FILTER_VALIDATE_URL);
//$personMarkup = "$email

";
//Check verify email in google
if (!$user['verified_email']) {
msg('Auth Google Error: '.$email.' not verifed in google account');
$this->logOff();
return false;
}
//check email in list allows
if (!$this->_check_email_domain($email)) {
msg('Auth Google Error: access denied for '.$email);
$this->logOff();
return false;
}
//create and update user in base
$login = 'google'.$user['id'];
$udata = $this->getUserData($login);
if (!$udata) {
//default groups
$grps = null;
if ($this->getConf('default_groups')) $grps = explode(' ', $this->getConf('default_groups'));
//create user
$this->createUser($login, md5(rand().$login), $user['name'], $email, $grps);
$udata = $this->getUserData($login);
} elseif ($udata['name'] != $user['name'] || $udata['email'] != $email) {
//update user
$this->modifyUser($login, array('name'=>$user['name'], 'email'=>$email));
}
//set user info
$USERINFO['pass'] = "";
$USERINFO['name'] = $user['name'];
$USERINFO['mail'] = $email;
$USERINFO['grps'] = $udata['grps'];
$USERINFO['is_google'] = true;
$_SERVER['REMOTE_USER'] = $user['name'];
//save user info in session
$_SESSION[DOKU_COOKIE]['authgoogle']['user'] = $_SERVER['REMOTE_USER'];
$_SESSION[DOKU_COOKIE]['authgoogle']['info'] = $USERINFO;
// update token
$_SESSION['token'] = $client->getAccessToken();
//if login page - redirect to original referer or, if none, start page.
if (isset($_GET['do']) && $_GET['do']=='login') {
$referer = $_SESSION[DOKU_COOKIE]['authgoogle']['referer'];
$redirect = empty($referer) ? wl('start', '', true) : $referer;
header("Location: ".$referer);
}
return true;
} else {
//no auth
}
return false;
}
function _check_email_domain($email) {
//check email in allow domains
if ($this->getConf('allowed_domains')) {
$domains = preg_split("/[ ]+/is", $this->getConf('allowed_domains'));
foreach ($domains as $domain) {
$domain = trim($domain);
//all domains
if ($domain == '*') return true;
//email
if ($email == $domain) return true;
//domain
if (preg_match("/^\\*@([^@ ]+)/is", $domain, $m)) {
if (preg_match("/@([^@ ]+)$/is", $email, $n)) {
if ($m[1] == $n[1]) return true;
}
}
}
}
return false;
}
function logOff(){
unset($_SESSION[DOKU_COOKIE]['authgoogle']['token']);
unset($_SESSION[DOKU_COOKIE]['authgoogle']['user']);
unset($_SESSION[DOKU_COOKIE]['authgoogle']['info']);
// clear the cookie
$this->_updateCookie('', time() - 600000);
}
function _updateCookie($value, $time) {
global $conf;
$cookieDir = empty($conf['cookiedir']) ? DOKU_REL : $conf['cookiedir'];
if (version_compare(PHP_VERSION, '5.2.0', '>')) {
setcookie(AUTHGOOGLE_COOKIE, $value, $time, $cookieDir, '', ($conf['securecookie'] && is_ssl()), true);
} else {
setcookie(AUTHGOOGLE_COOKIE, $value, $time, $cookieDir, '', ($conf['securecookie'] && is_ssl()));
}
}
function cleanUser($user){
/* Sometimes system ask for a user in email format and we need to replace @ for _
In this case, the user is not the logged in one. This happens mostly in the admin tools*/
if(filter_var($user, FILTER_VALIDATE_EMAIL)){
return str_replace("@", "_",$user);
}
/* Sometimes system ask for $login info, that is generated in the registration process some lines above
In this case we return the same username
TODO: check with a regexp */
if(substr( $user, 0, 6 ) === "google"){
return $user;
}
/* When ACL checks the username, it ask for the name of the user (that can be a serious security bug)
so, if the system ask for the name of the current user, I send the email replacing @ for _ cause the
user logged with googleauth can't change its email by hand.
*/
if ($user == $_SESSION[DOKU_COOKIE]['authgoogle']['user'] ){
return str_replace("@", "_", $_SESSION[DOKU_COOKIE]['authgoogle']['info']['mail']);
}
/*Every other case return the same that you sent*/
return $user;
}
}
?>