Make file actions permissions aware
This commit is contained in:
parent
6f58eca534
commit
4d17ed2f71
|
@ -75,7 +75,7 @@ Calendar_Import={
|
|||
}
|
||||
$(document).ready(function(){
|
||||
if(typeof FileActions !== 'undefined'){
|
||||
FileActions.register('text/calendar','importcal', '', Calendar_Import.importdialog);
|
||||
FileActions.register('text/calendar','importcal', FileActions.PERMISSION_READ, '', Calendar_Import.importdialog);
|
||||
FileActions.setDefault('text/calendar','importcal');
|
||||
};
|
||||
});
|
||||
|
|
|
@ -78,9 +78,9 @@ Contacts_Import={
|
|||
}
|
||||
$(document).ready(function(){
|
||||
if(typeof FileActions !== 'undefined'){
|
||||
FileActions.register('text/vcard','importaddressbook', '', Contacts_Import.importdialog);
|
||||
FileActions.register('text/vcard','importaddressbook', FileActions.PERMISSION_READ, '', Contacts_Import.importdialog);
|
||||
FileActions.setDefault('text/vcard','importaddressbook');
|
||||
FileActions.register('text/x-vcard','importaddressbook', '', Contacts_Import.importdialog);
|
||||
FileActions.register('text/x-vcard','importaddressbook', FileActions.PERMISSION_READ, '', Contacts_Import.importdialog);
|
||||
FileActions.setDefault('text/x-vcard','importaddressbook');
|
||||
};
|
||||
});
|
|
@ -1,19 +1,28 @@
|
|||
FileActions={
|
||||
PERMISSION_CREATE:4,
|
||||
PERMISSION_READ:1,
|
||||
PERMISSION_UPDATE:2,
|
||||
PERMISSION_DELETE:8,
|
||||
PERMISSION_SHARE:16,
|
||||
actions:{},
|
||||
defaults:{},
|
||||
icons:{},
|
||||
currentFile:null,
|
||||
register:function(mime,name,icon,action){
|
||||
register:function(mime,name,permissions,icon,action){
|
||||
if(!FileActions.actions[mime]){
|
||||
FileActions.actions[mime]={};
|
||||
}
|
||||
FileActions.actions[mime][name]=action;
|
||||
if (!FileActions.actions[mime][name]) {
|
||||
FileActions.actions[mime][name] = {};
|
||||
}
|
||||
FileActions.actions[mime][name]['action'] = action;
|
||||
FileActions.actions[mime][name]['permissions'] = permissions;
|
||||
FileActions.icons[name]=icon;
|
||||
},
|
||||
setDefault:function(mime,name){
|
||||
FileActions.defaults[mime]=name;
|
||||
},
|
||||
get:function(mime,type){
|
||||
get:function(mime,type,permissions){
|
||||
var actions={};
|
||||
if(FileActions.actions.all){
|
||||
actions=$.extend( actions, FileActions.actions.all )
|
||||
|
@ -32,9 +41,15 @@ FileActions={
|
|||
actions=$.extend( actions, FileActions.actions[type] )
|
||||
}
|
||||
}
|
||||
return actions;
|
||||
var filteredActions = {};
|
||||
$.each(actions, function(name, action) {
|
||||
if (action.permissions & permissions) {
|
||||
filteredActions[name] = action.action;
|
||||
}
|
||||
});
|
||||
return filteredActions;
|
||||
},
|
||||
getDefault:function(mime,type){
|
||||
getDefault:function(mime,type,permissions){
|
||||
if(mime){
|
||||
var mimePart=mime.substr(0,mime.indexOf('/'));
|
||||
}
|
||||
|
@ -48,22 +63,20 @@ FileActions={
|
|||
}else{
|
||||
name=FileActions.defaults.all;
|
||||
}
|
||||
var actions=this.get(mime,type);
|
||||
var actions=this.get(mime,type,permissions);
|
||||
return actions[name];
|
||||
},
|
||||
display:function(parent, filename, type){
|
||||
display:function(parent){
|
||||
FileActions.currentFile=parent;
|
||||
$('#fileList span.fileactions, #fileList td.date a.action').remove();
|
||||
var actions=FileActions.get(FileActions.getCurrentMimeType(),FileActions.getCurrentType());
|
||||
var actions=FileActions.get(FileActions.getCurrentMimeType(),FileActions.getCurrentType(), FileActions.getCurrentPermissions());
|
||||
var file=FileActions.getCurrentFile();
|
||||
if($('tr').filterAttr('data-file',file).data('renaming')){
|
||||
return;
|
||||
}
|
||||
parent.children('a.name').append('<span class="fileactions" />');
|
||||
var defaultAction=FileActions.getDefault(FileActions.getCurrentMimeType(),FileActions.getCurrentType());
|
||||
var defaultAction=FileActions.getDefault(FileActions.getCurrentMimeType(),FileActions.getCurrentType(), FileActions.getCurrentPermissions());
|
||||
for(name in actions){
|
||||
// no rename and share action for the 'Shared' dir
|
||||
if((name=='Rename' || name =='Share') && type=='dir' && filename=='Shared') { continue; }
|
||||
if((name=='Download' || actions[name]!=defaultAction) && name!='Delete'){
|
||||
var img=FileActions.icons[name];
|
||||
if(img.call){
|
||||
|
@ -86,16 +99,12 @@ FileActions={
|
|||
parent.find('a.name>span.fileactions').append(element);
|
||||
}
|
||||
}
|
||||
if(actions['Delete'] && (type!='dir' || filename != 'Shared')){ // no delete action for the 'Shared' dir
|
||||
if(actions['Delete']){
|
||||
var img=FileActions.icons['Delete'];
|
||||
if(img.call){
|
||||
img=img(file);
|
||||
}
|
||||
if ($('#dir').val().indexOf('Shared') != -1) {
|
||||
var html='<a href="#" original-title="' + t('files', 'Unshare') + '" class="action delete" style="display:none" />';
|
||||
} else {
|
||||
var html='<a href="#" original-title="' + t('files', 'Delete') + '" class="action delete" style="display:none" />';
|
||||
}
|
||||
var html='<a href="#" original-title="' + t('files', 'Delete') + '" class="action delete" style="display:none" />';
|
||||
var element=$(html);
|
||||
if(img){
|
||||
element.append($('<img src="'+img+'"/>'));
|
||||
|
@ -131,6 +140,9 @@ FileActions={
|
|||
},
|
||||
getCurrentType:function(){
|
||||
return FileActions.currentFile.parent().attr('data-type');
|
||||
},
|
||||
getCurrentPermissions:function() {
|
||||
return FileActions.currentFile.parent().data('permissions');
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -140,12 +152,12 @@ $(document).ready(function(){
|
|||
} else {
|
||||
var downloadScope = 'file';
|
||||
}
|
||||
FileActions.register(downloadScope,'Download',function(){return OC.imagePath('core','actions/download')},function(filename){
|
||||
FileActions.register(downloadScope,'Download', FileActions.PERMISSION_READ, function(){return OC.imagePath('core','actions/download')},function(filename){
|
||||
window.location=OC.filePath('files', 'ajax', 'download.php') + encodeURIComponent('?files='+encodeURIComponent(filename)+'&dir='+encodeURIComponent($('#dir').val()));
|
||||
});
|
||||
});
|
||||
|
||||
FileActions.register('all','Delete',function(){return OC.imagePath('core','actions/delete')},function(filename){
|
||||
FileActions.register('all','Delete', FileActions.PERMISSION_DELETE, function(){return OC.imagePath('core','actions/delete')},function(filename){
|
||||
if(Files.cancelUpload(filename)) {
|
||||
if(filename.substr){
|
||||
filename=[filename];
|
||||
|
@ -162,11 +174,11 @@ FileActions.register('all','Delete',function(){return OC.imagePath('core','actio
|
|||
}
|
||||
});
|
||||
|
||||
FileActions.register('all','Rename',function(){return OC.imagePath('core','actions/rename')},function(filename){
|
||||
FileActions.register('all','Rename', FileActions.PERMISSION_UPDATE, function(){return OC.imagePath('core','actions/rename')},function(filename){
|
||||
FileList.rename(filename);
|
||||
});
|
||||
|
||||
FileActions.register('dir','Open','',function(filename){
|
||||
FileActions.register('dir','Open', FileActions.PERMISSION_READ, '', function(filename){
|
||||
window.location=OC.linkTo('files', 'index.php') + '&dir='+encodeURIComponent($('#dir').val()).replace(/%2F/g, '/')+'/'+encodeURIComponent(filename);
|
||||
});
|
||||
|
||||
|
|
|
@ -56,7 +56,7 @@ $(document).ready(function() {
|
|||
|
||||
// Sets the file-action buttons behaviour :
|
||||
$('tr').live('mouseenter',function(event) {
|
||||
FileActions.display($(this).children('td.filename'), $(this).attr('data-file'), $(this).attr('data-type'));
|
||||
FileActions.display($(this).children('td.filename'));
|
||||
});
|
||||
$('tr').live('mouseleave',function(event) {
|
||||
FileActions.hide();
|
||||
|
@ -106,7 +106,8 @@ $(document).ready(function() {
|
|||
if(!renaming && !FileList.isLoading(filename)){
|
||||
var mime=$(this).parent().parent().data('mime');
|
||||
var type=$(this).parent().parent().data('type');
|
||||
var action=FileActions.getDefault(mime,type);
|
||||
var permissions = $(this).parent().parent().data('permissions');
|
||||
var action=FileActions.getDefault(mime,type, permissions);
|
||||
if(action){
|
||||
action(filename);
|
||||
}
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
<?php foreach($_['files'] as $file):
|
||||
$write = ($file['writable']) ? 'true' : 'false';
|
||||
$simple_file_size = OCP\simple_file_size($file['size']);
|
||||
$simple_size_color = intval(200-$file['size']/(1024*1024)*2); // the bigger the file, the darker the shade of grey; megabytes*2
|
||||
if($simple_size_color<0) $simple_size_color = 0;
|
||||
|
@ -10,7 +9,7 @@
|
|||
$name = str_replace('%2F','/', $name);
|
||||
$directory = str_replace('+','%20',urlencode($file['directory']));
|
||||
$directory = str_replace('%2F','/', $directory); ?>
|
||||
<tr data-file="<?php echo $name;?>" data-type="<?php echo ($file['type'] == 'dir')?'dir':'file'?>" data-mime="<?php echo $file['mimetype']?>" data-size='<?php echo $file['size'];?>' data-write='<?php echo $write;?>'>
|
||||
<tr data-file="<?php echo $name;?>" data-type="<?php echo ($file['type'] == 'dir')?'dir':'file'?>" data-mime="<?php echo $file['mimetype']?>" data-size='<?php echo $file['size'];?>' data-permissions='<?php echo $file['permissions']; ?>'>
|
||||
<td class="filename svg" style="background-image:url(<?php if($file['type'] == 'dir') echo OCP\mimetype_icon('dir'); else echo OCP\mimetype_icon($file['mimetype']); ?>)">
|
||||
<?php if(!isset($_['readonly']) || !$_['readonly']) { ?><input type="checkbox" /><?php } ?>
|
||||
<a class="name" href="<?php if($file['type'] == 'dir') echo $_['baseURL'].$directory.'/'.$name; else echo $_['downloadURL'].$directory.'/'.$name; ?>" title="">
|
||||
|
|
|
@ -7,11 +7,11 @@
|
|||
|
||||
$(document).ready(function() {
|
||||
if(typeof FileActions!=='undefined'){
|
||||
FileActions.register('application/zip','Open','',function(filename){
|
||||
FileActions.register('application/zip','Open', FileActions.PERMISSION_READ, '',function(filename){
|
||||
window.location=OC.linkTo('files', 'index.php')+'&dir='+encodeURIComponent($('#dir').val()).replace(/%2F/g, '/')+'/'+encodeURIComponent(filename);
|
||||
});
|
||||
FileActions.setDefault('application/zip','Open');
|
||||
FileActions.register('application/x-gzip','Open','',function(filename){
|
||||
FileActions.register('application/x-gzip','Open', FileActions.PERMISSION_READ, '',function(filename){
|
||||
window.location=OC.linkTo('files', 'index.php')+'&dir='+encodeURIComponent($('#dir').val()).replace(/%2F/g, '/')+'/'+encodeURIComponent(filename);
|
||||
});
|
||||
FileActions.setDefault('application/x-gzip','Open');
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
$(document).ready(function() {
|
||||
if(typeof FileActions!=='undefined'){
|
||||
FileActions.register('image','View','',function(filename){
|
||||
FileActions.register('image','View', FileActions.PERMISSION_READ, '',function(filename){
|
||||
viewImage($('#dir').val(),filename);
|
||||
});
|
||||
FileActions.setDefault('image','View');
|
||||
|
|
|
@ -40,7 +40,7 @@ $(document).ready(function(){
|
|||
if(location.href.indexOf("files")!=-1) {
|
||||
PDFJS.workerSrc = OC.filePath('files_pdfviewer','js','pdfjs/build/pdf.js');
|
||||
if(typeof FileActions!=='undefined'){
|
||||
FileActions.register('application/pdf','Edit','',function(filename){
|
||||
FileActions.register('application/pdf','Edit', FileActions.PERMISSION_READ, '',function(filename){
|
||||
showPDFviewer($('#dir').val(),filename);
|
||||
});
|
||||
FileActions.setDefault('application/pdf','Edit');
|
||||
|
|
|
@ -70,7 +70,14 @@ class OC_Share_Backend_File extends OCP\Share_Backend {
|
|||
// Set target path
|
||||
$file['path'] = $shares[$file['id']]['file_target'];
|
||||
$file['name'] = basename($file['path']);
|
||||
// TODO Set permissions: $file['writable']
|
||||
$file['directory'] = $parameters['folder'];
|
||||
$file['type'] = ($file['mimetype'] == 'httpd/unix-directory') ? 'dir' : 'file';
|
||||
$permissions = $shares[$file['id']]['permissions'];
|
||||
if ($file['type'] == 'file') {
|
||||
// Remove Create permission if type is file
|
||||
$permissions &= ~OCP\Share::PERMISSION_CREATE;
|
||||
}
|
||||
$file['permissions'] = $permissions;
|
||||
$files[] = $file;
|
||||
}
|
||||
return $files;
|
||||
|
@ -85,7 +92,7 @@ class OC_Share_Backend_File extends OCP\Share_Backend {
|
|||
}
|
||||
$size += $file['size'];
|
||||
}
|
||||
return array(0 => array('name' => 'Shared', 'mtime' => $mtime, 'mimetype' => 'httpd/unix-directory', 'size' => $size, 'writable' => false));
|
||||
return array(0 => array('name' => 'Shared', 'mtime' => $mtime, 'mimetype' => 'httpd/unix-directory', 'size' => $size, 'writable' => false, 'type' => 'dir', 'directory' => '', 'permissions' => OCP\Share::PERMISSION_READ));
|
||||
}
|
||||
}
|
||||
return array();
|
||||
|
|
|
@ -43,7 +43,18 @@ class OC_Share_Backend_Folder extends OC_Share_Backend_File {
|
|||
$pos = strpos($result['path'], $folder['item']);
|
||||
$path = substr($result['path'], $pos).substr($parameters['folder'], strlen($folder['file_target']));
|
||||
$root = substr($result['path'], 0, $pos);
|
||||
return OC_FileCache::getFolderContent($path, $root, $mimetype_filter);
|
||||
$files = OC_FileCache::getFolderContent($path, $root, $mimetype_filter);
|
||||
foreach ($files as &$file) {
|
||||
$file['directory'] = $parameters['folder'];
|
||||
$file['type'] = ($file['mimetype'] == 'httpd/unix-directory') ? 'dir' : 'file';
|
||||
$permissions = $folder['permissions'];
|
||||
if ($file['type'] == 'file') {
|
||||
// Remove Create permission if type is file
|
||||
$permissions &= ~OCP\Share::PERMISSION_CREATE;
|
||||
}
|
||||
$file['permissions'] = $permissions;
|
||||
}
|
||||
return $files;
|
||||
}
|
||||
}/* else if ($format == self::FORMAT_OPENDIR_ROOT) {
|
||||
$query = OCP\DB::prepare('SELECT name FROM *PREFIX*fscache WHERE id IN ('.$ids.')');
|
||||
|
|
|
@ -222,9 +222,17 @@ function showFileEditor(dir,filename){
|
|||
}
|
||||
});
|
||||
// Add the ctrl+s event
|
||||
window.aceEditor.commands.addCommand({
name: "save",
bindKey: {
win: "Ctrl-S",
mac: "Command-S",
sender: "editor"
},
exec: function(){
|
||||
window.aceEditor.commands.addCommand({
|
||||
name: "save",
|
||||
bindKey: {
|
||||
win: "Ctrl-S",
|
||||
mac: "Command-S",
|
||||
sender: "editor"
|
||||
},
|
||||
exec: function(){
|
||||
doFileSave();
|
||||
}
});
|
||||
}
|
||||
});
|
||||
});
|
||||
} else {
|
||||
// Failed to get the file.
|
||||
|
@ -297,11 +305,11 @@ $(window).resize(function() {
|
|||
var is_editor_shown = false;
|
||||
$(document).ready(function(){
|
||||
if(typeof FileActions!=='undefined'){
|
||||
FileActions.register('text','Edit','',function(filename){
|
||||
FileActions.register('text','Edit', FileActions.PERMISSION_READ, '',function(filename){
|
||||
showFileEditor($('#dir').val(),filename);
|
||||
});
|
||||
FileActions.setDefault('text','Edit');
|
||||
FileActions.register('application/xml','Edit','',function(filename){
|
||||
FileActions.register('application/xml','Edit', FileActions.PERMISSION_READ, '',function(filename){
|
||||
showFileEditor($('#dir').val(),filename);
|
||||
});
|
||||
FileActions.setDefault('application/xml','Edit');
|
||||
|
|
|
@ -11,7 +11,7 @@ $(document).ready(function() {
|
|||
$(document).ready(function(){
|
||||
if (typeof FileActions !== 'undefined') {
|
||||
// Add history button to files/index.php
|
||||
FileActions.register('file','History',function(){return OC.imagePath('core','actions/history')},function(filename){
|
||||
FileActions.register('file','History', FileActions.PERMISSION_UPDATE, function(){return OC.imagePath('core','actions/history')},function(filename){
|
||||
|
||||
if (scanFiles.scanning){return;}//workaround to prevent additional http request block scanning feedback
|
||||
|
||||
|
|
|
@ -45,8 +45,8 @@ $(document).ready(function() {
|
|||
// FileActions.register('application/ogg','Add to playlist','',addAudio);
|
||||
|
||||
if(typeof FileActions!=='undefined'){
|
||||
FileActions.register('audio','Play','',playAudio);
|
||||
FileActions.register('application/ogg','','Play',playAudio);
|
||||
FileActions.register('audio','Play', FileActions.PERMISSION_READ, '',playAudio);
|
||||
FileActions.register('application/ogg', FileActions.PERMISSION_READ, '','Play',playAudio);
|
||||
FileActions.setDefault('audio','Play');
|
||||
FileActions.setDefault('application/ogg','Play');
|
||||
}
|
||||
|
|
|
@ -164,7 +164,7 @@ $(document).ready(function() {
|
|||
if (typeof FileActions !== 'undefined') {
|
||||
|
||||
OC.Share.loadIcons('file');
|
||||
FileActions.register('all', 'Share', function(filename) {
|
||||
FileActions.register('all', 'Share', FileActions.PERMISSION_SHARE, function(filename) {
|
||||
// Return the correct sharing icon
|
||||
if (scanFiles.scanning) { return; } // workaround to prevent additional http request block scanning feedback
|
||||
var item = $('#dir').val() + '/' + filename;
|
||||
|
|
|
@ -36,7 +36,7 @@ class OC_Files {
|
|||
$files = array();
|
||||
if (substr($directory, 0, 7) == '/Shared') {
|
||||
if ($directory == '/Shared') {
|
||||
$files = OCP\Share::getItemsSharedWith('file', OC_Share_Backend_File::FORMAT_FILE_APP, array('mimetype_filter' => $mimetype_filter));
|
||||
$files = OCP\Share::getItemsSharedWith('file', OC_Share_Backend_File::FORMAT_FILE_APP, array('folder' => $directory, 'mimetype_filter' => $mimetype_filter));
|
||||
} else {
|
||||
$pos = strpos($directory, '/', 8);
|
||||
// Get shared folder name
|
||||
|
@ -49,15 +49,23 @@ class OC_Files {
|
|||
}
|
||||
} else {
|
||||
$files = OC_FileCache::getFolderContent($directory, false, $mimetype_filter);
|
||||
foreach ($files as &$file) {
|
||||
$file['directory'] = $directory;
|
||||
$file['type'] = ($file['mimetype'] == 'httpd/unix-directory') ? 'dir' : 'file';
|
||||
$permissions = OCP\Share::PERMISSION_READ | OCP\Share::PERMISSION_SHARE;
|
||||
if ($file['type'] == 'dir' && $file['writable']) {
|
||||
$permissions |= OCP\Share::PERMISSION_CREATE;
|
||||
}
|
||||
if ($file['writable']) {
|
||||
$permissions |= OCP\Share::PERMISSION_UPDATE | OCP\Share::PERMISSION_DELETE;
|
||||
}
|
||||
$file['permissions'] = $permissions;
|
||||
}
|
||||
if ($directory == '') {
|
||||
// Add 'Shared' folder
|
||||
$files = array_merge($files, OCP\Share::getItemsSharedWith('file', OC_Share_Backend_File::FORMAT_FILE_APP_ROOT));
|
||||
}
|
||||
}
|
||||
foreach ($files as &$file) {
|
||||
$file['directory'] = $directory;
|
||||
$file['type'] = ($file['mimetype'] == 'httpd/unix-directory') ? 'dir' : 'file';
|
||||
}
|
||||
usort($files, "fileCmp");//TODO: remove this once ajax is merged
|
||||
return $files;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue