/** * 用户名密码验证流程 * * @param array $inputData */ public function grant(array $inputData) { if (empty($inputData[OpenApi_OAuth_OAuth::PARAM_USERNAME]) || empty($inputData[OpenApi_OAuth_OAuth::PARAM_PASSWORD])) { require_once 'OpenApi/OAuth/Exception.php'; throw new OpenApi_OAuth_Exception("Invalid parameter for grant accessToken by type \"password\"", OpenApi_OAuth_OAuth::ERROR_INVALID_REQUEST); } try { $auth = new Tudu_Auth_Adapter_User(Tudu_Dao_Manager::getDb(Tudu_Dao_Manager::DB_MD)); $auth->setUsername($inputData[OpenApi_OAuth_OAuth::PARAM_USERNAME])->setPassword($inputData[OpenApi_OAuth_OAuth::PARAM_PASSWORD]); $result = $auth->authenticate(); } catch (Tudu_Auth_Adapter_Exception $e) { require_once 'OpenApi/OAuth/Exception.php'; throw new OpenApi_OAuth_Exception("Authorize failed", OpenApi_OAuth_OAuth::ERROR_INVALID_REQUEST); } if (!$result->isValid()) { require_once 'OpenApi/OAuth/Exception.php'; throw new OpenApi_OAuth_Exception("Authorize failed", OpenApi_OAuth_OAuth::ERROR_INVALID_REQUEST); } $identity = $result->getIdentity(); $identity['logintime'] = time(); return array(OpenApi_OAuth_OAuth::PARAM_USER_ID => $inputData[OpenApi_OAuth_OAuth::PARAM_USERNAME], OpenApi_OAuth_OAuth::PARAM_SCOPE => null, 'auth' => $identity); }
/** * 外发会议 * * @param array $params */ public function sendMeeting($params) { if (empty($params['tuduid']) || empty($params['tsid']) || empty($params['uniqueid']) || empty($params['from']) || empty($params['content']) || empty($params['location'])) { return; } $tuduId = $params['tuduid']; $uniqueId = $params['uniqueid']; $tsId = $params['tsid']; $to = !empty($params['to']) ? explode(',', $params['to']) : null; $sender = $params['from']; $content = $params['content']; $location = $params['location']; /* @var $manager Tudu_Tudu_Manager */ $manager = Tudu_Tudu_Manager::getInstance(Tudu_Dao_Manager::getDb(Tudu_Dao_Manager::DB_TS)); $tudu = $manager->getTuduById($tuduId, $uniqueId); if (null == $tudu) { $this->getLogger()->warn("Tudu id:{$tuduId} is not exists"); return; } // 获取接收人 $receivers = $manager->getTuduUsers($tudu->tuduId); $emails = array(); /* @var $daoContact Dao_Td_Contact_Contact */ $daoContact = Tudu_Dao_Manager::getDao('Dao_Td_Contact_Contact', Tudu_Dao_Manager::DB_TS); // 处理接收人数据 foreach ($receivers as $receiver) { $info = explode(' ', $receiver['accepterinfo'], 3); $email = $info[0]; $name = !empty($info[1]) ? $info[1] : null; $contactId = isset($info[2]) ? $info[2] : null; if ($name == null && $email) { $arr = explode('@', $email); $name = array_shift($arr); } if (!$email && !$name) { continue; } if (!empty($to) && !in_array($email, $to)) { continue; } if ($receiver['isforeign']) { $auth = $receiver['authcode']; if (Oray_Function::isEmail($email) && $uniqueId != $receiver['uniqueid']) { $array = array('address' => $email, 'name' => $name, 'authinfo' => '', 'url' => 'http://' . $tudu->orgId . '.com/foreign/tudu?ts=' . $tsId . '&tid=' . $tudu->tuduId . '&fid=' . $receiver['uniqueid']); if ($auth) { $array['authinfo'] = '<p style="margin:10px 0">打开任务链接后需要输入以下验证码:<strong style="color:#f00">' . $auth . '</strong></p>'; } $emails[] = $array; } } } // 执行外发 $tpl = $this->_options['data']['path'] . '/templates/tudu/mail_meeting_notify.tpl'; if (!file_exists($tpl) || !is_readable($tpl)) { $this->getLogger()->warn("Tpl file:\"mail_meeting_notify.tpl\" is not exists"); return; } // 公用信息 $common = array('subject' => $tudu->subject, 'sender' => $sender, 'lastupdate' => date('Y-m-d H:i:s', $tudu->lastPostTime), 'content' => mb_substr(strip_tags($content), 0, 20, 'utf-8'), 'type' => $this->_typeNames[$tudu->type]); $mailTransport = $this->getMailTransport($this->_balancer->select()); $template = $this->_assignTpl(file_get_contents($tpl), $common); foreach ($emails as $email) { try { $mail = new Zend_Mail('utf-8'); $mail->setFrom($this->_options['smtp']['from']['alert'], urldecode($this->_options['smtp']['fromname'])); $mail->addTo($email['address'], $email['name']); $mail->addHeader('tid', $tudu->tuduId); $mail->setSubject("图度{$this->_typeNames[$tudu->type]}——" . $tudu->subject . '[会议提醒]'); $mail->setBodyHtml($this->_assignTpl($template, $email)); $mail->send($mailTransport); } catch (Zend_Mail_Exception $ex) { $this->getLogger()->warn("[Failed] Email send type:{$this->_typeNames[$tudu->type]} TuduId:{$tuduId} retry\n{$ex}"); continue; } } $this->getLogger()->debug("Send Meeting id:{$tuduId} done"); }
/** * 接收参数,通过接口方 OpenApi 进行验证 * 登录图度 */ public function indexAction() { $query = $this->_request->getQuery(); $config = $this->getInvokeArg('bootstrap')->getOptions(); $multidb = $this->getInvokeArg('bootstrap')->getResource('multidb'); $time = time(); Tudu_Dao_Manager::setDbs(array(Tudu_Dao_Manager::DB_TS => $multidb->getDb('ts1'))); // 缺少验证接口标识参数 if (empty($query['from'])) { return $this->_redirect('http://www.tudu.com/'); } $from = $query['from']; $className = 'Model_OpenApi_' . ucfirst($query['from']); $classFile = 'Model/OpenApi/' . ucfirst($query['from']) . '.php'; // 缺少配置参数 if (empty($config['openapi'][strtolower($from)])) { return $this->_redirect('http://www.tudu.com/'); } $params = array_merge($config['openapi'][strtolower($from)], $query); header('P3P: CP=”CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR”'); try { require_once $classFile; // 进行登录验证 call_user_func(array($className, 'auth'), $params); // 查找应用组织关联表 $daoAssociate = Tudu_Dao_Manager::getDao('Dao_Md_Org_Associate', Tudu_Dao_Manager::DB_MD); // 获取用户信息 $params = array_merge($config['openapi'][strtolower($from)], array('uid' => $query['uu_id'])); $userInfo = call_user_func(array($className, 'getUserInfo'), $params); $orgId = $daoAssociate->getOrgIdByUid($from, $userInfo['uid']); if (false === $orgId) { $orgId = $this->_getOrgId($from); // 创建组织 require_once 'Model/Org/Org.php'; Model_Org_Org::setResource('config', $config); Model_Org_Org::createOrg($orgId, array('userid' => 'admin', 'password' => md5(Oray_Function::randKeys(16)), 'truename' => $userInfo['truename'], 'orgname' => $userInfo['orgname'])); // 创建关联 $daoAssociate->createAssociate(array('orgid' => $orgId, 'from' => $from, 'uid' => $userInfo['uid'], 'truename' => $userInfo['truename'], 'email' => $userInfo['email'], 'mobile' => $userInfo['mobile'], 'tel' => $userInfo['tel'], 'createtime' => time())); } // 获取用户信息 $adapter = new Tudu_Auth_Adapter_User(Tudu_Dao_Manager::getDb(Tudu_Dao_Manager::DB_MD)); $adapter->setUsername('admin@' . $orgId)->setAuto(true); $result = $adapter->authenticate(); $names = $config['cookies']; if (!$result->isValid()) { $this->_setCookies(array($names['auth'] => false, $names['username'] => false)); return $this->_redirect('http://www.tudu.com/'); } $identity = $result->getIdentity(); // 登录 if (Zend_Session::isStarted()) { session_unset(); Zend_Session::namespaceUnset(self::SESSION_NAMESPACE); Zend_Session::regenerateId(); } $session = new Zend_Session_Namespace(self::SESSION_NAMESPACE, true); $session->auth = array_merge($identity, array('logintime' => $time)); $session->auth['appinvoker'] = $from; // 验证相关的Cookies $this->_setCookies(array($names['username'] => $identity['username'], $names['server'] => $orgId . '.tudu.com'), null); // 其它场合要用到的Cookies,永久。 $this->_setCookies(array($names['track'] => base64_encode('http://www.tudu.com/login')), $time + 86400 * 365); // 同时要登录后台 $adapter = new Tudu_Auth_Adapter_Admin(array('db' => Tudu_Dao_Manager::getDb(Tudu_Dao_Manager::DB_MD))); $adapter->setUsername($identity['username'])->setAuto(true); $result = $adapter->authenticate(); if ($result->isValid()) { $session->admin = array_merge($result->getIdentity(), array('logintime' => $time)); } // 操作失败 } catch (Exception $e) { return $this->_redirect('http://www.tudu.com/'); } return $this->_redirect('http://online-app.tudu.com/frame-inc/'); }
/** * 获取Dao实例 * * @param string $className * @param Zend_Db_Adapter_Abstract $db * @return Oray_Dao_Abstract */ public function getDao($className, Zend_Db_Adapter_Abstract $db = null) { if (!isset($this->_dao[$className])) { if (null === $db) { $db = Tudu_Dao_Manager::getDb(Tudu_Dao_Manager::TS); } $this->_dao[$className] = Tudu_Dao_Manager::getDao($className, $db); } return $this->_dao[$className]; }
/** * 发送回复 */ public function sendAction() { $params = $this->_request->getParams(); // 处理附件图片 $content = !empty($params['content']) ? nl2br($params['content']) : ''; $attachments = array(); if (isset($params['image'])) { $images = $params['image']; if (!is_array($params['image'])) { $images = explode(',', $images); } foreach ($images as $fileId) { if (!$fileId) { continue; } if (false !== strpos($fileId, ',')) { $arr = explode(',', $fileId); foreach ($arr as $fid) { $attachments[] = $fid; $fid = str_replace('AID:', '', $fid); $content .= '<br /><img src="AID:' . $fid . '" _aid="' . $fid . '" />'; } continue; } $attachments[] = $fileId; $fileId = str_replace('AID:', '', $fileId); $content .= '<br /><img src="AID:' . $fileId . '" _aid="' . $fileId . '" />'; } } $attrs = array('tuduid' => isset($params['tuduid']) ? $params['tuduid'] : null, 'content' => $content, 'percent' => isset($params['percent']) ? max(0, (int) $params['percent']) : null, 'elapsedtime' => isset($params['elapsedtime']) ? (double) $params['elapsedtime'] * 3600 : null); $attrs['header'] = array('client-type' => 'iOS'); if (isset($params['postid'])) { $attrs['postid'] = $params['postid']; } if ((!empty($params['reference']) || !empty($params['reply'])) && !empty($params['tuduid'])) { $refId = !empty($params['reference']) ? $params['reference'] : $params['reply']; $isRef = !empty($params['reference']); $sql = "SELECT post_id AS postid, poster FROM td_post WHERE tudu_id = :tuduid AND is_send = 1 ORDER BY create_time ASC"; $db = Tudu_Dao_Manager::getDb(Tudu_Dao_Manager::DB_TS); $posts = $db->fetchAll($sql, array('tuduid' => $params['tuduid'])); $floor = 0; $poster = null; foreach ($posts as $item) { if ($item['postid'] == $refId) { $poster = $item['poster']; break; } $floor++; } $floorText = $floor == 1 ? '楼主' : $floor . '楼'; if ($poster) { if ($isRef) { $sql = "SELECT content FROM td_post WHERE tudu_id = :tuduid AND post_id = :postid"; $refPost = $db->fetchRow($sql, array('tuduid' => $params['tuduid'], 'postid' => $refId)); if ($refPost) { $refContent = '<div class="cite_wrap">' . '<strong>引用:</strong><span class="floor_f">' . $poster . '</span><a class="floor_f" style="margin-left:5px;" href="javascript:void(0)" _jumpfloor="' . $floor . '|' . $refId . '">' . $floorText . '</a>' . '<div>' . $refPost['content'] . '</div>' . '</div>'; $attrs['content'] = $refContent . $attrs['content']; } } else { $refContent = '<div class="cite_wrap">' . '<p>' . '<strong>回复</strong><a class="floor_f" style="margin:0 5px;" href="javascript:void(0)" _jumpfloor="FLOOR:' . $floor . '|' . $refId . '" _initfloor="' . $floor . '">' . $floorText . '</a> ' . '<span class="floor_f" style="margin-left:5px;">' . $poster . '</span>' . '</p>' . '</div>'; $attrs['content'] = $refContent . $attrs['content']; } } } $modelPost = Tudu_Model::factory('Model_Tudu_Post_Compose'); try { require_once 'Model/Tudu/Post.php'; $post = new Model_Tudu_Post($attrs); if (count($attachments)) { foreach ($attachments as $fid) { $post->addAttachment($fid, false); } } $modelPost->execute('send', array(&$post)); } catch (Model_Tudu_Exception $e) { $code = TuduX_OpenApi_ResponseCode::SYSTEM_ERROR; switch ($e->getCode()) { case Model_Tudu_Exception::TUDU_NOTEXISTS: case Model_Tudu_Exception::POST_NOTEXISTS: $code = TuduX_OpenApi_ResponseCode::RESOURCE_NOT_EXISTS; break; case Model_Tudu_Exception::TUDU_IS_DONE: $code = TuduX_OpenApi_ResponseCode::TUDU_CLOSED; break; case Model_Tudu_Exception::PERMISSION_DENIED: $code = TuduX_OpenApi_ResponseCode::ACCESS_DENIED; break; case Model_Tudu_Exception::MISSING_PARAMETER: $code = TuduX_OpenApi_ResponseCode::MISSING_PARAMETER; break; default: } throw new TuduX_OpenApi_Exception($e->getMessage(), $code); } $this->view->code = TuduX_OpenApi_ResponseCode::SUCCESS; $this->view->postid = $post->postId; }
/** * * @param string $params */ public function deleteUser($params) { list($orgId, $uniqueIds) = explode(':', $params); $daoOrg = Tudu_Dao_Manager::getDao('Dao_Md_Org_Org', Tudu_Dao_Manager::DB_MD); $org = $daoOrg->getOrg(array('orgid' => $orgId)); $tsId = $org->tsid; Tudu_Dao_Manager::setDb(Tudu_Dao_Manager::DB_TS, $this->_tsDbs['ts' . $tsId]); $manager = Tudu_Tudu_Manager::getInstance(Tudu_Dao_Manager::getDb(Tudu_Dao_Manager::DB_TS)); $daoTudu = Tudu_Dao_Manager::getDao('Dao_Td_Tudu_Tudu', Tudu_Dao_Manager::DB_TS); $uniqueIds = explode(',', $uniqueIds); foreach ($uniqueIds as $uniqueId) { $tudus = $daoTudu->getUserTudus(array('uniqueid' => $uniqueId, 'type' => 'task')); if (count($tudus)) { foreach ($tudus as $tudu) { // 确认图度 if ($tudu['role'] == 'from' && $tudu['needconfirm'] && $tudu['percent'] == 100) { $ret = $manager->doneTudu($tudu['tuduid'], true, 0); if (!$ret) { $this->getLogger()->warn("Done Tudu failed id:{$tudu['tuduid']}"); } } // 取消(终止) if ($tudu['role'] == 'from' && $tudu['from'] == $tudu['to']) { $params = array('status' => Dao_Td_Tudu_Tudu::STATUS_CANCEL, 'isdone' => 1); // 更新图度 $ret = $manager->updateTudu($tudu['tuduid'], $params); if (!$ret) { $data = serialize($params); $this->getLogger()->warn("Update Tudu failed id:{$tudu['tuduid']} data:{$data}"); } // 完结图度 $ret = $manager->doneTudu($tudu['tuduid'], true, 0); if (!$ret) { $this->getLogger()->warn("Done Tudu failed id:{$tudu['tuduid']}"); } } // 图度执行人待定 if ($tudu['role'] == 'to') { // 移除执行信息 $ret = $daoTudu->removeAccepter($tudu['tuduid'], $uniqueId); if (!$ret) { $this->getLogger()->warn("Remove Accepter failed Tudu id:{$tudu['tuduid']} uid:{$uniqueId}"); } if ($tudu['to'] == $tudu['accepterinfo']) { // 更新to字段 $ret = $manager->updateTudu($tudu['tuduid'], array('to' => '')); if (!$ret) { $this->getLogger()->warn("Update Tudu failed id:{$tudu['tuduid']} to:[clear]"); } } else { $newto = array(); $to = explode("\n", $tudu['to']); for ($i = 0; $i < count($to); $i++) { if ($to[$i] != $tudu['accepterinfo']) { $newto[] = $to[$i]; } } // 更新to字段 $ret = $manager->updateTudu($tudu['tuduid'], array('to' => implode("\n", $newto))); if (!$ret) { $this->getLogger()->warn("Update Tudu failed id:{$tudu['tuduid']} to:[clear-{$tudu['accepterinfo']}]"); } } } } } $this->getLogger()->debug("Delete User Update Tudu On Uniqueid:{$uniqueId} done"); } }
/** * 更新图度规则 * @param $params */ public function updateRules($params) { if (empty($params['ruleid']) || empty($params['tsid'])) { return; } $ruleId = $params['ruleid']; $manager = Tudu_Tudu_Manager::getInstance(Tudu_Dao_Manager::getDb(Tudu_Dao_Manager::DB_TS)); /** @var $daoRule Dao_Td_Rule_Rule */ $daoRule = Tudu_Dao_Manager::getDao('Dao_Td_Rule_Rule', Tudu_Dao_Manager::DB_TS); $rule = $daoRule->getRuleById($ruleId); if ($rule == null) { $this->getLogger()->warn("Tudu Rule id: {$ruleId} is not exists"); return; } $uniqueId = $rule->uniqueId; $filters = $rule->getFilters()->toArray(); if (count($filters) <= 0) { $this->getLogger()->warn("Tudu Rule->getFilters() null ruleid: {$ruleId} is not exists"); return; } $subject = null; $subjectType = ' LIKE '; foreach ($filters as $key => $filter) { if ($filter['what'] == 'subject') { $subject = $filter['value']; if ($filter['type'] != 'contain') { $subjectType = ' NOT LIKE '; } unset($filters[$key]); break; } } $tsdb = Tudu_Dao_Manager::getDb(Tudu_Dao_Manager::DB_TS); // 过滤现有tudu if ($rule->isValid) { $sql = 'SELECT t.tudu_id AS tuduid, `from`, `to`, `cc`, `subject` FROM td_tudu t ' . 'LEFT JOIN td_tudu_user tu ON t.tudu_id = tu.tudu_id ' . 'WHERE tu.unique_id = ' . $tsdb->quote($uniqueId) . ' AND tu.labels IS NOT NULL '; if ($subject) { $sql .= ' AND t.subject ' . $subjectType . $tsdb->quote('%' . $subject . '%'); } $query = $tsdb->query($sql); while ($row = $query->fetch()) { $match = false; if (count($filters)) { $filterCount = count($filters); $matchCount = 0; // 检查发送人,接收人,抄送人 foreach ($filters as $filter) { $contain = false; if (in_array($filter['what'], array('from', 'to', 'cc'))) { if (is_array($filter['value'])) { $vc = count($filter['value']); $mc = 0; $arr = explode("\n", $row[$filter['what']]); $users = array(); foreach ($arr as $item) { $item = explode(' ', $item); $users[$item[0]] = $item[1]; } foreach ($filter['value'] as $value) { $value = str_replace(array('oray.com', 'tudu.com'), array('oray', ''), $value); if (isset($users[$value])) { if ($filter['what'] == 'from' && $filter['type'] == 'contain') { $matchCount++; continue 2; } $mc++; } } if ($vc == $mc) { $contain = true; } } } elseif ($filter['what'] == 'subject') { $contain = false !== strpos($tudu['subject'], $filter->value); } if ($contain && $filter['type'] == 'contain' || !$contain && $filter['type'] == 'exclusive') { $matchCount++; } } if ($filterCount == $matchCount && $matchCount > 0) { $match = true; } } else { $match = true; } // 匹配过滤条件,执行规则操作 if ($match) { // 标签 if ($rule->operation == 'label') { $manager->addLabel($row['tuduid'], $uniqueId, $rule->value); // 忽略 } elseif ($rule->operation == 'ignore') { $manager->deleteLabel($row['tuduid'], $uniqueId, '^i'); $manager->addLabel($row['tuduid'], $uniqueId, '^g'); // 星标 } elseif ($rule->operation == 'starred') { $manager->addLabel($row['tuduid'], $uniqueId, '^t'); } } } } $this->getLogger()->debug("Rule id:{$ruleId} done"); }
/** * 刷新im服务器缓存 * * @param string $orgId */ protected function _refreshCastCache($orgId) { /* @var $db Zend_Db_Adapter_Abstract */ $db = Tudu_Dao_Manager::getDb(Tudu_Dao_Manager::DB_MD); // 读取所有用户列表 $userSql = "SELECT * FROM ((" . "SELECT u.org_id, u.`status`, u.dept_id, u.user_id, u.unique_id, ui.true_name, ui.pinyin, ui.update_time, 0 AS usertype " . "FROM md_user AS u " . "LEFT JOIN md_user_info AS ui ON u.org_id = ui.org_id AND u.user_id = ui.user_id " . "WHERE u.org_id = :orgid) UNION ALL (" . "SELECT org_id, 1 AS `status`, '' AS dept_id, user_id, unique_id, true_name, pinyin, update_time, 1 AS usertype FROM v_cast_common_user)) AS T"; $users = $db->fetchAll($userSql, array('orgid' => $orgId)); /* // 读取所有部门 $deptSql = "SELECT org_id, dept_id, dept_name, IF(parent_dept_id = '^root', NULL, parent_dept_id) AS parent_dept_id, order_num " . "FROM md_department WHERE org_id = :orgid AND dept_id <> '^root'"; $depts = $db->fetchAll($deptSql, array('orgid' => $orgId)); // 读取组织所有匹配规则 $castUserSql = "SELECT org_id, owner_id, user_id FROM md_cast_disable_user WHERE org_id = :orgid"; $castDeptSql = "SELECT org_id, owner_id, dept_id FROM md_cast_disable_dept WHERE org_id = :orgid"; $res = $db->query($castUserSql, array('orgid' => $orgId)); $castUsers = array(); while (($row = $res->fetch())) { $castUsers[$row['owner_id']][] = $row['user_id']; } $res->closeCursor(); $res = $db->query($castDeptSql, array('orgid' => $orgId)); $castDepts = array(); while (($row = $res->fetch())) { $castDepts[$row['owner_id']][] = $row['dept_id']; } $res->closeCursor(); unset($res); */ // 更新各用户好友列表 foreach ($users as $user) { // 跳过公共用户 if (1 == $user['usertype']) { continue; } /* $d = isset($castDepts[$user['user_id']]) ? $castDepts[$user['user_id']] : array(); $u = isset($castUsers[$user['user_id']]) ? $castUsers[$user['user_id']] : array(); // 更新当前用户部门列表缓存 $contentDepts = array(); foreach ($depts as $dept) { if (in_array($dept['dept_id'], $d)) { continue ; } $str = "<item id='{$dept['dept_id']}' name='{$dept['dept_name']}' orgid='{$dept['org_id']}'"; if (!empty($dept['parent_dept_id'])) { $str .= " parentid='{$dept['parent_dept_id']}'"; } $str .= ' />'; $contentDepts[] = $str; } $contentDepts = '<dept>' . implode('', $contentDepts) . '</dept>'; $this->_memcache->set('im_' . $orgId . '_' . $user['user_id'] . '_depts', $contentDepts, null, null, true); // 更新用户列表缓存 $contentUsers = array(); foreach ($users as $du) { if (in_array($du['user_id'], $u) && 0 == $du['usertype']) { continue ; } $contentUsers[] = "<user userid='{$du['user_id']}' usertype='{$du['usertype']}' orgid='{$du['org_id']}' deptid='{$du['dept_id']}' " . "name='{$du['true_name']}' host='{$du['org_id']}' updatetime='{$du['update_time']}' satus='{$du['status']}' />"; } $contentUsers = '<Roster>' . implode('', $contentUsers) . '</Roster>'; $this->_memcache->set('im_' . $orgId . '_' . $user['user_id'] . '_roster', $contentUsers, null, null, true); $this->_memcache->delete('TUDU-APP-ROLES-' . $user['user_id'] . '@' . $orgId); */ $this->_memcache->delete('im_' . $user['org_id'] . '_' . $user['user_id'] . '_depts'); $this->_memcache->delete('im_' . $user['org_id'] . '_' . $user['user_id'] . '_roster'); $this->getLogger()->debug("refresh cache of {$user['user_id']}@{$orgId}"); //unset($conentDepts, $contentUsers, $d, $u); } //unset($users, $castUsers, $castDepts, $depts); }
/** * 管理员登录流程 * * /login/login-admin */ public function loginAdminAction() { // 未登录前台 if (!$this->_user->isLogined()) { $referer = $this->options['sites']['www']; if (!empty($this->session->auth['referer'])) { $referer = $this->session->auth['referer']; } return $this->referer($referer); } // 非管理员身份 if (!$this->_user->isAdmin() && !$this->_user->isOwner()) { PROTOCOL . '//' . $this->getServer($this->_user->orgId) . '/admin/login/?err=timeout'; } $email = $this->_request->getPost('email'); $password = $this->_request->getPost('password'); $seccode = $this->_request->getPost('seccode'); $error = null; do { if (empty($email)) { $error = 'invalid email'; break; } if (empty($password)) { $error = 'invalid password'; break; } if (empty($seccode)) { $error = 'unvalid seccode'; break; } if (!Oray_Seccode::isValid($seccode, 'adlogin')) { $error = 'invalid seccode'; break; } Oray_Seccode::clear('adlogin'); $adapter = new Tudu_Auth_Adapter_Admin(array('db' => Tudu_Dao_Manager::getDb(Tudu_Dao_Manager::DB_MD))); $adapter->setUsername($email)->setPassword($password); $result = $adapter->authenticate(); if (!$result->isValid()) { $message = $result->getMessages(); $error = isset($message[0]) ? $message[0] : 'failure'; break; } } while (false); if (null !== $error) { return $this->referer(PROTOCOL . '//' . $this->getServer($this->_user->orgId) . '/admin/login/?err=' . $error); } $this->session->admin = array_merge($result->getIdentity(), array('logintime' => time())); //$this->_user->initAdmin($this->session->admin); // 添加登入日志 $daoLog = Tudu_Dao_Manager::getDao('Dao_Md_Log_Oplog', Tudu_Dao_Manager::DB_MD); $clientIp = isset($_SERVER['HTTP_X_REAL_IP']) ? $_SERVER['HTTP_X_REAL_IP'] : $this->_request->getClientIp(); $ret = $daoLog->createAdminLog(array('orgid' => $this->_user->orgId, 'userid' => $this->_user->userId, 'ip' => $clientIp, 'module' => Dao_Md_Log_Oplog::MODULE_LOGIN, 'action' => Dao_Md_Log_Oplog::OPERATION_LOGIN, 'subaction' => null, 'target' => implode(':', array($this->_user->orgId, $this->_user->address, $this->_user->uniqueId)), 'local' => !empty($this->session->auth['local']) ? $this->session->auth['local'] : null, 'detail' => serialize(array('account' => $this->_user->userName)))); return $this->referer(PROTOCOL . '//' . $this->getServer($this->_user->orgId) . '/admin/'); }
/** * 创建组织超级管理员 * * @param array $params */ public function createAdmin(array $params) { //echo 'create admin', "\n"; /* @var $daoUser Dao_Md_User_User */ $daoUser = Tudu_Dao_Manager::getDao('Dao_Md_User_User', Tudu_Dao_Manager::DB_MD); if (empty($params['userid'])) { require_once 'Model/Org/Exception.php'; throw new Model_Org_Exception('Missing or invalid value of parameter "uid"', self::CODE_INVALID_UID); } if (empty($params['orgid'])) { require_once 'Model/Org/Exception.php'; throw new Model_Org_Exception('Missing or invalid value of parameter "orgid"', self::CODE_INVALID_ORGID); } if (empty($params['password'])) { require_once 'Model/Org/Exception.php'; throw new Model_Org_Exception('Missing or invalid value of parameter "password"', self::CODE_INVALID_PWD); } $orgId = $params['orgid']; $userId = $params['userid']; $password = $params['password']; $trueName = $params['truename']; $uniqueId = Dao_Md_User_User::getUniqueId($orgId, $userId); /* @var $daoUser Dao_Md_User_User */ $daoUser = Tudu_Dao_Manager::getDao('Dao_Md_User_User', Tudu_Dao_Manager::DB_MD); /* @var $daoGroup Dao_Md_User_Group */ $daoGroup = Tudu_Dao_Manager::getDao('Dao_Md_User_Group', Tudu_Dao_Manager::DB_MD); /* @var $daoRole Dao_Md_User_Role */ $daoRole = Tudu_Dao_Manager::getDao('Dao_Md_User_Role', Tudu_Dao_Manager::DB_MD); /* @var $daoOrg Dao_Md_Org_Org*/ $daoOrg = Tudu_Dao_Manager::getDao('Dao_Md_Org_Org', Tudu_Dao_Manager::DB_MD); $org = $daoOrg->getOrgById($orgId); if (!$org) { require_once 'Model/Org/Exception.php'; throw new Model_Org_Exception('Org id "' . $orgId . '" not exists', self::CODE_ORG_NOTEXISTS); } // 创建超级管理员用户 $user = array('orgid' => $orgId, 'userid' => $userId, 'uniqueid' => $uniqueId, 'status' => 1, 'isshow' => 1); $userInfo = array('orgid' => $orgId, 'userid' => $userId, 'truename' => $trueName, 'ismd5' => true, 'password' => $password); $ret = $daoUser->createUser($user); if (!$ret) { require_once 'Model/Org/Exception.php'; throw new Model_Org_Exception('Create user data failed', self::CODE_SAVE_FAILED); } $ret = $daoUser->createUserInfo($userInfo); if (!$ret) { require_once 'Model/Org/Exception.php'; throw new Model_Org_Exception('Create user info failed', self::CODE_SAVE_FAILED); } // 添加群组 - 全体员工 $daoGroup->addUser($orgId, '^all', $userId); // 添加权限 - 管理员 $daoRole->addUsers($orgId, '^admin', $userId); // 添加管理员 $daoOrg->addAdmin($orgId, $userId, 'SA', 3); if (!empty($params['email'])) { // 绑定邮箱 $daoUser->createEmail(array('orgid' => $orgId, 'userid' => $userId, 'email' => $params['email'])); } /* @var $daoCast Dao_Md_User_Cast */ $daoCast = Tudu_Dao_Manager::getDao('Dao_Md_User_Cast', Tudu_Dao_Manager::DB_MD); // 看到自己 $daoCast->addUser($orgId, $userId, $userId); // 看到根部门 $daoCast->addDepartment($orgId, $userId, '^root'); // 创建欢迎公告 try { $config = Tudu_Model::getResource('config'); if (!empty($config['path']['data']) || !empty($config['data']['path'])) { $tplFile = !empty($config['path']['data']) ? $config['path']['data'] : $config['data']['path']; $content = @file_get_contents($tplFile . '/templates/tudu/welcome.tpl'); if (!empty($content)) { require_once 'Tudu/Deliver.php'; $deliver = new Tudu_Deliver(Tudu_Dao_Manager::getDb(Tudu_Dao_Manager::DB_TS)); $tudu = array('orgid' => $orgId, 'tuduid' => md5($orgId . '-welcome'), 'boardid' => '^system', 'uniqueid' => '^system', 'type' => 'notice', 'subject' => '欢迎使用图度工作管理系统!!', 'email' => '*****@*****.**', 'from' => '^system 图度系统', 'to' => null, 'cc' => null, 'priority' => 0, 'privacy' => 0, 'issend' => 1, 'status' => Dao_Td_Tudu_Tudu::STATUS_UNSTART, 'content' => $content, 'poster' => '图度系统', 'posterinfo' => '', 'lastposter' => '图度系统', 'lastposttime' => time(), 'createtime' => time(), 'attachment' => array()); $deliver->createTudu($tudu); $deliver->sendTudu($tudu['tuduid'], array()); if (!empty($uniqueId)) { $deliver->addRecipient($tudu['tuduid'], $uniqueId); $deliver->addLabel($tudu['tuduid'], $uniqueId, '^all'); $deliver->addLabel($tudu['tuduid'], $uniqueId, '^i'); $deliver->addLabel($tudu['tuduid'], $uniqueId, '^n'); } } } } catch (Exception $e) { } }