Merge branch 'dev/task-144514' into feature/doctemplate

This commit is contained in:
daitingting
2025-06-13 01:26:07 +00:00
9 changed files with 166 additions and 7 deletions
+1 -1
View File
@@ -909,7 +909,7 @@ const actionsMap =
const isToolbar = info.ui === 'toolbar';
const actions = [
isToolbar ? {hint: docApp.fullscreen ? lang.exitFullscreen : lang.enterFullscreen, icon: docApp.fullscreen ? 'fullscreen-exit' : 'fullscreen', command: 'toggleFullscreen'} : null,
canEditDoc ? {icon: 'edit', type: 'ghost text-primary', hint: lang.edit, rounded: 'lg', command: 'startEditDoc'} : null,
canEditDoc ? {icon: 'edit', type: doc.editable ? 'ghost text-primary' : 'ghost text-gray', hint: doc.editable ? lang.edit : lang.needEditable, rounded: 'lg', command: doc.editable ? 'startEditDoc' : null} : null,
(isToolbar && docApp.props.showDocOutline !== false) ? {hint: lang.docOutline, icon: 'list-box', command: 'toggleViewSideTab/outline'} : null,
(isToolbar && docApp.props.showDocHistory !== false) ? {hint: lang.history, icon: 'history', command: 'toggleViewSideTab/history'} : null,
moreItems.length ? {icon: 'icon-ellipsis-v', type: 'dropdown', rounded: 'lg', placement: 'bottom-end', caret: false, items: moreItems} : null,
+1
View File
@@ -1195,6 +1195,7 @@ eof;
if($module == 'product' and $method == 'browse' and !empty($this->app->params['storyType']) and $this->app->params['storyType'] != 'story') $method = $this->app->params['storyType'];
if($module == 'productplan' && ($method == 'story' || $method == 'bug')) $method = 'view';
if($module == 'doc' && $method == 'editTemplate') $method = 'createTemplate';
$openMethods = array(
'user' => array('deny', 'logout'),
+49 -2
View File
@@ -10,8 +10,11 @@ title=测试 commonModel::checkPriv();
timeout=0
cid=1
- 用户没有权限时,返回跳转的URL @{"load":"-checkpriv.php?m=user&f=deny&module=user&method=create"}没有权限
- 用户没有权限时,返回跳转的URL @{"load":"user-deny-user-create.html"}没有权限
- 用户没有权限时,返回跳转的URL @{"load":"user-deny-productplan-view.html"}没有权限
- 判断工作流方法的权限,用户没有权限时,返回跳转的URL @{"load":"user-deny-flowModule-flowMethod.html"}没有权限
- 用户有权限时,返回TRUE @1
- 不需要判断权限的,返回TRUE @1
*/
@@ -36,6 +39,36 @@ catch (Exception $e)
r($result) && p() && e('{"load":"user-deny-user-create.html"}没有权限'); // 用户没有权限时,返回跳转的URL
$app->moduleName = 'productplan';
$app->methodName = 'bug';
try
{
$result = $tester->loadModel('common')->checkPriv();
}
catch (Exception $e)
{
$result = '没有权限';
}
r($result) && p() && e('{"load":"user-deny-productplan-view.html"}没有权限'); // 用户没有权限时,返回跳转的URL
$app->isFlow = true;
$app->rawModule = 'flowModule';
$app->rawMethod = 'flowMethod';
try
{
$result = $tester->loadModel('common')->checkPriv();
}
catch (Exception $e)
{
$result = '没有权限';
}
r($result) && p() && e('{"load":"user-deny-flowModule-flowMethod.html"}没有权限'); // 判断工作流方法的权限,用户没有权限时,返回跳转的URL
$app->isFlow = false;
$app->moduleName = 'user';
$app->methodName = 'login';
@@ -50,4 +83,18 @@ catch (Exception $e)
r($result) && p() && e('1'); // 用户有权限时,返回TRUE
unset($_SERVER['HTTP_X_REQUESTED_WITH']);
$app->moduleName = 'block';
$app->methodName = 'dashboard';
try
{
$result = $tester->loadModel('common')->checkPriv();
}
catch (Exception $e)
{
$result = '没有权限';
}
r($result) && p() && e('1'); // 不需要判断权限的,返回TRUE
unset($_SERVER['HTTP_X_REQUESTED_WITH']);
+2 -1
View File
@@ -871,13 +871,14 @@ class docModel extends model
$doc->editable = false;
$isOpen = $doc->acl == 'open';
$isAuthorOrAdmin = $doc->acl == 'private' && ($doc->addedBy == $currentAccount || ($this->app->user->admin && $spaceType !== 'mine'));
$isAuthorOrAdmin = $doc->addedBy == $currentAccount || ($this->app->user->admin && $spaceType !== 'mine');
$isInReadUsers = strpos(",$doc->readUsers,", ",$currentAccount,") !== false;
$isInEditUsers = strpos(",$doc->users,", ",$currentAccount,") !== false;
if($isOpen || $isAuthorOrAdmin || $isInReadUsers || $isInEditUsers)
{
$doc->editable = $isOpen || $isAuthorOrAdmin || $isInEditUsers;
$doc->readable = $isOpen || $isAuthorOrAdmin || $isInReadUsers || $doc->editable;
if($spaceType == 'template') $doc->editable = ($isOpen && common::hasPriv('doc', 'editTemplate')) || $isAuthorOrAdmin || $isInEditUsers;
}
elseif(!empty($doc->groups) || !empty($doc->readGroups))
{
@@ -1832,4 +1832,23 @@ class docTest
$templateName = $this->objectModel->dao->select('title')->from(TABLE_DOC)->where('id')->eq($templateID)->orderBy('id_desc')->fetch('title');
return $templateName == $name;
}
/**
* 设置文档的权限。
* Set document priviledge test.
*
* @param object $doc
* @param string $spaceType
* @access public
* @return object
*/
public function setDocPrivTest(object $doc, string $spaceType = 'mine'): object
{
$doc = $this->objectModel->setDocPriv($doc, $spaceType);
$doc->readable = $doc->readable ? '1' : '0';
$doc->editable = $doc->editable ? '1' : '0';
return $doc;
}
}
+91
View File
@@ -0,0 +1,91 @@
#!/usr/bin/env php
<?php
/**
title=测试 docModel->copyTemplate();
timeout=0
cid=1
- 超级管理员可以查看和编辑自己的文档
- 属性readable @1
- 属性editable @1
- 超级管理员可以查看和编辑其他用户的公共文档
- 属性readable @1
- 属性editable @1
- 作者可以查看和编辑自己的私有文档
- 属性readable @1
- 属性editable @1
- 用户不可以查看和编辑别人的私有文档
- 属性readable @0
- 属性editable @0
- 用户不能编辑不在编辑白名单列表中的别人的私有文档
- 属性readable @1
- 属性editable @0
- 用户可以查看和编辑自己在编辑白名单列表中的别人的私有文档
- 属性readable @1
- 属性editable @1
*/
include dirname(__FILE__, 5) . '/test/lib/init.php';
include dirname(__FILE__, 2) . '/lib/doc.unittest.class.php';
zenData('user')->gen(5);
su('admin');
$doc = new stdclass();
$doc->acl = 'open';
$doc->addedBy = 'admin';
$doc->readUsers = 'admin';
$doc->users = 'admin';
$doc->groups = '';
$doc->readGroups = '1,2';
$docTester = new docTest();
r($docTester->setDocPrivTest($doc, 'team')) && p('readable,editable') && e('1,1'); // 超级管理员可以查看和编辑自己的文档
$doc->acl = 'open';
$doc->addedBy = 'user1';
$doc->readUsers = '';
$doc->users = '';
$doc->groups = '';
$doc->readGroups = '';
r($docTester->setDocPrivTest($doc, 'team')) && p('readable,editable') && e('1,1'); // 超级管理员可以查看和编辑其他用户的公共文档
su('user1');
$doc->acl = 'private';
$doc->addedBy = 'user1';
$doc->readUsers = '';
$doc->users = '';
$doc->groups = '';
$doc->readGroups = '';
r($docTester->setDocPrivTest($doc, 'mine')) && p('readable,editable') && e('1,1'); // 作者可以查看和编辑自己的私有文档
$doc->acl = 'private';
$doc->addedBy = 'user2';
$doc->readUsers = '';
$doc->users = '';
$doc->groups = '';
$doc->readGroups = '';
r($docTester->setDocPrivTest($doc, 'team')) && p('readable,editable') && e('0,0'); // 用户不可以查看和编辑别人的私有文档
$doc->addedBy = 'user2';
$doc->readUsers = 'user1';
$doc->users = '';
$doc->groups = '';
$doc->readGroups = '';
r($docTester->setDocPrivTest($doc, 'team')) && p('readable,editable') && e('1,0'); // 用户不能编辑不在编辑白名单列表中的别人的私有文档
$doc->addedBy = 'user2';
$doc->readUsers = '';
$doc->users = 'user1';
$doc->groups = '';
$doc->readGroups = '';
r($docTester->setDocPrivTest($doc, 'team')) && p('readable,editable') && e('1,1'); // 用户可以查看和编辑自己在编辑白名单列表中的别人的私有文档
+1 -1
View File
@@ -32,7 +32,7 @@ $buildScopeCards = function($templates) use ($lang, $allTemplates)
$deleteLink = createLink('doc', 'deleteTemplate', "templateID=$template->id");
$actions = array();
if(hasPriv('doc', 'editTemplate')) $actions[] = array('icon' => 'edit', 'text' => $this->lang->docTemplate->edit, 'url' => $editLink);
if($template->addedBy == $this->app->user->account || hasPriv('doc', 'editTemplate')) $actions[] = array('icon' => 'edit', 'text' => $this->lang->docTemplate->edit, 'url' => $editLink);
if(hasPriv('doc', 'deleteTemplate')) $actions[] = array('icon' => 'trash', 'text' => $this->lang->docTemplate->delete, 'url' => $deleteLink, 'data-confirm' => $hasChildren ? $this->lang->docTemplate->confirmDeleteTemplateWithSub : $this->lang->docTemplate->confirmDelete);
$cardItems[] = div
+1 -1
View File
@@ -18,7 +18,7 @@ $data['modules'] = $this->doc->getTemplateModules();
$privs = array();
$privs['create'] = hasPriv('doc', 'createTemplate');
$privs['edit'] = hasPriv('doc', 'editTemplate');
$privs['edit'] = hasPriv('doc', 'createTemplate');
$privs['delete'] = hasPriv('doc', 'deleteTemplate');
$privs['view'] = hasPriv('doc', 'viewTemplate');
$privs['addModule'] = hasPriv('doc', 'addTemplateType');
+1 -1
View File
@@ -2960,7 +2960,7 @@ $config->group->package->manageDoctemplate = new stdclass();
$config->group->package->manageDoctemplate->order = 15;
$config->group->package->manageDoctemplate->subset = 'doctemplate';
$config->group->package->manageDoctemplate->privs = array();
$config->group->package->manageDoctemplate->privs['doc-createTemplate'] = array('edition' => 'biz,max,ipd', 'vision' => 'rnd,lite,or', 'order' => 0, 'depend' => array('doc-browseTemplate', 'doc-viewTemplate', 'doc-editTemplate'), 'recommend' => array());
$config->group->package->manageDoctemplate->privs['doc-createTemplate'] = array('edition' => 'biz,max,ipd', 'vision' => 'rnd,lite,or', 'order' => 0, 'depend' => array('doc-browseTemplate', 'doc-viewTemplate'), 'recommend' => array());
$config->group->package->manageDoctemplate->privs['doc-editTemplate'] = array('edition' => 'biz,max,ipd', 'vision' => 'rnd,lite,or', 'order' => 0, 'depend' => array('doc-browseTemplate', 'doc-viewTemplate'), 'recommend' => array('doc-createTemplate', 'doc-moveTemplate'));
$config->group->package->manageDoctemplate->privs['doc-moveTemplate'] = array('edition' => 'biz,max,ipd', 'vision' => 'rnd,lite,or', 'order' => 0, 'depend' => array('doc-browseTemplate', 'doc-viewTemplate'), 'recommend' => array('doc-createTemplate', 'doc-editTemplate'));
$config->group->package->manageDoctemplate->privs['doc-addTemplateType'] = array('edition' => 'biz,max,ipd', 'vision' => 'rnd,lite,or', 'order' => 0, 'depend' => array('doc-browseTemplate', 'doc-editTemplateType'), 'recommend' => array('doc-deleteTemplateType'));