diff --git a/module/admin/control.php b/module/admin/control.php index 545a32bbec..b93727c216 100644 --- a/module/admin/control.php +++ b/module/admin/control.php @@ -158,4 +158,38 @@ class admin extends control $this->view->weakUsers = $this->loadModel('user')->getWeakUsers(); $this->display(); } + + /** + * Config sso for ranzhi. + * + * @access public + * @return void + */ + public function sso() + { + if(!empty($_POST)) + { + $ssoConfig = new stdclass(); + $ssoConfig->turnon = $this->post->turnon; + $ssoConfig->addr = $this->post->addr; + $ssoConfig->code = trim($this->post->code); + $ssoConfig->key = trim($this->post->key); + + $this->loadModel('setting')->setItems('system.sso', $ssoConfig); + if(dao::isError()) die(js::error(dao::getError())); + die($this->locate(inlink('sso'))); + } + + $this->loadModel('sso'); + if(!isset($this->config->sso)) $this->config->sso = new stdclass(); + + $this->view->title = $this->lang->admin->sso; + $this->view->position[] = $this->lang->admin->sso; + + $this->view->turnon = isset($this->config->sso->turnon) ? $this->config->sso->turnon : 1; + $this->view->addr = isset($this->config->sso->addr) ? $this->config->sso->addr : ''; + $this->view->key = isset($this->config->sso->key) ? $this->config->sso->key : ''; + $this->view->code = isset($this->config->sso->code) ? $this->config->sso->code : ''; + $this->display(); + } } diff --git a/module/admin/lang/en.php b/module/admin/lang/en.php index 04da9ca0e5..560315c3fe 100644 --- a/module/admin/lang/en.php +++ b/module/admin/lang/en.php @@ -15,6 +15,7 @@ $lang->admin->checkDB = 'Repair data'; $lang->admin->company = 'Company'; $lang->admin->user = 'User'; $lang->admin->group = 'Group'; +$lang->admin->sso = 'Integrate RanZhi'; $lang->admin->safeIndex = 'Safe'; $lang->admin->checkWeak = 'Check weak'; $lang->admin->welcome = 'Welcome to ZenTaoPMS.'; diff --git a/module/admin/lang/zh-cn.php b/module/admin/lang/zh-cn.php index 7f28554986..8e3ec70476 100644 --- a/module/admin/lang/zh-cn.php +++ b/module/admin/lang/zh-cn.php @@ -15,6 +15,7 @@ $lang->admin->checkDB = '检查数据库'; $lang->admin->company = '公司管理'; $lang->admin->user = '用户管理'; $lang->admin->group = '分组管理'; +$lang->admin->sso = '然之集成'; $lang->admin->safeIndex = '安全'; $lang->admin->checkWeak = '弱口令检查'; $lang->admin->welcome = '欢迎使用禅道管理软件后台管理系统'; diff --git a/module/admin/view/sso.html.php b/module/admin/view/sso.html.php new file mode 100644 index 0000000000..ca5adf0feb --- /dev/null +++ b/module/admin/view/sso.html.php @@ -0,0 +1,47 @@ + + * @package admin + * @version $Id$ + * @link http://www.zentao.net + */ +?> + +
+
+
+ admin->sso;?> + sso->settings;?> +
+
+
+ + + + + + + + + + + + + + + + + + + + +
sso->turnon; ?>sso->turnonList, $turnon);?>
sso->addr; ?>sso->addrNotice}'");?>
sso->code; ?>
sso->key; ?>
+ +
+
+
+ diff --git a/module/block/control.php b/module/block/control.php new file mode 100644 index 0000000000..69caa6f361 --- /dev/null +++ b/module/block/control.php @@ -0,0 +1,174 @@ + + * @package block + * @version $Id$ + * @link http://www.zentao.net + */ +class block extends control +{ + /** + * Main function. + * + * @access public + * @return void + */ + public function main() + { + $lang = $this->get->lang; + $this->app->setClientLang($lang); + $this->app->loadLang('common'); + $this->app->loadLang('block'); + + $mode = strtolower($this->get->mode); + if($mode == 'getblocklist') + { + echo $this->block->getAvailableBlocks(); + } + elseif($mode == 'getblockform') + { + $code = strtolower($this->get->blockid); + $func = 'get' . ucfirst($code) . 'Params'; + echo $this->block->$func(); + } + elseif($mode == 'getblockdata') + { + $code = strtolower($this->get->blockid); + + $params = $this->get->param; + $params = json_decode(base64_decode($params)); + $sso = base64_decode($this->get->sso); + + if(!isset($this->app->user)) $this->app->user = new stdclass(); + if(!isset($this->app->user->account) or $this->app->user->account != $params->account) $this->app->user->account = $params->account; + + $this->params = $params; + $this->view->sso = $sso; + $this->view->sign = strpos($sso, '&') === false ? '?' : '&'; + $this->view->code = $this->get->blockid; + + $func = 'print' . ucfirst($code) . 'Block'; + $this->$func(); + } + } + + /** + * Print todo block. + * + * @access public + * @return void + */ + public function printTodoBlock() + { + $this->view->todos = $this->loadModel('todo')->getList('all', $this->app->user->account, 'wait, doing', $this->params->num); + $this->display(); + } + + /** + * Print task block. + * + * @access public + * @return void + */ + public function printTaskBlock() + { + $this->view->tasks = $this->loadModel('task')->getUserTasks($this->app->user->account, $this->params->type, $this->params->num, null, $this->params->orderBy); + $this->display(); + } + + /** + * Print bug block. + * + * @access public + * @return void + */ + public function printBugBlock() + { + $this->view->bugs = $this->loadModel('bug')->getUserBugs($this->app->user->account, $this->params->type, $this->params->orderBy, $this->params->num); + + $this->display(); + } + + /** + * Print case block. + * + * @access public + * @return void + */ + public function printCaseBlock() + { + $this->app->loadLang('testcase'); + $this->app->loadLang('testtask'); + + $cases = array(); + if($this->params->type == 'assigntome') + { + $cases = $this->dao->select('t1.assignedTo AS assignedTo, t2.*')->from(TABLE_TESTRUN)->alias('t1') + ->leftJoin(TABLE_CASE)->alias('t2')->on('t1.case = t2.id') + ->leftJoin(TABLE_TESTTASK)->alias('t3')->on('t1.task = t3.id') + ->Where('t1.assignedTo')->eq($this->app->user->account) + ->andWhere('t1.status')->ne('done') + ->andWhere('t3.status')->ne('done') + ->andWhere('t3.deleted')->eq(0) + ->andWhere('t2.deleted')->eq(0) + ->orderBy($this->params->orderBy)->limit($this->params->num)->fetchAll(); + } + elseif($this->params->type == 'openedbyme') + { + $cases = $this->dao->findByOpenedBy($this->app->user->account)->from(TABLE_CASE) + ->andWhere('deleted')->eq(0) + ->orderBy($this->params->orderBy)->limit($this->params->num)->fetchAll(); + } + $this->view->cases = $cases; + + $this->display(); + } + + /** + * Print story block. + * + * @access public + * @return void + */ + public function printStoryBlock() + { + $this->app->loadClass('pager', $static = true); + $pager = pager::init(0, $this->params->num, 1); + $this->view->stories = $this->loadModel('story')->getUserStories($this->app->user->account, $this->params->type, $this->params->orderBy, $pager); + $this->display(); + } + + /** + * Print product block. + * + * @access public + * @return void + */ + public function printProductBlock() + { + $this->app->loadClass('pager', $static = true); + $pager = pager::init(0, $this->params->num, 1); + $this->view->productStats = $this->loadModel('product')->getStats('code_asc', $pager); + + $this->display(); + } + + /** + * Print project block. + * + * @access public + * @return void + */ + public function printProjectBlock() + { + $this->app->loadClass('pager', $static = true); + $pager = pager::init(0, $this->params->num, 1); + $this->view->projectStats = $this->loadModel('project')->getProjectStats($status = 'undone', $productID = 0, $itemCounts = 30, $orderBy = 'code', $pager); + + $this->display(); + } +} diff --git a/module/block/lang/en.php b/module/block/lang/en.php new file mode 100644 index 0000000000..78b1bec624 --- /dev/null +++ b/module/block/lang/en.php @@ -0,0 +1,86 @@ + + * @package block + * @version $Id$ + * @link http://www.ranzhi.org + */ +$lang->block = new stdclass(); +$lang->block->num = 'Number'; +$lang->block->type = 'Type'; +$lang->block->orderBy = 'Order'; +$lang->block->status = 'Status'; +$lang->block->actions = 'Action'; + +$lang->block->availableBlocks = new stdclass(); + +$lang->block->availableBlocks->todo = 'My todo'; +$lang->block->availableBlocks->task = 'My task'; +$lang->block->availableBlocks->bug = 'My bug'; +$lang->block->availableBlocks->case = 'My case'; +$lang->block->availableBlocks->story = 'My story'; +$lang->block->availableBlocks->product = $lang->productCommon; +$lang->block->availableBlocks->project = $lang->projectCommon; + +$lang->block->orderByList = new stdclass(); + +$lang->block->orderByList->task = array(); +$lang->block->orderByList->task['id_asc'] = 'ID Increment'; +$lang->block->orderByList->task['id_desc'] = 'ID Decreasing'; +$lang->block->orderByList->task['pri_asc'] = 'Priority Increment'; +$lang->block->orderByList->task['pri_desc'] = 'Priority Decreasing'; +$lang->block->orderByList->task['estimate_asc'] = 'Estimate Increment'; +$lang->block->orderByList->task['estimate_desc'] = 'Estimate Decreasing'; +$lang->block->orderByList->task['status_asc'] = 'Status Increment'; +$lang->block->orderByList->task['status_desc'] = 'Status Decreasing'; +$lang->block->orderByList->task['deadline_asc'] = 'Deadline Increment'; +$lang->block->orderByList->task['deadline_desc'] = 'Deadline Decreasing'; + +$lang->block->orderByList->bug = array(); +$lang->block->orderByList->bug['id_asc'] = 'ID Increment'; +$lang->block->orderByList->bug['id_desc'] = 'ID Decreasing'; +$lang->block->orderByList->bug['pri_asc'] = 'Priority Increment'; +$lang->block->orderByList->bug['pri_desc'] = 'Priority Decreasing'; +$lang->block->orderByList->bug['severity_asc'] = 'Severity Increment'; +$lang->block->orderByList->bug['severity_desc'] = 'Severity Decreasing'; + +$lang->block->orderByList->case = array(); +$lang->block->orderByList->case['id_asc'] = 'ID Increment'; +$lang->block->orderByList->case['id_desc'] = 'ID Decreasing'; +$lang->block->orderByList->case['pri_asc'] = 'Priority Increment'; +$lang->block->orderByList->case['pri_desc'] = 'Priority Decreasing'; + +$lang->block->orderByList->story = array(); +$lang->block->orderByList->story['id_asc'] = 'ID Increment'; +$lang->block->orderByList->story['id_desc'] = 'ID Decreasing'; +$lang->block->orderByList->story['pri_asc'] = 'Priority Increment'; +$lang->block->orderByList->story['pri_desc'] = 'Priority Decreasing'; +$lang->block->orderByList->story['status_asc'] = 'Status Increment'; +$lang->block->orderByList->story['status_desc'] = 'Status Decreasing'; +$lang->block->orderByList->story['stage_asc'] = 'Stage Increment'; +$lang->block->orderByList->story['stage_desc'] = 'Stage Decreasing'; + +$lang->block->typeList = new stdclass(); + +$lang->block->typeList->task['assignedTo'] = 'Assigned to'; +$lang->block->typeList->task['openedBy'] = 'Opened by'; +$lang->block->typeList->task['finishedBy'] = 'Finished by'; +$lang->block->typeList->task['closedBy'] = 'Closed by'; +$lang->block->typeList->task['canceledBy'] = 'Canceled by'; + +$lang->block->typeList->bug['assignedTo'] = 'Assigned to'; +$lang->block->typeList->bug['openedBy'] = 'Opened by'; +$lang->block->typeList->bug['resolvedBy'] = 'Resolved by'; +$lang->block->typeList->bug['closedBy'] = 'Closed by'; + +$lang->block->typeList->case['assigntome'] = 'Assign to me'; +$lang->block->typeList->case['openedbyme'] = 'Opened by me'; + +$lang->block->typeList->story['assignedTo'] = 'Assigned to'; +$lang->block->typeList->story['openedBy'] = 'Opened by'; +$lang->block->typeList->story['reviewedBy'] = 'Reviewed by'; +$lang->block->typeList->story['closedBy'] = 'Closed by'; diff --git a/module/block/lang/zh-cn.php b/module/block/lang/zh-cn.php new file mode 100644 index 0000000000..ec9c7eff25 --- /dev/null +++ b/module/block/lang/zh-cn.php @@ -0,0 +1,86 @@ + + * @package block + * @version $Id$ + * @link http://www.ranzhi.org + */ +$lang->block = new stdclass(); +$lang->block->num = '数量'; +$lang->block->type = '类型'; +$lang->block->orderBy = '排序'; +$lang->block->status = '状态'; +$lang->block->actions = '操作'; + +$lang->block->availableBlocks = new stdclass(); + +$lang->block->availableBlocks->todo = '我的待办'; +$lang->block->availableBlocks->task = '我的任务'; +$lang->block->availableBlocks->bug = '我的Bug'; +$lang->block->availableBlocks->case = '我的用例'; +$lang->block->availableBlocks->story = '我的需求'; +$lang->block->availableBlocks->product = $lang->productCommon . '列表'; +$lang->block->availableBlocks->project = $lang->projectCommon . '列表'; + +$lang->block->orderByList = new stdclass(); + +$lang->block->orderByList->task = array(); +$lang->block->orderByList->task['id_asc'] = 'ID 递增'; +$lang->block->orderByList->task['id_desc'] = 'ID 递减'; +$lang->block->orderByList->task['pri_asc'] = '优先级递增'; +$lang->block->orderByList->task['pri_desc'] = '优先级递减'; +$lang->block->orderByList->task['estimate_asc'] = '预计时间递增'; +$lang->block->orderByList->task['estimate_desc'] = '预计时间递减'; +$lang->block->orderByList->task['status_asc'] = '状态正序'; +$lang->block->orderByList->task['status_desc'] = '状态倒序'; +$lang->block->orderByList->task['deadline_asc'] = '截止日期递增'; +$lang->block->orderByList->task['deadline_desc'] = '截止日期递减'; + +$lang->block->orderByList->bug = array(); +$lang->block->orderByList->bug['id_asc'] = 'ID 递增'; +$lang->block->orderByList->bug['id_desc'] = 'ID 递减'; +$lang->block->orderByList->bug['pri_asc'] = '优先级递增'; +$lang->block->orderByList->bug['pri_desc'] = '优先级递减'; +$lang->block->orderByList->bug['severity_asc'] = '级别递增'; +$lang->block->orderByList->bug['severity_desc'] = '级别递减'; + +$lang->block->orderByList->case = array(); +$lang->block->orderByList->case['id_asc'] = 'ID 递增'; +$lang->block->orderByList->case['id_desc'] = 'ID 递减'; +$lang->block->orderByList->case['pri_asc'] = '优先级递增'; +$lang->block->orderByList->case['pri_desc'] = '优先级递减'; + +$lang->block->orderByList->story = array(); +$lang->block->orderByList->story['id_asc'] = 'ID 递增'; +$lang->block->orderByList->story['id_desc'] = 'ID 递减'; +$lang->block->orderByList->story['pri_asc'] = '优先级递增'; +$lang->block->orderByList->story['pri_desc'] = '优先级递减'; +$lang->block->orderByList->story['status_asc'] = '状态正序'; +$lang->block->orderByList->story['status_desc'] = '状态倒序'; +$lang->block->orderByList->story['stage_asc'] = '阶段正序'; +$lang->block->orderByList->story['stage_desc'] = '阶段倒序'; + +$lang->block->typeList = new stdclass(); + +$lang->block->typeList->task['assignedTo'] = '指派给我'; +$lang->block->typeList->task['openedBy'] = '由我创建'; +$lang->block->typeList->task['finishedBy'] = '由我完成'; +$lang->block->typeList->task['closedBy'] = '由我关闭'; +$lang->block->typeList->task['canceledBy'] = '由我取消'; + +$lang->block->typeList->bug['assignedTo'] = '指派给我'; +$lang->block->typeList->bug['openedBy'] = '由我创建'; +$lang->block->typeList->bug['resolvedBy'] = '由我解决'; +$lang->block->typeList->bug['closedBy'] = '由我关闭'; + +$lang->block->typeList->case['assigntome'] = '指派给我'; +$lang->block->typeList->case['openedbyme'] = '由我创建'; + +$lang->block->typeList->story['assignedTo'] = '指派给我'; +$lang->block->typeList->story['openedBy'] = '由我创建'; +$lang->block->typeList->story['reviewedBy'] = '由我评审'; +$lang->block->typeList->story['closedBy'] = '由我关闭'; diff --git a/module/block/lang/zh-tw.php b/module/block/lang/zh-tw.php new file mode 100644 index 0000000000..ddedfa2b0c --- /dev/null +++ b/module/block/lang/zh-tw.php @@ -0,0 +1,86 @@ + + * @package block + * @version $Id$ + * @link http://www.ranzhi.org + */ +$lang->block = new stdclass(); +$lang->block->num = '數量'; +$lang->block->type = '類型'; +$lang->block->orderBy = '排序'; +$lang->block->status = '狀態'; +$lang->block->actions = '操作'; + +$lang->block->availableBlocks = new stdclass(); + +$lang->block->availableBlocks->todo = '我的待辦'; +$lang->block->availableBlocks->task = '我的任務'; +$lang->block->availableBlocks->bug = '我的Bug'; +$lang->block->availableBlocks->case = '我的用例'; +$lang->block->availableBlocks->story = '我的需求'; +$lang->block->availableBlocks->product = $lang->productCommon . '列表'; +$lang->block->availableBlocks->project = $lang->projectCommon . '列表'; + +$lang->block->orderByList = new stdclass(); + +$lang->block->orderByList->task = array(); +$lang->block->orderByList->task['id_asc'] = 'ID 遞增'; +$lang->block->orderByList->task['id_desc'] = 'ID 遞減'; +$lang->block->orderByList->task['pri_asc'] = '優先順序遞增'; +$lang->block->orderByList->task['pri_desc'] = '優先順序遞減'; +$lang->block->orderByList->task['estimate_asc'] = '預計時間遞增'; +$lang->block->orderByList->task['estimate_desc'] = '預計時間遞減'; +$lang->block->orderByList->task['status_asc'] = '狀態正序'; +$lang->block->orderByList->task['status_desc'] = '狀態倒序'; +$lang->block->orderByList->task['deadline_asc'] = '截止日期遞增'; +$lang->block->orderByList->task['deadline_desc'] = '截止日期遞減'; + +$lang->block->orderByList->bug = array(); +$lang->block->orderByList->bug['id_asc'] = 'ID 遞增'; +$lang->block->orderByList->bug['id_desc'] = 'ID 遞減'; +$lang->block->orderByList->bug['pri_asc'] = '優先順序遞增'; +$lang->block->orderByList->bug['pri_desc'] = '優先順序遞減'; +$lang->block->orderByList->bug['severity_asc'] = '級別遞增'; +$lang->block->orderByList->bug['severity_desc'] = '級別遞減'; + +$lang->block->orderByList->case = array(); +$lang->block->orderByList->case['id_asc'] = 'ID 遞增'; +$lang->block->orderByList->case['id_desc'] = 'ID 遞減'; +$lang->block->orderByList->case['pri_asc'] = '優先順序遞增'; +$lang->block->orderByList->case['pri_desc'] = '優先順序遞減'; + +$lang->block->orderByList->story = array(); +$lang->block->orderByList->story['id_asc'] = 'ID 遞增'; +$lang->block->orderByList->story['id_desc'] = 'ID 遞減'; +$lang->block->orderByList->story['pri_asc'] = '優先順序遞增'; +$lang->block->orderByList->story['pri_desc'] = '優先順序遞減'; +$lang->block->orderByList->story['status_asc'] = '狀態正序'; +$lang->block->orderByList->story['status_desc'] = '狀態倒序'; +$lang->block->orderByList->story['stage_asc'] = '階段正序'; +$lang->block->orderByList->story['stage_desc'] = '階段倒序'; + +$lang->block->typeList = new stdclass(); + +$lang->block->typeList->task['assignedTo'] = '指派給我'; +$lang->block->typeList->task['openedBy'] = '由我創建'; +$lang->block->typeList->task['finishedBy'] = '由我完成'; +$lang->block->typeList->task['closedBy'] = '由我關閉'; +$lang->block->typeList->task['canceledBy'] = '由我取消'; + +$lang->block->typeList->bug['assignedTo'] = '指派給我'; +$lang->block->typeList->bug['openedBy'] = '由我創建'; +$lang->block->typeList->bug['resolvedBy'] = '由我解決'; +$lang->block->typeList->bug['closedBy'] = '由我關閉'; + +$lang->block->typeList->case['assigntome'] = '指派給我'; +$lang->block->typeList->case['openedbyme'] = '由我創建'; + +$lang->block->typeList->story['assignedTo'] = '指派給我'; +$lang->block->typeList->story['openedBy'] = '由我創建'; +$lang->block->typeList->story['reviewedBy'] = '由我評審'; +$lang->block->typeList->story['closedBy'] = '由我關閉'; diff --git a/module/block/model.php b/module/block/model.php new file mode 100644 index 0000000000..817981c728 --- /dev/null +++ b/module/block/model.php @@ -0,0 +1,162 @@ + + * @package block + * @version $Id$ + * @link http://www.zentao.net + */ +class blockModel extends model +{ + /** + * Get block list. + * + * @access public + * @return string + */ + public function getAvailableBlocks() + { + return json_encode($this->lang->block->availableBlocks); + } + + /** + * Get todo params. + * + * @access public + * @return json + */ + public function getTodoParams() + { + return $this->getProductParams(); + } + + /** + * Get task params. + * + * @access public + * @return string + */ + public function getTaskParams() + { + $params = new stdclass(); + $params->type['name'] = $this->lang->block->type; + $params->type['options'] = $this->lang->block->typeList->task; + $params->type['control'] = 'select'; + + $params->num['name'] = $this->lang->block->num; + $params->num['default'] = 20; + $params->num['control'] = 'input'; + + $params->orderBy['name'] = $this->lang->block->orderBy; + $params->orderBy['default'] = 'id_desc'; + $params->orderBy['options'] = $this->lang->block->orderByList->task; + $params->orderBy['control'] = 'select'; + + return json_encode($params); + } + + /** + * Get Bug Params. + * + * @access public + * @return json + */ + public function getBugParams() + { + $params = new stdclass(); + $params->type['name'] = $this->lang->block->type; + $params->type['options'] = $this->lang->block->typeList->bug; + $params->type['control'] = 'select'; + + $params->num['name'] = $this->lang->block->num; + $params->num['default'] = 20; + $params->num['control'] = 'input'; + + $params->orderBy['name'] = $this->lang->block->orderBy; + $params->orderBy['default'] = 'id_desc'; + $params->orderBy['options'] = $this->lang->block->orderByList->bug; + $params->orderBy['control'] = 'select'; + + return json_encode($params); + } + + /** + * Get case params. + * + * @access public + * @return json + */ + public function getCaseParams() + { + $params = new stdclass(); + $params->type['name'] = $this->lang->block->type; + $params->type['options'] = $this->lang->block->typeList->case; + $params->type['control'] = 'select'; + + $params->num['name'] = $this->lang->block->num; + $params->num['default'] = 20; + $params->num['control'] = 'input'; + + $params->orderBy['name'] = $this->lang->block->orderBy; + $params->orderBy['default'] = 'id_desc'; + $params->orderBy['options'] = $this->lang->block->orderByList->case; + $params->orderBy['control'] = 'select'; + + return json_encode($params); + } + + /** + * Get story params. + * + * @access public + * @return json + */ + public function getStoryParams() + { + $params = new stdclass(); + $params->type['name'] = $this->lang->block->type; + $params->type['options'] = $this->lang->block->typeList->story; + $params->type['control'] = 'select'; + + $params->num['name'] = $this->lang->block->num; + $params->num['default'] = 20; + $params->num['control'] = 'input'; + + $params->orderBy['name'] = $this->lang->block->orderBy; + $params->orderBy['default'] = 'id_desc'; + $params->orderBy['options'] = $this->lang->block->orderByList->story; + $params->orderBy['control'] = 'select'; + + return json_encode($params); + } + + /** + * Get product params. + * + * @access public + * @return json + */ + public function getProductParams() + { + $params = new stdclass(); + $params->num['name'] = $this->lang->block->num; + $params->num['default'] = 20; + $params->num['control'] = 'input'; + + return json_encode($params); + } + + /** + * Get project params. + * + * @access public + * @return json + */ + public function getProjectParams() + { + return $this->getProductParams(); + } +} diff --git a/module/block/view/bugblock.html.php b/module/block/view/bugblock.html.php new file mode 100644 index 0000000000..d8e482a877 --- /dev/null +++ b/module/block/view/bugblock.html.php @@ -0,0 +1,32 @@ + + * @package block + * @version $Id$ + * @link http://www.ranzhi.org + */ +?> + + + + + + + + + + + get->entry}'" : ''?> + id}")); ?>' > + + + + + + +
idAB?>bug->severityAB?>priAB?> bug->title;?>
id;?>bug->severityList, $bug->severity, $bug->severity)?>bug->priList, $bug->pri, $bug->pri)?>title?>
+ diff --git a/module/block/view/caseblock.html.php b/module/block/view/caseblock.html.php new file mode 100644 index 0000000000..2c928d7c3d --- /dev/null +++ b/module/block/view/caseblock.html.php @@ -0,0 +1,36 @@ + + * @package block + * @version $Id$ + * @link http://www.ranzhi.org + */ +?> + + + + + + + + + + + + + get->entry}'" : ''?> + id}")); ?>' > + + + + + + + + +
idAB?>priAB?> case->title;?> testtask->lastRunTime;?> testtask->lastRunResult;?>statusAB;?>
id;?>case->priList, $case->pri, $case->pri)?>title?>lastRunDate)) echo date(DT_MONTHTIME1, strtotime($case->lastRunDate));?>lastRunResult) echo $lang->testcase->resultList[$case->lastRunResult];?>testcase->statusList[$case->status];?>
+ diff --git a/module/block/view/main.html.php b/module/block/view/main.html.php new file mode 100644 index 0000000000..8344040598 --- /dev/null +++ b/module/block/view/main.html.php @@ -0,0 +1,13 @@ + + * @package block + * @version $Id$ + * @link http://www.ranzhi.org + */ +include "{$code}block.html.php"; +?> diff --git a/module/block/view/productblock.html.php b/module/block/view/productblock.html.php new file mode 100644 index 0000000000..146dfe2609 --- /dev/null +++ b/module/block/view/productblock.html.php @@ -0,0 +1,42 @@ + + * @package block + * @version $Id$ + * @link http://www.zentao.net + */ +?> + + + + + + + + + + + + + + + + get->entry}'" : "class='text-center'"?> + > + + + + + + + + + + + +
product->name;?>story->statusList['active'];?>story->statusList['changed'];?>story->statusList['draft'];?>product->plans;?>product->releases;?>product->bugs;?>bug->unResolved;?>
name?>stories['active']?>stories['changed']?>stories['draft']?>plans?>releases?>bugs?>unResolved?>
+ diff --git a/module/block/view/projectblock.html.php b/module/block/view/projectblock.html.php new file mode 100644 index 0000000000..52290dde3c --- /dev/null +++ b/module/block/view/projectblock.html.php @@ -0,0 +1,41 @@ + + * @package block + * @version $Id$ + * @link http://www.zentao.net + */ +?> + + + + + + + + + + + + + + + + get->entry}'" : "class='text-center'"?> + > + + + + + + + + + + +
project->name;?>
project->end;?>statusAB;?>project->totalEstimate;?>project->totalConsumed;?>project->totalLeft;?>project->progess;?>
name;?>end;?>project->statusList[$project->status];?>hours->totalEstimate;?>hours->totalConsumed;?>hours->totalLeft;?>hours->progress;?>%
+ diff --git a/module/block/view/storyblock.html.php b/module/block/view/storyblock.html.php new file mode 100644 index 0000000000..b6ca41d65d --- /dev/null +++ b/module/block/view/storyblock.html.php @@ -0,0 +1,36 @@ + + * @package block + * @version $Id$ + * @link http://www.ranzhi.org + */ +?> + + + + + + + + + + + + + get->entry}'" : ''?> + id}")); ?>' > + + + + + + +
idAB?>priAB?> story->title;?>story->estimateAB;?>statusAB;?>story->stageAB;?>
id;?>story->priList, $story->pri, $story->pri)?>title?>estimate?>story->statusList, $story->status, $story->status);?> + story->stageList, $story->stage, $story->stage);?> +
+ diff --git a/module/block/view/taskblock.html.php b/module/block/view/taskblock.html.php new file mode 100644 index 0000000000..4fce9e7594 --- /dev/null +++ b/module/block/view/taskblock.html.php @@ -0,0 +1,39 @@ + + * @package block + * @version $Id$ + * @link http://www.ranzhi.org + */ +?> + + + + + + + + + + + + + + get->entry}'" : ''?> + id}")); ?>' > + + + + + + + +
idAB?>priAB?> task->name;?>task->estimateAB;?>task->deadline;?>statusAB;?>
id;?>task->priList, $task->pri, $task->pri)?>name?>estimate?>'>deadline, 0, 4) > 0) echo $task->deadline;?>task->statusList, $task->status, $task->status);?> +
+ diff --git a/module/block/view/todoblock.html.php b/module/block/view/todoblock.html.php new file mode 100644 index 0000000000..a24b941c28 --- /dev/null +++ b/module/block/view/todoblock.html.php @@ -0,0 +1,34 @@ + + * @package block + * @version $Id$ + * @link http://www.ranzhi.org + */ +?> + + + + + + + + + + + $todo):?> + get->entry}'" : ''?> + id}")); ?>' > + + + + + + + +
todo->date?>priAB?> todo->name;?>todo->beginAB;?>todo->endAB;?>
date == '2030-01-01' ? $lang->todo->periods['future'] : $todo->date;?>todo->priList, $todo->pri, $todo->pri)?>name?>begin?>end?>
+ diff --git a/module/common/lang/en.php b/module/common/lang/en.php index 57a5b23986..559992bf11 100644 --- a/module/common/lang/en.php +++ b/module/common/lang/en.php @@ -288,6 +288,7 @@ $lang->admin->menu->safe = array('link' => 'Safe|admin|safe', 'alias' => 'c $lang->admin->menu->cron = array('link' => 'Cron|cron|index', 'subModule' => 'cron'); $lang->admin->menu->trashes = array('link' => 'Trash|action|trash', 'subModule' => 'action'); $lang->admin->menu->dev = array('link' => 'Develop|dev|api', 'alias' => 'db', 'subModule' => 'dev,editor'); +$lang->admin->menu->sso = 'Integrate RanZhi|admin|sso'; $lang->convert = new stdclass(); $lang->upgrade = new stdclass(); diff --git a/module/common/lang/menuOrder.php b/module/common/lang/menuOrder.php index d3d62d716c..c9c0088771 100644 --- a/module/common/lang/menuOrder.php +++ b/module/common/lang/menuOrder.php @@ -116,7 +116,8 @@ $lang->admin->menuOrder[45] = 'cron'; $lang->admin->menuOrder[50] = 'backup'; $lang->admin->menuOrder[55] = 'dev'; $lang->admin->menuOrder[60] = 'safe'; -$lang->admin->menuOrder[65] = 'trashes'; +$lang->admin->menuOrder[65] = 'sso'; +$lang->admin->menuOrder[70] = 'trashes'; $lang->convert->menuOrder = $lang->admin->menuOrder; $lang->upgrade->menuOrder = $lang->admin->menuOrder; $lang->action->menuOrder = $lang->admin->menuOrder; diff --git a/module/common/lang/zh-cn.php b/module/common/lang/zh-cn.php index 494ce851ae..55086a1d96 100644 --- a/module/common/lang/zh-cn.php +++ b/module/common/lang/zh-cn.php @@ -288,6 +288,7 @@ $lang->admin->menu->safe = array('link' => '安全|admin|safe', 'alias' => $lang->admin->menu->cron = array('link' => '计划任务|cron|index', 'subModule' => 'cron'); $lang->admin->menu->trashes = array('link' => '回收站|action|trash', 'subModule' => 'action'); $lang->admin->menu->dev = array('link' => '二次开发|dev|api', 'alias' => 'db', 'subModule' => 'dev,editor'); +$lang->admin->menu->sso = '然之集成|admin|sso'; $lang->convert = new stdclass(); $lang->upgrade = new stdclass(); diff --git a/module/common/model.php b/module/common/model.php index d3baa83cdc..089ff16418 100644 --- a/module/common/model.php +++ b/module/common/model.php @@ -147,7 +147,10 @@ class commonModel extends model { if($module == 'user' and strpos('login|logout|deny', $method) !== false) return true; if($module == 'api' and $method == 'getsessionid') return true; - if($module == 'misc' and $method == 'ping') return true; + if($module == 'misc' and $method == 'ping') return true; + if($module == 'block' and $method == 'main') return true; + if($module == 'sso' and $method == 'login') return true; + if($module == 'sso' and $method == 'logout') return true; if($this->loadModel('user')->isLogon()) { diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index 6a03222d74..7e33c65c4b 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -725,9 +725,13 @@ $lang->resource->admin->index = 'index'; $lang->resource->admin->checkDB = 'checkDB'; $lang->resource->admin->safe = 'safeIndex'; $lang->resource->admin->checkWeak = 'checkWeak'; +$lang->resource->admin->sso = 'sso'; $lang->admin->methodOrder[0] = 'index'; $lang->admin->methodOrder[5] = 'checkDB'; +$lang->admin->methodOrder[10] = 'safeIndex'; +$lang->admin->methodOrder[15] = 'checkWeak'; +$lang->admin->methodOrder[20] = 'sso'; /* Extension. */ $lang->resource->extension = new stdclass(); @@ -1080,3 +1084,4 @@ $lang->changelog['7.2'][] = 'project-updateOrder'; $lang->changelog['7.3'][] = 'project-fixFirst'; $lang->changelog['7.3'][] = 'productplan-batchEdit'; +$lang->changelog['7.3'][] = 'admin-sso'; diff --git a/module/sso/config.php b/module/sso/config.php new file mode 100644 index 0000000000..b3d9bbc7f3 --- /dev/null +++ b/module/sso/config.php @@ -0,0 +1 @@ + + * @package sso + * @version $Id: control.php 4460 2013-02-26 02:28:02Z chencongzhi520@gmail.com $ + * @link http://www.zentao.net + */ +class sso extends control +{ + /** + * SSO login. + * + * @param string $type + * @access public + * @return void + */ + public function login($type = 'notify') + { + $referer = empty($_GET['referer']) ? '' : $this->get->referer; + $locate = empty($referer) ? '/' : base64_decode($referer); + if($this->loadModel('user')->isLogon()) die($this->locate($locate)); + + $this->app->loadConfig('sso'); + if(!$this->config->sso->turnon) die($this->locate($locate)); + + $userIP = $this->server->remote_addr; + if($type != 'return') + { + $code = $this->config->sso->code; + $token = $this->get->token; + $key = $this->config->sso->key; + $auth = md5($code . $userIP . $token . $key); + + $callback = urlencode(common::getSysURL() . inlink('login', "type=return")); + $location = $this->config->sso->addr; + if(strpos($location, '&') !== false) + { + $location = rtrim($location, '&') . "&token=$token&auth=$auth&userIP=$userIP&callback=$callback&referer=$referer"; + } + else + { + $location = rtrim($location, '?') . "?token=$token&auth=$auth&userIP=$userIP&callback=$callback&referer=$referer"; + } + $this->locate($location); + } + + if($this->get->status == 'success' and md5($this->get->data) == $this->get->md5) + { + $last = $this->server->request_time; + $data = json_decode(base64_decode($this->get->data)); + $user = $this->loadModel('user')->getById($data->account); + if(!$user) + { + $user = new stdclass(); + $user->account = $data->account; + $user->password = $data->password; + $user->realname = $data->realname; + $user->email = $data->email; + $user->visits = 1; + $user->last = $this->server->request_time; + $user->mobile = $data->mobile; + $user->phone = $data->phone; + $user->address = $data->address; + $user->skype = $data->skype; + $user->qq = $data->qq; + $user->birthday = $data->birthday; + $user->gender = $data->gender != 'u' ? $data->gender : 'm'; + + $this->dao->insert(TABLE_USER)->data($user)->exec(); + $user->id = $this->dao->lastInsertID(); + $user->rights = array(); + } + else + { + $this->user->cleanLocked($user->account); + /* Authorize him and save to session. */ + $user->rights = $this->user->authorize($user->account); + $user->groups = $this->user->getGroups($user->account); + $this->dao->update(TABLE_USER)->set('visits = visits + 1')->set('ip')->eq($userIP)->set('last')->eq($last)->where('account')->eq($user->account)->exec(); + } + + $user->last = date(DT_DATETIME1, $last); + $this->session->set('user', $user); + $this->app->user = $this->session->user; + $this->loadModel('action')->create('user', $user->id, 'login'); + die($this->locate($locate)); + } + $this->locate($this->createLink('user', 'login', empty($referer) ? '' : "referer=$referer")); + } + + /** + * SSO logout. + * + * @param string $type + * @access public + * @return void + */ + public function logout($type = 'notify') + { + if($type != 'return') + { + $code = $this->config->sso->code; + $userIP = $this->server->remote_addr; + $token = $this->get->token; + $key = $this->config->sso->key; + $auth = md5($code . $userIP . $token . $key); + + $callback = urlencode($common->getSysURL() . inlink('logout', "type=return")); + $location = $this->config->sso->addr; + if(strpos($location, '&') !== false) + { + $location = rtrim($location, '&') . "&token=$token&auth=$auth&userIP=$userIP&callback=$callback"; + } + else + { + $location = rtrim($location, '?') . "?token=$token&auth=$auth&userIP=$userIP&callback=$callback"; + } + $this->locate($location); + } + + if($this->get->status == 'success') + { + session_destroy(); + setcookie('za', false); + setcookie('zp', false); + $this->locate($this->createLink('user', 'login')); + } + $this->locate($this->createLink('user', 'logout')); + } + + /** + * Ajax set config. + * + * @access public + * @return void + */ + public function ajaxSetConfig() + { + if($_POST) + { + $ssoConfig = new stdclass(); + $ssoConfig->turnon = 1; + $ssoConfig->addr = $this->post->addr; + $ssoConfig->code = trim($this->post->code); + $ssoConfig->key = trim($this->post->key); + + $this->loadModel('setting')->setItems('system.sso', $ssoConfig); + if(dao::isError()) die('fail'); + die('success'); + } + } +} diff --git a/module/sso/lang/en.php b/module/sso/lang/en.php new file mode 100644 index 0000000000..17e8475eb5 --- /dev/null +++ b/module/sso/lang/en.php @@ -0,0 +1,22 @@ + + * @package sso + * @version $Id$ + * @link http://www.zentao.net + */ +$lang->sso = new stdclass(); +$lang->sso->settings = 'Settings'; +$lang->sso->turnon = 'Turnon'; +$lang->sso->code = 'Code'; +$lang->sso->key = 'Key'; +$lang->sso->addr = 'Address'; +$lang->sso->addrNotice = 'Example: http://www.ranzhi.com/sys/sso-check.html'; + +$lang->sso->turnonList = array(); +$lang->sso->turnonList[1] = 'on'; +$lang->sso->turnonList[0] = 'off'; diff --git a/module/sso/lang/zh-cn.php b/module/sso/lang/zh-cn.php new file mode 100644 index 0000000000..a5d4d15c6d --- /dev/null +++ b/module/sso/lang/zh-cn.php @@ -0,0 +1,22 @@ + + * @package sso + * @version $Id$ + * @link http://www.zentao.net + */ +$lang->sso = new stdclass(); +$lang->sso->settings = '配置'; +$lang->sso->turnon = '是否打开'; +$lang->sso->code = '代号'; +$lang->sso->key = '密钥'; +$lang->sso->addr = '接口地址'; +$lang->sso->addrNotice = '比如:http://www.ranzhi.com/sys/sso-check.html'; + +$lang->sso->turnonList = array(); +$lang->sso->turnonList[1] = '打开'; +$lang->sso->turnonList[0] = '关闭'; diff --git a/module/sso/lang/zh-tw.php b/module/sso/lang/zh-tw.php new file mode 100644 index 0000000000..565ca22ccc --- /dev/null +++ b/module/sso/lang/zh-tw.php @@ -0,0 +1,22 @@ + + * @package sso + * @version $Id$ + * @link http://www.zentao.net + */ +$lang->sso = new stdclass(); +$lang->sso->settings = '配置'; +$lang->sso->turnon = '是否打開'; +$lang->sso->code = '代號'; +$lang->sso->key = '密鑰'; +$lang->sso->addr = '介面地址'; +$lang->sso->addrNotice = '比如:http://www.ranzhi.com/sys/sso-check.html'; + +$lang->sso->turnonList = array(); +$lang->sso->turnonList[1] = '打開'; +$lang->sso->turnonList[0] = '關閉'; diff --git a/module/sso/model.php b/module/sso/model.php new file mode 100644 index 0000000000..d8f85c67f9 --- /dev/null +++ b/module/sso/model.php @@ -0,0 +1,4 @@ +