Make file actions permissions aware

This commit is contained in:
Michael Gapczynski 2012-07-25 16:33:08 -04:00
parent 6f58eca534
commit 4d17ed2f71
15 changed files with 94 additions and 48 deletions

View File

@ -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');
};
});

View File

@ -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');
};
});

View File

@ -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);
});

View File

@ -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);
}

View File

@ -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="">

View File

@ -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');

View File

@ -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');

View File

@ -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');

View File

@ -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();

View File

@ -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.')');

View File

@ -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');

View File

@ -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

View File

@ -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');
}

View File

@ -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;

View File

@ -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;
}