1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-12 04:10:47 +00:00

add via shared link view image url (#2807)

This commit is contained in:
C_Q
2019-01-11 16:40:50 +08:00
committed by Daniel Pan
parent 377681422c
commit 1463ca1723
4 changed files with 80 additions and 5 deletions

View File

@@ -17,7 +17,7 @@ import './assets/css/fa-regular.css';
import './assets/css/fontawesome.css'; import './assets/css/fontawesome.css';
let loginUser = window.app.pageOptions.name; let loginUser = window.app.pageOptions.name;
const { repoID, sharedToken, trafficOverLimit, fileName, fileSize, rawPath, sharedBy, siteName, enableWatermark, download } = window.shared.pageOptions; const { serviceURL, repoID, sharedToken, trafficOverLimit, fileName, fileSize, rawPath, sharedBy, siteName, enableWatermark, download } = window.shared.pageOptions;
class SharedFileViewMarkdown extends React.Component { class SharedFileViewMarkdown extends React.Component {
@@ -99,7 +99,13 @@ class SharedFileViewMarkdown extends React.Component {
</div> </div>
<div className="shared-file-view-body"> <div className="shared-file-view-body">
<div className="md-view"> <div className="md-view">
<MarkdownViewer markdownContent={this.state.markdownContent} showTOC={false} /> <MarkdownViewer markdownContent={this.state.markdownContent}
showTOC={false}
serviceURL={serviceURL}
isShared={true}
sharedToken={sharedToken}
repoID={repoID}
/>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -17,6 +17,7 @@
siteName: '{{ site_name }}', siteName: '{{ site_name }}',
enableWatermark: '{{ enable_watermark }}' == 'True', enableWatermark: '{{ enable_watermark }}' == 'True',
download: '{{ permissions.can_download}}' == 'True', download: '{{ permissions.can_download}}' == 'True',
serviceURL: '{{ serviceUrl }}',
} }
}; };
</script> </script>

View File

