1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-24 21:07:17 +00:00

optimize wiki2 permission (#6108)

This commit is contained in:
JoinTyang
2024-05-23 17:16:44 +08:00
committed by GitHub
parent 1cbea9df17
commit 6c2af87eac
7 changed files with 19 additions and 93 deletions

View File

@@ -4,7 +4,7 @@ import MediaQuery from 'react-responsive';
import { Modal } from 'reactstrap';
import { Utils } from '../../utils/utils';
import wikiAPI from '../../utils/wiki-api';
import { slug, wikiId, siteRoot, initialPath, isDir, sharedToken, hasIndex, lang, isEditWiki, gettext } from '../../utils/constants';
import { slug, wikiId, siteRoot, initialPath, isDir, sharedToken, hasIndex, lang, isWiki2, gettext } from '../../utils/constants';
import Dirent from '../../models/dirent';
import WikiConfig from './models/wiki-config';
import TreeNode from '../../components/tree-view/tree-node';
@@ -46,7 +46,6 @@ class Wiki extends Component {
currentPageId: '',
config: new WikiConfig({}),
repoId: '',
can_edit_file: false,
seadoc_access_token: '',
docUuid: '',
assets_url: '',
@@ -78,7 +77,7 @@ class Wiki extends Component {
}
handlePath = () => {
return isEditWiki ? 'wikis/' : 'published/';
return isWiki2 ? 'wikis/' : 'published/';
};
getWikiConfig = () => {
@@ -222,7 +221,6 @@ class Wiki extends Component {
permission: data.permission,
lastModified: moment.unix(data.last_modified).fromNow(),
latestContributor: data.latest_contributor,
can_edit_file: data.can_edit_file,
seadoc_access_token: data.seadoc_access_token,
assets_url: data.assets_url,
isViewFile: true,
@@ -581,7 +579,7 @@ class Wiki extends Component {
render() {
return (
<div id="main" className="wiki-main">
{/* {isEditWiki &&
{/* {isWiki2 &&
<WikiLeftBar
config={this.state.config}
repoId={this.state.repoId}
@@ -618,7 +616,6 @@ class Wiki extends Component {
onMenuClick={this.onMenuClick}
onSearchedClick={this.onSearchedClick}
onMainNavBarClick={this.onMainNavBarClick}
can_edit_file={this.state.can_edit_file}
seadoc_access_token={this.state.seadoc_access_token}
assets_url={this.state.assets_url}
/>

View File

@@ -1,7 +1,7 @@
import React, { Component, Fragment } from 'react';
import PropTypes from 'prop-types';
import { SdocWikiViewer } from '@seafile/sdoc-editor';
import { gettext, repoID, siteRoot, username, isEditWiki } from '../../utils/constants';
import { gettext, repoID, siteRoot, username, isWiki2 } from '../../utils/constants';
import SeafileMarkdownViewer from '../../components/seafile-markdown-viewer';
import Loading from '../../components/loading';
import { Utils } from '../../utils/utils';
@@ -24,7 +24,6 @@ const propTypes = {
onSearchedClick: PropTypes.func.isRequired,
onMainNavBarClick: PropTypes.func.isRequired,
onLinkClick: PropTypes.func.isRequired,
can_edit_file: PropTypes.bool,
seadoc_access_token: PropTypes.string,
assets_url: PropTypes.string,
};
@@ -87,7 +86,7 @@ class MainPanel extends Component {
};
static getDerivedStateFromProps(props, state) {
const { can_edit_file, seadoc_access_token } = props;
const { seadoc_access_token } = props;
const config = window.app.config;
const pageOptions = window.app.pageOptions;
const { assetsUrl, seadocServerUrl: sdocServer, } = window.wiki.config;
@@ -97,7 +96,6 @@ class MainPanel extends Component {
...pageOptions,
sdocServer,
assetsUrl: assetsUrl || props.assets_url,
can_edit_file,
accessToken: seadoc_access_token,
serviceUrl: config.serviceURL,
assets_url: config.assetsUrl,
@@ -110,9 +108,9 @@ class MainPanel extends Component {
const { content, permission, pathExist, isDataLoading, isViewFile } = this.props;
const isViewingFile = pathExist && !isDataLoading && isViewFile;
const editorContent = content && JSON.parse(content);
const isReadOnly = permission.indexOf('w') === -1 || !window.seafile.can_edit_file;
const isReadOnly = !(permission === 'rw');
return (
<div className="main-panel wiki-main-panel" style={{ flex: isEditWiki ? '1 0 76%' : '1 0 80%' }}>
<div className="main-panel wiki-main-panel" style={{ flex: isWiki2 ? '1 0 76%' : '1 0 80%' }}>
<div className="main-panel-hide hide">{this.props.content}</div>
<div className={`main-panel-north panel-top ${this.props.permission === 'rw' ? 'border-left-show' : ''}`}>
{!username &&

View File

@@ -1,7 +1,7 @@
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import deepCopy from 'deep-copy';
import { gettext, repoID, isEditWiki } from '../../utils/constants';
import { gettext, repoID, isWiki2 } from '../../utils/constants';
import toaster from '../../components/toast';
import Loading from '../../components/loading';
// import TreeView from '../../components/tree-view/tree-view';
@@ -75,7 +75,7 @@ class SidePanel extends Component {
onNodeExpanded={this.props.onNodeExpanded}
/>
)} */}
{isEditWiki &&
{isWiki2 &&
<ViewStructureFooter
onToggleAddView={this.openAddPageDialog}
onToggleAddFolder={this.onToggleAddFolder}
@@ -341,7 +341,7 @@ class SidePanel extends Component {
return (
<div className="wiki-pages-container">
<ViewStructure
isEditMode={isEditWiki}
isEditMode={isWiki2}
navigation={navigation}
views={pages}
onToggleAddView={this.openAddPageDialog}

View File

@@ -121,7 +121,7 @@ export const sharedToken = window.wiki ? window.wiki.config.sharedToken : '';
export const sharedType = window.wiki ? window.wiki.config.sharedType : '';
export const hasIndex = window.wiki ? window.wiki.config.hasIndex : '';
export const assetsUrl = window.wiki ? window.wiki.config.assetsUrl : '';
export const isEditWiki = window.wiki ? window.wiki.config.isEditWiki : false;
export const isWiki2 = window.wiki ? window.wiki.config.isWiki2 : false;
// file history
export const PER_PAGE = 25;

View File

@@ -342,9 +342,7 @@ class Wiki2PageContentView(APIView):
error_msg = "Wiki not found."
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
parent_dir = os.path.dirname(path)
permission = check_folder_permission(request, wiki.repo_id, parent_dir)
permission = check_folder_permission(request, wiki.repo_id, '/')
if not permission:
error_msg = 'Permission denied.'
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
@@ -393,37 +391,7 @@ class Wiki2PageContentView(APIView):
latest_contributor, last_modified = None, 0
assets_url = '/api/v2.1/seadoc/download-image/' + file_uuid
# check file lock info
try:
is_locked, locked_by_me = check_file_lock(wiki.repo_id, path, request.user.username)
except Exception as e:
logger.error(e)
is_locked = False
locked_by_me = False
locked_by_online_office = if_locked_by_online_office(wiki.repo_id, path)
can_edit_file = True
if parse_repo_perm(permission).can_edit_on_web is False:
can_edit_file = False
elif is_locked and not locked_by_me:
can_edit_file = False
if is_pro_version() and can_edit_file:
try:
if not is_locked:
seafile_api.lock_file(wiki.repo_id, path, ONLINE_OFFICE_LOCK_OWNER,
int(time.time()) + 40 * 60)
elif locked_by_online_office:
seafile_api.refresh_file_lock(wiki.repo_id, path,
int(time.time()) + 40 * 60)
except Exception as e:
logger.error(e)
seadoc_perm = 'rw' if can_edit_file else 'r'
filename = os.path.basename(path)
seadoc_access_token = gen_seadoc_access_token(file_uuid, filename, request.user.username, permission=seadoc_perm)
seadoc_access_token = gen_seadoc_access_token(file_uuid, filename, request.user.username, permission=permission)
return Response({
"content": content,
@@ -432,6 +400,5 @@ class Wiki2PageContentView(APIView):
"permission": permission,
"seadoc_server_url": SEADOC_SERVER_URL,
"seadoc_access_token": seadoc_access_token,
"can_edit_file": can_edit_file,
"assets_url": assets_url,
})

View File

@@ -46,13 +46,12 @@
repoId: "{{ wiki.repo_id }}",
repoName: "{{ wiki.name }}",
initial_path: "{{ file_path|escapejs }}",
permission: "{{ user_can_write }}",
isDir: "{{ is_dir }}",
isEditWiki: true,
isWiki2: true,
assetsUrl: "{{ assets_url }}",
seadocServerUrl: "{{ seadoc_server_url }}",
seadocAccessToken: "{{ seadoc_access_token }}",
canEditFile: "{{ can_edit_file }}"
permission: "{{ permission }}",
}
};
</script>

View File

@@ -38,7 +38,8 @@ def wiki_view(request, wiki_id, file_path):
# perm check
req_user = request.user.username
if not can_edit_wiki(wiki, req_user):
permission = check_folder_permission(request, wiki.repo_id, '/')
if not permission:
return render_permission_error(request, 'Permission denied.')
is_dir = None
@@ -55,16 +56,9 @@ def wiki_view(request, wiki_id, file_path):
last_modified = 0
assets_url = ''
seadoc_access_token = ''
can_edit_file = False
file_type, ext = get_file_type_and_ext(posixpath.basename(file_path))
repo = seafile_api.get_repo(wiki.repo_id)
if is_dir is False and file_type == SEADOC:
parent_dir = os.path.dirname(file_path)
permission = check_folder_permission(request, wiki.repo_id, parent_dir)
if not permission:
return render_permission_error(request, 'Permission denied.')
file_uuid = get_seadoc_file_uuid(repo, file_path)
assets_url = '/api/v2.1/seadoc/download-image/' + file_uuid
try:
@@ -74,43 +68,14 @@ def wiki_view(request, wiki_id, file_path):
except Exception as e:
logger.warning(e)
# check file lock info
try:
is_locked, locked_by_me = check_file_lock(wiki.repo_id, file_path, req_user)
except Exception as e:
logger.error(e)
is_locked = False
locked_by_me = False
locked_by_online_office = if_locked_by_online_office(wiki.repo_id, file_path)
can_edit_file = True
if parse_repo_perm(permission).can_edit_on_web is False:
can_edit_file = False
elif is_locked and not locked_by_me:
can_edit_file = False
if is_pro_version() and can_edit_file:
try:
if not is_locked:
seafile_api.lock_file(wiki.repo_id, file_path, ONLINE_OFFICE_LOCK_OWNER,
int(time.time()) + 40 * 60)
elif locked_by_online_office:
seafile_api.refresh_file_lock(wiki.repo_id, file_path,
int(time.time()) + 40 * 60)
except Exception as e:
logger.error(e)
seadoc_perm = 'rw' if can_edit_file else 'r'
filename = os.path.basename(file_path)
seadoc_access_token = gen_seadoc_access_token(file_uuid, filename, req_user, permission=seadoc_perm)
seadoc_access_token = gen_seadoc_access_token(file_uuid, filename, req_user, permission=permission)
last_modified = datetime.fromtimestamp(last_modified)
return render(request, "wiki/wiki_edit.html", {
"wiki": wiki,
"repo_name": repo.name if repo else '',
"user_can_write": True,
"file_path": file_path,
"filename": os.path.splitext(os.path.basename(file_path))[0],
"outlines": outlines,
@@ -121,5 +86,5 @@ def wiki_view(request, wiki_id, file_path):
"assets_url": assets_url,
"seadoc_server_url": SEADOC_SERVER_URL,
"seadoc_access_token": seadoc_access_token,
"can_edit_file": can_edit_file,
"permission": permission,
})