From 01d1c6560cc15c084da9538a11feea281b9b06ea Mon Sep 17 00:00:00 2001 From: Cameron Date: Wed, 16 Mar 2016 12:05:10 -0700 Subject: [PATCH] XUP: Issue #1378 - Update Username and Avatar if they have changed. --- e107_admin/admin_log.php | 2 +- e107_handlers/admin_log_class.php | 26 +++++++++++++++++---- e107_handlers/user_handler.php | 39 ++++++++++++++++++++++++------- e107_handlers/user_model.php | 36 ++++++++++++++++++++++++---- 4 files changed, 85 insertions(+), 18 deletions(-) diff --git a/e107_admin/admin_log.php b/e107_admin/admin_log.php index f31bb646d..b90a63753 100644 --- a/e107_admin/admin_log.php +++ b/e107_admin/admin_log.php @@ -152,7 +152,7 @@ class admin_log_ui extends e_admin_ui protected $fields = array ( // 'checkboxes' => array ( 'title' => '', 'type' => null, 'data' => null, 'nolist'=>true, 'width' => '5%', 'thclass' => 'center', 'forced' => '1', 'class' => 'center', 'toggle' => 'e-multiselect', ), 'dblog_id' => array ( 'title' => LAN_ID, 'data' => 'int', 'width' => '5%', 'help' => '', 'readParms' => '', 'writeParms' => '', 'class' => 'left', 'thclass' => 'left', ), - 'dblog_datestamp' => array ( 'title' => LAN_DATESTAMP, 'type' => 'datestamp', 'data' => 'int', 'width' => '12%', 'filter' => true, 'help' => '', 'readParms' => '', 'writeParms' => '', 'class' => 'left', 'thclass' => 'left', ), + 'dblog_datestamp' => array ( 'title' => LAN_DATESTAMP, 'type' => 'datestamp', 'data' => 'int', 'width' => '12%', 'filter' => true, 'help' => '', 'readParms' => array('mask'=>'dd MM yyyy hh:ii:ss'), 'writeParms' => '', 'class' => 'left', 'thclass' => 'left', ), // 'dblog_microtime' => array ( 'title' => 'Microtime', 'type' => 'method', 'data' => 'int', 'width' => 'auto', 'help' => '', 'readParms' => '', 'writeParms' => '', 'class' => 'center', 'thclass' => 'center', ), 'dblog_type' => array ( 'title' => RL_LAN_032, 'type' => 'method', 'data' => 'int', 'width' => '5%', 'filter' => true, 'help' => '', 'readParms' => '', 'writeParms' => '', 'class' => 'center', 'thclass' => 'center', ), 'dblog_ip' => array ( 'title' => LAN_IP, 'type' => 'ip', 'data' => 'str', 'width' => 'auto', 'help' => '', 'readParms' => '', 'writeParms' => '', 'class' => 'left', 'thclass' => 'left', ), diff --git a/e107_handlers/admin_log_class.php b/e107_handlers/admin_log_class.php index 6dc8a3693..23829acc8 100644 --- a/e107_handlers/admin_log_class.php +++ b/e107_handlers/admin_log_class.php @@ -143,6 +143,7 @@ class e_admin_log * @param integer $event_type [optional] Log level eg. E_LOG_INFORMATIVE, E_LOG_NOTICE, E_LOG_WARNING, E_LOG_FATAL * @param string $event_code [optional] - eg. 'BOUNCE' * @param integer $target [optional] LOG_TO_ADMIN, LOG_TO_AUDIT, LOG_TO_ROLLING + * @param array $user - user to attribute the log to. array('user_id'=>2, 'user_name'=>'whoever'); * @return e_admin_log * * Alternative admin log entry point - compatible with legacy calls, and a bit simpler to use than the generic entry point. @@ -157,7 +158,7 @@ class e_admin_log * */ - public function add($event_title, $event_detail, $event_type = E_LOG_INFORMATIVE , $event_code = '', $target = LOG_TO_ADMIN ) + public function add($event_title, $event_detail, $event_type = E_LOG_INFORMATIVE , $event_code = '', $target = LOG_TO_ADMIN, $userData=null ) { if ($event_code == '') { @@ -203,7 +204,7 @@ class e_admin_log } - $this->e_log_event($event_type, -1, $event_code, $event_title, $event_detail, FALSE, $target); + $this->e_log_event($event_type, -1, $event_code, $event_title, $event_detail, FALSE, $target, $userData); return $this; } @@ -231,12 +232,13 @@ class e_admin_log * LOG_TO_ADMIN - admin log * LOG_TO_AUDIT - audit log * LOG_TO_ROLLING - rolling log - * + * @param array $userData - attribute user to log entry. array('user_id'=>2, 'user_name'=>'whatever'); * @return none * @todo - check microtime() call + * @deprecated - use add() method instead. */ - public function e_log_event($importance, $source_call, $eventcode = "GEN", $event_title = "Untitled", $explain = "", $finished = FALSE, $target_logs = LOG_TO_AUDIT ) + public function e_log_event($importance, $source_call, $eventcode = "GEN", $event_title = "Untitled", $explain = "", $finished = FALSE, $target_logs = LOG_TO_AUDIT, $userData=null ) { $e107 = e107::getInstance(); $pref = e107::getPref(); @@ -256,10 +258,26 @@ class e_admin_log //--------------------------------------- // Calculations common to all logs //--------------------------------------- + $userid = deftrue('USER') ? USERID : 0; $userstring = deftrue('USER') ? USERNAME : 'LAN_ANONYMOUS'; $userIP = e107::getIPHandler()->getIP(FALSE); + if(!empty($userData['user_id'])) + { + $userid = $userData['user_id']; + } + + if(!empty($userData['user_name'])) + { + $userstring = $userData['user_name']; + } + + if(!empty($userData['user_ip'])) + { + $userIP = $userData['user_ip']; + } + $importance = $tp->toDB($importance, true, false, 'no_html'); $eventcode = $tp->toDB($eventcode, true, false, 'no_html'); diff --git a/e107_handlers/user_handler.php b/e107_handlers/user_handler.php index 58f86e08a..98aca3f0a 100644 --- a/e107_handlers/user_handler.php +++ b/e107_handlers/user_handler.php @@ -947,7 +947,13 @@ class e_user_provider } } } - + + private function log($class,$method,$line) + { + // e107::getLog()->add('XUP Debug', ($class.':'.$method.'-'.$line), E_LOG_INFORMATIVE, "XUP_DEBUG"); + } + + public function setBackUrl($url) { # system/xup/endpoint by default @@ -956,6 +962,7 @@ class e_user_provider public function getProvider() { + // $this->log(__CLASS__, __METHOD__, __LINE__); return $this->_provider; } @@ -975,6 +982,7 @@ class e_user_provider public function userId() { + if($this->adapter && $this->adapter->getUserProfile()->identifier) { return $this->getProvider().'_'.$this->adapter->getUserProfile()->identifier; @@ -1009,7 +1017,8 @@ class e_user_provider $redirectUrl = e107::getUrl()->create($redirectUrl); } } - + + if(e107::getUser()->isUser()) { if($redirectUrl) @@ -1022,14 +1031,17 @@ class e_user_provider $this->adapter = $this->hybridauth->authenticate($this->getProvider()); $profile = $this->adapter->getUserProfile(); - + + $this->log(__CLASS__, __METHOD__, __LINE__); // returned back, if success... if($profile->identifier) { + $sql = e107::getDb(); $userMethods = e107::getUserSession(); $plainPwd = $userMethods->generateRandomString('************'); // auto plain passwords + // TODO - auto login name, shouldn't be used if system set to user_email login... $userdata['user_loginname'] = $this->getProvider().$userMethods->generateUserLogin(e107::getPref('predefinedLoginName', '_..#..#..#')); @@ -1064,11 +1076,14 @@ class e_user_provider // user_name, user_xup, user_email and user_loginname shouldn't match $insert = (!empty($userdata['user_email'])) ? "OR user_email='".$userdata['user_email']."' " : ""; + + $this->log(__CLASS__, __METHOD__, __LINE__); - if($sql->count("user", "(*)", "user_xup='".$sql->escape($this->userId())."' ".$insert." OR user_loginname='{$userdata['user_loginname']}' OR user_name='{$userdata['user_name']}'")) + if($uid = $sql->retrieve("user", "user_id", "user_xup='".$sql->escape($this->userId())."' ".$insert." OR user_loginname='{$userdata['user_loginname']}' OR user_name='{$userdata['user_name']}'")) { // $this->login($redirectUrl); // auto-login e107::getUser()->loginProvider($this->userId()); + if($redirectUrl) { e107::getRedirect()->redirect($redirectUrl); @@ -1080,7 +1095,8 @@ class e_user_provider if(empty($userdata['user_email']) && e107::getPref('disable_emailcheck', 0)==0) // Allow it if set-up that way. { - throw new Exception( "Signup failed! Can't access user email - registration without an email is impossible.".print_a($userdata,true), 4); // TODO lan + // Twitter will not provide email addresses. + // throw new Exception( "Signup failed! Can't access user email - registration without an email is impossible.".print_a($userdata,true), 4); // TODO lan } // other fields @@ -1108,9 +1124,11 @@ class e_user_provider // user model error if($user->hasError()) { + e107::getLog()->add('XUP Signup Failure', $userdata, E_LOG_WARNING, "XUP_SIGNUP"); throw new Exception($user->renderMessages(), 5); } + ### Successful signup! //$user->set('provider', $this->getProvider()); $userdata = $user->getData(); @@ -1125,7 +1143,7 @@ class e_user_provider if(true === $ret) return $this; // send email - if($emailAfterSuccess) + if($emailAfterSuccess && !empty($userdata['user_email'])) { $user->set('user_password', $plainPwd)->email('signup'); } @@ -1146,6 +1164,8 @@ class e_user_provider return true; } + $this->log(__CLASS__, __METHOD__, __LINE__); + return false; } @@ -1153,6 +1173,7 @@ class e_user_provider public function login($redirectUrl = true) { + if(!e107::getPref('social_login_active', false)) { throw new Exception( "Signup failed! This feature is disabled.", 100); // TODO lan @@ -1174,7 +1195,8 @@ class e_user_provider $redirectUrl = e107::getUrl()->create($redirectUrl); } } - + + if(e107::getUser()->isUser()) { if($redirectUrl) @@ -1186,7 +1208,8 @@ class e_user_provider $this->adapter = $this->hybridauth->authenticate($this->getProvider()); $check = e107::getUser()->setProvider($this)->loginProvider($this->userId(), false); - + + if($redirectUrl) { e107::getRedirect()->redirect($redirectUrl); diff --git a/e107_handlers/user_model.php b/e107_handlers/user_model.php index 2d9bd8035..b9d627520 100644 --- a/e107_handlers/user_model.php +++ b/e107_handlers/user_model.php @@ -1557,7 +1557,9 @@ class e_user extends e_user_model $userlogin = new userlogin(); $userlogin->login($xup, '', 'provider', false, true); - $userdata = $userlogin->getUserData(); + $userdata = $userlogin->getUserData(); + + e107::getLog()->add('XUP Debug', (__CLASS__.':'.__METHOD__.'-'.__LINE__), E_LOG_INFORMATIVE, "XUP_DEBUG"); $this->setSessionData(true)->setData($userdata); @@ -1681,21 +1683,45 @@ class e_user extends e_user_model // query DB $sql = e107::getDb(); $where = array(); + $userdata = array(); + foreach ($connected as $providerId) { $adapter = Hybrid_Auth::getAdapter($providerId); if(!$adapter->getUserProfile()->identifier) continue; - - $id = $providerId.'_'.$adapter->getUserProfile()->identifier; + + $profile = $adapter->getUserProfile(); + + $userdata['user_name'] = $sql->escape($profile->displayName); + $userdata['user_image'] = $profile->photoURL; // avatar + + $id = $providerId.'_'.$profile->identifier; $where[] = "user_xup='".$sql->escape($id)."'"; } + + $where = implode(' OR ', $where); - if($sql->db_Select('user', 'user_id, user_password, user_xup', $where)) + if($sql->select('user', 'user_id, user_password, user_xup', $where)) { - $user = $sql->db_Fetch(); + + $user = $sql->fetch(); e107::getUserSession()->makeUserCookie($user); $this->setSessionData(); + + // Update display name or avatar image if they have changed. + if(($userdata['user_name'] != $user['user_name']) || ($userdata['user_image'] != $user['user_image'])) + { + + if($sql->update('user', "user_name='".$userdata['user_name']."', user_image='".$userdata['user_image']."' WHERE user_id=".$user['user_id']." LIMIT 1")!==false) + { + e107::getLog()->add('User Profile Updated', $userdata, E_LOG_INFORMATIVE, "XUP_LOGIN", LOG_TO_ADMIN, array('user_id'=>$user['user_id'],'user_name'=>$user['user_name'])); + } + else + { + e107::getLog()->add('User Profile Update Failed', $userdata, E_LOG_WARNING, "XUP_LOGIN", LOG_TO_ADMIN, array('user_id'=>$user['user_id'],'user_name'=>$user['user_name'])); + } + } } return $this;