@@ -12,7 +12,7 @@ from seahub.views.sso import *
from seahub.views.file import view_history_file, view_trash_file,\ from seahub.views.file import view_history_file, view_trash_file,\
view_snapshot_file, file_edit, view_shared_file, view_file_via_shared_dir,\ view_snapshot_file, file_edit, view_shared_file, view_file_via_shared_dir,\
text_diff, view_raw_file, download_file, view_lib_file, \ text_diff, view_raw_file, download_file, view_lib_file, \
file_access, view_lib_file_via_smart_link file_access, view_lib_file_via_smart_link, view_media_file_via_share_link
from seahub.views.repo import repo_history_view, view_shared_dir, \ from seahub.views.repo import repo_history_view, view_shared_dir, \
view_shared_upload_link, view_lib_as_wiki view_shared_upload_link, view_lib_as_wiki
from notifications.views import notification_list from notifications.views import notification_list
@@ -183,6 +183,7 @@ urlpatterns = [
url(r'^d/(?P<token>[a-f0-9]+)/$', view_shared_dir, name='view_shared_dir'), url(r'^d/(?P<token>[a-f0-9]+)/$', view_shared_dir, name='view_shared_dir'),
url(r'^d/(?P<token>[a-f0-9]+)/files/$', view_file_via_shared_dir, name='view_file_via_shared_dir'), url(r'^d/(?P<token>[a-f0-9]+)/files/$', view_file_via_shared_dir, name='view_file_via_shared_dir'),
url(r'^u/d/(?P<token>[a-f0-9]+)/$', view_shared_upload_link, name='view_shared_upload_link'), url(r'^u/d/(?P<token>[a-f0-9]+)/$', view_shared_upload_link, name='view_shared_upload_link'),
url(r'^media-file-via-share-link/$', view_media_file_via_share_link, name='view_media_file_via_share_link'),
### Misc ### ### Misc ###
url(r'^image-view/(?P<filename>.*)$', image_view, name='image_view'), url(r'^image-view/(?P<filename>.*)$', image_view, name='image_view'),

View File

@@ -19,6 +19,7 @@ import urlparse
import datetime import datetime
from django.core import signing from django.core import signing
from django.core.cache import cache
from django.contrib.sites.shortcuts import get_current_site from django.contrib.sites.shortcuts import get_current_site
from django.contrib import messages from django.contrib import messages
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
@@ -55,8 +56,8 @@ from seahub.utils import render_error, is_org_context, \
user_traffic_over_limit, get_file_audit_events_by_path, \ user_traffic_over_limit, get_file_audit_events_by_path, \
generate_file_audit_event_type, FILE_AUDIT_ENABLED, \ generate_file_audit_event_type, FILE_AUDIT_ENABLED, \
get_conf_text_ext, HAS_OFFICE_CONVERTER, PREVIEW_FILEEXT, \ get_conf_text_ext, HAS_OFFICE_CONVERTER, PREVIEW_FILEEXT, \
normalize_file_path, get_service_url, OFFICE_PREVIEW_MAX_SIZE normalize_file_path, get_service_url, OFFICE_PREVIEW_MAX_SIZE, \
normalize_cache_key
from seahub.utils.ip import get_remote_ip from seahub.utils.ip import get_remote_ip
from seahub.utils.timeutils import utc_to_local from seahub.utils.timeutils import utc_to_local
from seahub.utils.file_types import (IMAGE, PDF, SVG, from seahub.utils.file_types import (IMAGE, PDF, SVG,
@@ -1212,6 +1213,7 @@ def view_shared_file(request, fileshare):
'traffic_over_limit': traffic_over_limit, 'traffic_over_limit': traffic_over_limit,
'permissions': permissions, 'permissions': permissions,
'enable_watermark': ENABLE_WATERMARK, 'enable_watermark': ENABLE_WATERMARK,
'serviceUrl': get_service_url().rstrip('/'),
}) })
@share_link_audit @share_link_audit
@@ -2002,3 +2004,68 @@ def file_access(request, repo_id):
'per_page': per_page, 'per_page': per_page,
'page_next': page_next, 'page_next': page_next,
}) })
def view_media_file_via_share_link(request):
image_path = request.GET.get('path', '')
token = request.GET.get('token', '')
if not image_path or not token:
return HttpResponseBadRequest('invalid params')
file_share = FileShare.objects.get_valid_file_link_by_token(token)
if not file_share:
raise Http404
shared_file_name = os.path.basename(file_share.path)
file_type, _ = get_file_type_and_ext(shared_file_name)
if file_type != MARKDOWN:
raise Http404
# recourse check
repo_id = file_share.repo_id
repo = get_repo(repo_id)
if not repo:
raise Http404
# read file from cache, if hit
cache_key = normalize_cache_key(shared_file_name, token=token)
file_content = cache.get(cache_key)
if not file_content:
# otherwise, read file from database and update cache
file_id = seafile_api.get_file_id_by_path(repo_id, file_share.path)
if not file_id:
return render_error(request, _(u'File does not exist'))
access_token = seafile_api.get_fileserver_access_token(repo_id,
file_id, 'view', '', use_onetime=False)
if not access_token:
return render_error(request, _(u'Unable to view file'))
shared_file_raw_path = gen_inner_file_get_url(access_token, shared_file_name)
_, file_content, _ = repo_file_get(shared_file_raw_path, 'auto')
cache.set(cache_key, file_content, 24 * 60 * 60)
# If the image does not exist in markdown
serviceURL = get_service_url().rstrip('/')
image_file_name = os.path.basename(image_path)
p = re.compile('(%s)/lib/(%s)/file(.*?)%s\?raw=1' % (serviceURL, repo_id, image_file_name))
result = re.search(p, file_content)
if not result:
raise Http404
# get image
obj_id = seafile_api.get_file_id_by_path(repo_id, image_path)
if not obj_id:
return render_error(request, _(u'File does not exist'))
access_token = seafile_api.get_fileserver_access_token(repo_id,
obj_id, 'view', '', use_onetime=False)
dl_or_raw_url = gen_file_get_url(access_token, image_file_name)
return HttpResponseRedirect(dl_or_raw_url)