mirror of
https://github.com/misterunknown/ifm.git
synced 2025-08-12 02:53:58 +02:00
prevent some actions for the parent dir item
This commit is contained in:
102
build/libifm.php
102
build/libifm.php
@@ -1708,82 +1708,61 @@ function IFM( params ) {
|
|||||||
*/
|
*/
|
||||||
this.handleKeystrokes = function( e ) {
|
this.handleKeystrokes = function( e ) {
|
||||||
// bind 'del' key
|
// bind 'del' key
|
||||||
if( $(e.target).closest('input')[0] || $(e.target).closest('textarea')[0] ) {
|
if( $(e.target).closest('input')[0] || $(e.target).closest('textarea')[0] )
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
switch( e.key ) {
|
switch( e.key ) {
|
||||||
case 'Delete':
|
|
||||||
if( self.config.delete ) {
|
|
||||||
if( $('#filetable tr.selectedItem').length > 0 ) {
|
|
||||||
e.preventDefault();
|
|
||||||
self.showMultiDeleteDialog();
|
|
||||||
} else {
|
|
||||||
var item = $('.highlightedItem');
|
|
||||||
if( item.length )
|
|
||||||
self.showDeleteFileDialog( item.data( 'filename' ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'e':
|
|
||||||
if( self.config.edit ) {
|
|
||||||
var item = $('.highlightedItem');
|
|
||||||
if( item.length && ! item.hasClass( 'isDir' ) ) {
|
|
||||||
e.preventDefault();
|
|
||||||
var action = item.data( 'eaction' );
|
|
||||||
switch( action ) {
|
|
||||||
case 'extract':
|
|
||||||
self.showExtractFileDialog( item.data( 'filename' ) );
|
|
||||||
break;
|
|
||||||
case 'edit':
|
|
||||||
self.editFile( item.data( 'filename' ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'g':
|
case 'g':
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
$('#currentDir').focus();
|
$('#currentDir').focus();
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'r':
|
case 'r':
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
self.refreshFileTable();
|
self.refreshFileTable();
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'u':
|
case 'u':
|
||||||
if( self.config.upload ) {
|
if( self.config.upload ) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
self.showUploadFileDialog();
|
self.showUploadFileDialog();
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'o':
|
case 'o':
|
||||||
if( self.config.remoteupload ) {
|
if( self.config.remoteupload ) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
self.showRemoteUploadDialog();
|
self.showRemoteUploadDialog();
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'a':
|
case 'a':
|
||||||
if( self.config.ajaxrequest ) {
|
if( self.config.ajaxrequest ) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
self.showAjaxRequestDialog();
|
self.showAjaxRequestDialog();
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'F':
|
case 'F':
|
||||||
if( self.config.createfile ) {
|
if( self.config.createfile ) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
self.showFileDialog();
|
self.showFileDialog();
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'D':
|
case 'D':
|
||||||
if( self.config.createdir ) {
|
if( self.config.createdir ) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
self.showCreateDirDialog();
|
self.showCreateDirDialog();
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
case 'ArrowLeft':
|
case 'ArrowLeft':
|
||||||
case 'Backspace':
|
case 'Backspace':
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
self.changeDirectory( '..' );
|
self.changeDirectory( '..' );
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'l':
|
case 'l':
|
||||||
case 'ArrowRight':
|
case 'ArrowRight':
|
||||||
@@ -1791,22 +1770,26 @@ function IFM( params ) {
|
|||||||
var item = $('.highlightedItem');
|
var item = $('.highlightedItem');
|
||||||
if( item.hasClass('isDir') )
|
if( item.hasClass('isDir') )
|
||||||
self.changeDirectory( item.data( 'filename' ) );
|
self.changeDirectory( item.data( 'filename' ) );
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'j':
|
case 'j':
|
||||||
case 'ArrowDown':
|
case 'ArrowDown':
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
self.highlightItem('next');
|
self.highlightItem('next');
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'k':
|
case 'k':
|
||||||
case 'ArrowUp':
|
case 'ArrowUp':
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
self.highlightItem('prev');
|
self.highlightItem('prev');
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'Escape':
|
case 'Escape':
|
||||||
if( $(':focus').is( '.clickable-row td:first-child a:first-child' ) && $('.highlightedItem').length ) {
|
if( $(':focus').is( '.clickable-row td:first-child a:first-child' ) && $('.highlightedItem').length ) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
$('.highlightedItem').removeClass( 'highlightedItem' );
|
$('.highlightedItem').removeClass( 'highlightedItem' );
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case ' ': // todo: make it work only when noting other is focused
|
case ' ': // todo: make it work only when noting other is focused
|
||||||
case 'Enter':
|
case 'Enter':
|
||||||
@@ -1824,6 +1807,58 @@ function IFM( params ) {
|
|||||||
item.toggleClass( 'selectedItem' );
|
item.toggleClass( 'selectedItem' );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Some operations do not work if the highlighted item is the parent
|
||||||
|
* directory. In these cases the keybindings are ignored.
|
||||||
|
*/
|
||||||
|
if( $('.highlightedItem').data( 'filename' ) == ".." )
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch( e.key ) {
|
||||||
|
case 'Delete':
|
||||||
|
if( self.config.delete ) {
|
||||||
|
if( $('#filetable tr.selectedItem').length > 0 ) {
|
||||||
|
e.preventDefault();
|
||||||
|
self.showMultiDeleteDialog();
|
||||||
|
} else {
|
||||||
|
var item = $('.highlightedItem');
|
||||||
|
if( item.length )
|
||||||
|
self.showDeleteFileDialog( item.data( 'filename' ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
case 'c':
|
||||||
|
case 'm':
|
||||||
|
if( self.config.copymove ) {
|
||||||
|
var item = $('.highlightedItem');
|
||||||
|
if( item.length ) {
|
||||||
|
e.preventDefault();
|
||||||
|
self.showCopyMoveDialog( item.data( 'filename' ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
if( self.config.edit ) {
|
||||||
|
var item = $('.highlightedItem');
|
||||||
|
if( item.length && ! item.hasClass( 'isDir' ) ) {
|
||||||
|
e.preventDefault();
|
||||||
|
var action = item.data( 'eaction' );
|
||||||
|
switch( action ) {
|
||||||
|
case 'extract':
|
||||||
|
self.showExtractFileDialog( item.data( 'filename' ) );
|
||||||
|
break;
|
||||||
|
case 'edit':
|
||||||
|
self.editFile( item.data( 'filename' ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1990,7 +2025,6 @@ function IFM( params ) {
|
|||||||
case "remoteUpload": $this->remoteUpload( $_REQUEST ); break;
|
case "remoteUpload": $this->remoteUpload( $_REQUEST ); break;
|
||||||
case "multidelete": $this->deleteMultipleFiles( $_REQUEST ); break;
|
case "multidelete": $this->deleteMultipleFiles( $_REQUEST ); break;
|
||||||
case "getFolderTree":
|
case "getFolderTree":
|
||||||
sleep(10);
|
|
||||||
echo json_encode( array_merge( array( 0 => array( "text" => "/ [root]", "nodes" => array(), "dataAttributes" => array( "path" => realpath( $this->config['root_dir'] ) ) ) ), $this->getFolderTreeRecursive( $this->config['root_dir'] ) ) );
|
echo json_encode( array_merge( array( 0 => array( "text" => "/ [root]", "nodes" => array(), "dataAttributes" => array( "path" => realpath( $this->config['root_dir'] ) ) ) ), $this->getFolderTreeRecursive( $this->config['root_dir'] ) ) );
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -2120,7 +2154,7 @@ function IFM( params ) {
|
|||||||
echo json_encode( array( "status" => "ERROR", "message" => "No valid destination directory given." ) );
|
echo json_encode( array( "status" => "ERROR", "message" => "No valid destination directory given." ) );
|
||||||
exit( 1 );
|
exit( 1 );
|
||||||
}
|
}
|
||||||
if( ! file_exists( $d['filename'] ) ) {
|
if( ! file_exists( $d['filename'] ) || $d['filename'] == ".." ) {
|
||||||
echo json_encode( array( "status" => "ERROR", "message" => "No valid filename given." ) );
|
echo json_encode( array( "status" => "ERROR", "message" => "No valid filename given." ) );
|
||||||
exit( 1 );
|
exit( 1 );
|
||||||
}
|
}
|
||||||
@@ -2210,7 +2244,7 @@ function IFM( params ) {
|
|||||||
echo json_encode( array( "status" => "ERROR", "message" => "You are not allowed to edit files." ) );
|
echo json_encode( array( "status" => "ERROR", "message" => "You are not allowed to edit files." ) );
|
||||||
else {
|
else {
|
||||||
$this->chDirIfNecessary( $d['dir'] );
|
$this->chDirIfNecessary( $d['dir'] );
|
||||||
if( file_exists( $d['filename'] ) && is_readable( $d['filename'] ) ) {
|
if( file_exists( $d['filename'] ) && is_file( $d['filename'] ) && is_readable( $d['filename'] ) ) {
|
||||||
$content = @file_get_contents( $d['filename'] );
|
$content = @file_get_contents( $d['filename'] );
|
||||||
file_put_contents( "debugifm.txt", "content: ".$content."\n\n\n" );
|
file_put_contents( "debugifm.txt", "content: ".$content."\n\n\n" );
|
||||||
if( function_exists( "mb_check_encoding" ) && ! mb_check_encoding( $content, "UTF-8" ) )
|
if( function_exists( "mb_check_encoding" ) && ! mb_check_encoding( $content, "UTF-8" ) )
|
||||||
@@ -2282,6 +2316,8 @@ function IFM( params ) {
|
|||||||
private function renameFile( array $d ) {
|
private function renameFile( array $d ) {
|
||||||
if( $this->config['rename'] != 1 ) {
|
if( $this->config['rename'] != 1 ) {
|
||||||
echo json_encode( array( "status" => "ERROR", "message" => "No permission to rename files" ) );
|
echo json_encode( array( "status" => "ERROR", "message" => "No permission to rename files" ) );
|
||||||
|
} elseif( $d['filename'] == ".." ) {
|
||||||
|
echo json_encode( array( "status" => "ERROR", "message" => "No valid file name given" ) );
|
||||||
} else {
|
} else {
|
||||||
$this->chDirIfNecessary( $d['dir'] );
|
$this->chDirIfNecessary( $d['dir'] );
|
||||||
if( strpos( $d['newname'], '/' ) !== false )
|
if( strpos( $d['newname'], '/' ) !== false )
|
||||||
|
102
ifm.php
102
ifm.php
@@ -1708,82 +1708,61 @@ function IFM( params ) {
|
|||||||
*/
|
*/
|
||||||
this.handleKeystrokes = function( e ) {
|
this.handleKeystrokes = function( e ) {
|
||||||
// bind 'del' key
|
// bind 'del' key
|
||||||
if( $(e.target).closest('input')[0] || $(e.target).closest('textarea')[0] ) {
|
if( $(e.target).closest('input')[0] || $(e.target).closest('textarea')[0] )
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
switch( e.key ) {
|
switch( e.key ) {
|
||||||
case 'Delete':
|
|
||||||
if( self.config.delete ) {
|
|
||||||
if( $('#filetable tr.selectedItem').length > 0 ) {
|
|
||||||
e.preventDefault();
|
|
||||||
self.showMultiDeleteDialog();
|
|
||||||
} else {
|
|
||||||
var item = $('.highlightedItem');
|
|
||||||
if( item.length )
|
|
||||||
self.showDeleteFileDialog( item.data( 'filename' ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'e':
|
|
||||||
if( self.config.edit ) {
|
|
||||||
var item = $('.highlightedItem');
|
|
||||||
if( item.length && ! item.hasClass( 'isDir' ) ) {
|
|
||||||
e.preventDefault();
|
|
||||||
var action = item.data( 'eaction' );
|
|
||||||
switch( action ) {
|
|
||||||
case 'extract':
|
|
||||||
self.showExtractFileDialog( item.data( 'filename' ) );
|
|
||||||
break;
|
|
||||||
case 'edit':
|
|
||||||
self.editFile( item.data( 'filename' ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'g':
|
case 'g':
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
$('#currentDir').focus();
|
$('#currentDir').focus();
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'r':
|
case 'r':
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
self.refreshFileTable();
|
self.refreshFileTable();
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'u':
|
case 'u':
|
||||||
if( self.config.upload ) {
|
if( self.config.upload ) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
self.showUploadFileDialog();
|
self.showUploadFileDialog();
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'o':
|
case 'o':
|
||||||
if( self.config.remoteupload ) {
|
if( self.config.remoteupload ) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
self.showRemoteUploadDialog();
|
self.showRemoteUploadDialog();
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'a':
|
case 'a':
|
||||||
if( self.config.ajaxrequest ) {
|
if( self.config.ajaxrequest ) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
self.showAjaxRequestDialog();
|
self.showAjaxRequestDialog();
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'F':
|
case 'F':
|
||||||
if( self.config.createfile ) {
|
if( self.config.createfile ) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
self.showFileDialog();
|
self.showFileDialog();
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'D':
|
case 'D':
|
||||||
if( self.config.createdir ) {
|
if( self.config.createdir ) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
self.showCreateDirDialog();
|
self.showCreateDirDialog();
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
case 'ArrowLeft':
|
case 'ArrowLeft':
|
||||||
case 'Backspace':
|
case 'Backspace':
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
self.changeDirectory( '..' );
|
self.changeDirectory( '..' );
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'l':
|
case 'l':
|
||||||
case 'ArrowRight':
|
case 'ArrowRight':
|
||||||
@@ -1791,22 +1770,26 @@ function IFM( params ) {
|
|||||||
var item = $('.highlightedItem');
|
var item = $('.highlightedItem');
|
||||||
if( item.hasClass('isDir') )
|
if( item.hasClass('isDir') )
|
||||||
self.changeDirectory( item.data( 'filename' ) );
|
self.changeDirectory( item.data( 'filename' ) );
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'j':
|
case 'j':
|
||||||
case 'ArrowDown':
|
case 'ArrowDown':
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
self.highlightItem('next');
|
self.highlightItem('next');
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'k':
|
case 'k':
|
||||||
case 'ArrowUp':
|
case 'ArrowUp':
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
self.highlightItem('prev');
|
self.highlightItem('prev');
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'Escape':
|
case 'Escape':
|
||||||
if( $(':focus').is( '.clickable-row td:first-child a:first-child' ) && $('.highlightedItem').length ) {
|
if( $(':focus').is( '.clickable-row td:first-child a:first-child' ) && $('.highlightedItem').length ) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
$('.highlightedItem').removeClass( 'highlightedItem' );
|
$('.highlightedItem').removeClass( 'highlightedItem' );
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case ' ': // todo: make it work only when noting other is focused
|
case ' ': // todo: make it work only when noting other is focused
|
||||||
case 'Enter':
|
case 'Enter':
|
||||||
@@ -1824,6 +1807,58 @@ function IFM( params ) {
|
|||||||
item.toggleClass( 'selectedItem' );
|
item.toggleClass( 'selectedItem' );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Some operations do not work if the highlighted item is the parent
|
||||||
|
* directory. In these cases the keybindings are ignored.
|
||||||
|
*/
|
||||||
|
if( $('.highlightedItem').data( 'filename' ) == ".." )
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch( e.key ) {
|
||||||
|
case 'Delete':
|
||||||
|
if( self.config.delete ) {
|
||||||
|
if( $('#filetable tr.selectedItem').length > 0 ) {
|
||||||
|
e.preventDefault();
|
||||||
|
self.showMultiDeleteDialog();
|
||||||
|
} else {
|
||||||
|
var item = $('.highlightedItem');
|
||||||
|
if( item.length )
|
||||||
|
self.showDeleteFileDialog( item.data( 'filename' ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
case 'c':
|
||||||
|
case 'm':
|
||||||
|
if( self.config.copymove ) {
|
||||||
|
var item = $('.highlightedItem');
|
||||||
|
if( item.length ) {
|
||||||
|
e.preventDefault();
|
||||||
|
self.showCopyMoveDialog( item.data( 'filename' ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
if( self.config.edit ) {
|
||||||
|
var item = $('.highlightedItem');
|
||||||
|
if( item.length && ! item.hasClass( 'isDir' ) ) {
|
||||||
|
e.preventDefault();
|
||||||
|
var action = item.data( 'eaction' );
|
||||||
|
switch( action ) {
|
||||||
|
case 'extract':
|
||||||
|
self.showExtractFileDialog( item.data( 'filename' ) );
|
||||||
|
break;
|
||||||
|
case 'edit':
|
||||||
|
self.editFile( item.data( 'filename' ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1990,7 +2025,6 @@ function IFM( params ) {
|
|||||||
case "remoteUpload": $this->remoteUpload( $_REQUEST ); break;
|
case "remoteUpload": $this->remoteUpload( $_REQUEST ); break;
|
||||||
case "multidelete": $this->deleteMultipleFiles( $_REQUEST ); break;
|
case "multidelete": $this->deleteMultipleFiles( $_REQUEST ); break;
|
||||||
case "getFolderTree":
|
case "getFolderTree":
|
||||||
sleep(10);
|
|
||||||
echo json_encode( array_merge( array( 0 => array( "text" => "/ [root]", "nodes" => array(), "dataAttributes" => array( "path" => realpath( $this->config['root_dir'] ) ) ) ), $this->getFolderTreeRecursive( $this->config['root_dir'] ) ) );
|
echo json_encode( array_merge( array( 0 => array( "text" => "/ [root]", "nodes" => array(), "dataAttributes" => array( "path" => realpath( $this->config['root_dir'] ) ) ) ), $this->getFolderTreeRecursive( $this->config['root_dir'] ) ) );
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -2120,7 +2154,7 @@ function IFM( params ) {
|
|||||||
echo json_encode( array( "status" => "ERROR", "message" => "No valid destination directory given." ) );
|
echo json_encode( array( "status" => "ERROR", "message" => "No valid destination directory given." ) );
|
||||||
exit( 1 );
|
exit( 1 );
|
||||||
}
|
}
|
||||||
if( ! file_exists( $d['filename'] ) ) {
|
if( ! file_exists( $d['filename'] ) || $d['filename'] == ".." ) {
|
||||||
echo json_encode( array( "status" => "ERROR", "message" => "No valid filename given." ) );
|
echo json_encode( array( "status" => "ERROR", "message" => "No valid filename given." ) );
|
||||||
exit( 1 );
|
exit( 1 );
|
||||||
}
|
}
|
||||||
@@ -2210,7 +2244,7 @@ function IFM( params ) {
|
|||||||
echo json_encode( array( "status" => "ERROR", "message" => "You are not allowed to edit files." ) );
|
echo json_encode( array( "status" => "ERROR", "message" => "You are not allowed to edit files." ) );
|
||||||
else {
|
else {
|
||||||
$this->chDirIfNecessary( $d['dir'] );
|
$this->chDirIfNecessary( $d['dir'] );
|
||||||
if( file_exists( $d['filename'] ) && is_readable( $d['filename'] ) ) {
|
if( file_exists( $d['filename'] ) && is_file( $d['filename'] ) && is_readable( $d['filename'] ) ) {
|
||||||
$content = @file_get_contents( $d['filename'] );
|
$content = @file_get_contents( $d['filename'] );
|
||||||
file_put_contents( "debugifm.txt", "content: ".$content."\n\n\n" );
|
file_put_contents( "debugifm.txt", "content: ".$content."\n\n\n" );
|
||||||
if( function_exists( "mb_check_encoding" ) && ! mb_check_encoding( $content, "UTF-8" ) )
|
if( function_exists( "mb_check_encoding" ) && ! mb_check_encoding( $content, "UTF-8" ) )
|
||||||
@@ -2282,6 +2316,8 @@ function IFM( params ) {
|
|||||||
private function renameFile( array $d ) {
|
private function renameFile( array $d ) {
|
||||||
if( $this->config['rename'] != 1 ) {
|
if( $this->config['rename'] != 1 ) {
|
||||||
echo json_encode( array( "status" => "ERROR", "message" => "No permission to rename files" ) );
|
echo json_encode( array( "status" => "ERROR", "message" => "No permission to rename files" ) );
|
||||||
|
} elseif( $d['filename'] == ".." ) {
|
||||||
|
echo json_encode( array( "status" => "ERROR", "message" => "No valid file name given" ) );
|
||||||
} else {
|
} else {
|
||||||
$this->chDirIfNecessary( $d['dir'] );
|
$this->chDirIfNecessary( $d['dir'] );
|
||||||
if( strpos( $d['newname'], '/' ) !== false )
|
if( strpos( $d['newname'], '/' ) !== false )
|
||||||
|
95
src/ifm.js
95
src/ifm.js
@@ -1022,82 +1022,61 @@ function IFM( params ) {
|
|||||||
*/
|
*/
|
||||||
this.handleKeystrokes = function( e ) {
|
this.handleKeystrokes = function( e ) {
|
||||||
// bind 'del' key
|
// bind 'del' key
|
||||||
if( $(e.target).closest('input')[0] || $(e.target).closest('textarea')[0] ) {
|
if( $(e.target).closest('input')[0] || $(e.target).closest('textarea')[0] )
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
switch( e.key ) {
|
switch( e.key ) {
|
||||||
case 'Delete':
|
|
||||||
if( self.config.delete ) {
|
|
||||||
if( $('#filetable tr.selectedItem').length > 0 ) {
|
|
||||||
e.preventDefault();
|
|
||||||
self.showMultiDeleteDialog();
|
|
||||||
} else {
|
|
||||||
var item = $('.highlightedItem');
|
|
||||||
if( item.length )
|
|
||||||
self.showDeleteFileDialog( item.data( 'filename' ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'e':
|
|
||||||
if( self.config.edit ) {
|
|
||||||
var item = $('.highlightedItem');
|
|
||||||
if( item.length && ! item.hasClass( 'isDir' ) ) {
|
|
||||||
e.preventDefault();
|
|
||||||
var action = item.data( 'eaction' );
|
|
||||||
switch( action ) {
|
|
||||||
case 'extract':
|
|
||||||
self.showExtractFileDialog( item.data( 'filename' ) );
|
|
||||||
break;
|
|
||||||
case 'edit':
|
|
||||||
self.editFile( item.data( 'filename' ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'g':
|
case 'g':
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
$('#currentDir').focus();
|
$('#currentDir').focus();
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'r':
|
case 'r':
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
self.refreshFileTable();
|
self.refreshFileTable();
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'u':
|
case 'u':
|
||||||
if( self.config.upload ) {
|
if( self.config.upload ) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
self.showUploadFileDialog();
|
self.showUploadFileDialog();
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'o':
|
case 'o':
|
||||||
if( self.config.remoteupload ) {
|
if( self.config.remoteupload ) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
self.showRemoteUploadDialog();
|
self.showRemoteUploadDialog();
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'a':
|
case 'a':
|
||||||
if( self.config.ajaxrequest ) {
|
if( self.config.ajaxrequest ) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
self.showAjaxRequestDialog();
|
self.showAjaxRequestDialog();
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'F':
|
case 'F':
|
||||||
if( self.config.createfile ) {
|
if( self.config.createfile ) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
self.showFileDialog();
|
self.showFileDialog();
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'D':
|
case 'D':
|
||||||
if( self.config.createdir ) {
|
if( self.config.createdir ) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
self.showCreateDirDialog();
|
self.showCreateDirDialog();
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
case 'ArrowLeft':
|
case 'ArrowLeft':
|
||||||
case 'Backspace':
|
case 'Backspace':
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
self.changeDirectory( '..' );
|
self.changeDirectory( '..' );
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'l':
|
case 'l':
|
||||||
case 'ArrowRight':
|
case 'ArrowRight':
|
||||||
@@ -1105,22 +1084,26 @@ function IFM( params ) {
|
|||||||
var item = $('.highlightedItem');
|
var item = $('.highlightedItem');
|
||||||
if( item.hasClass('isDir') )
|
if( item.hasClass('isDir') )
|
||||||
self.changeDirectory( item.data( 'filename' ) );
|
self.changeDirectory( item.data( 'filename' ) );
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'j':
|
case 'j':
|
||||||
case 'ArrowDown':
|
case 'ArrowDown':
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
self.highlightItem('next');
|
self.highlightItem('next');
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'k':
|
case 'k':
|
||||||
case 'ArrowUp':
|
case 'ArrowUp':
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
self.highlightItem('prev');
|
self.highlightItem('prev');
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case 'Escape':
|
case 'Escape':
|
||||||
if( $(':focus').is( '.clickable-row td:first-child a:first-child' ) && $('.highlightedItem').length ) {
|
if( $(':focus').is( '.clickable-row td:first-child a:first-child' ) && $('.highlightedItem').length ) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
$('.highlightedItem').removeClass( 'highlightedItem' );
|
$('.highlightedItem').removeClass( 'highlightedItem' );
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case ' ': // todo: make it work only when noting other is focused
|
case ' ': // todo: make it work only when noting other is focused
|
||||||
case 'Enter':
|
case 'Enter':
|
||||||
@@ -1138,6 +1121,58 @@ function IFM( params ) {
|
|||||||
item.toggleClass( 'selectedItem' );
|
item.toggleClass( 'selectedItem' );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Some operations do not work if the highlighted item is the parent
|
||||||
|
* directory. In these cases the keybindings are ignored.
|
||||||
|
*/
|
||||||
|
if( $('.highlightedItem').data( 'filename' ) == ".." )
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch( e.key ) {
|
||||||
|
case 'Delete':
|
||||||
|
if( self.config.delete ) {
|
||||||
|
if( $('#filetable tr.selectedItem').length > 0 ) {
|
||||||
|
e.preventDefault();
|
||||||
|
self.showMultiDeleteDialog();
|
||||||
|
} else {
|
||||||
|
var item = $('.highlightedItem');
|
||||||
|
if( item.length )
|
||||||
|
self.showDeleteFileDialog( item.data( 'filename' ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
case 'c':
|
||||||
|
case 'm':
|
||||||
|
if( self.config.copymove ) {
|
||||||
|
var item = $('.highlightedItem');
|
||||||
|
if( item.length ) {
|
||||||
|
e.preventDefault();
|
||||||
|
self.showCopyMoveDialog( item.data( 'filename' ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
if( self.config.edit ) {
|
||||||
|
var item = $('.highlightedItem');
|
||||||
|
if( item.length && ! item.hasClass( 'isDir' ) ) {
|
||||||
|
e.preventDefault();
|
||||||
|
var action = item.data( 'eaction' );
|
||||||
|
switch( action ) {
|
||||||
|
case 'extract':
|
||||||
|
self.showExtractFileDialog( item.data( 'filename' ) );
|
||||||
|
break;
|
||||||
|
case 'edit':
|
||||||
|
self.editFile( item.data( 'filename' ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -329,7 +329,7 @@ f00bar;
|
|||||||
echo json_encode( array( "status" => "ERROR", "message" => "No valid destination directory given." ) );
|
echo json_encode( array( "status" => "ERROR", "message" => "No valid destination directory given." ) );
|
||||||
exit( 1 );
|
exit( 1 );
|
||||||
}
|
}
|
||||||
if( ! file_exists( $d['filename'] ) ) {
|
if( ! file_exists( $d['filename'] ) || $d['filename'] == ".." ) {
|
||||||
echo json_encode( array( "status" => "ERROR", "message" => "No valid filename given." ) );
|
echo json_encode( array( "status" => "ERROR", "message" => "No valid filename given." ) );
|
||||||
exit( 1 );
|
exit( 1 );
|
||||||
}
|
}
|
||||||
@@ -419,7 +419,7 @@ f00bar;
|
|||||||
echo json_encode( array( "status" => "ERROR", "message" => "You are not allowed to edit files." ) );
|
echo json_encode( array( "status" => "ERROR", "message" => "You are not allowed to edit files." ) );
|
||||||
else {
|
else {
|
||||||
$this->chDirIfNecessary( $d['dir'] );
|
$this->chDirIfNecessary( $d['dir'] );
|
||||||
if( file_exists( $d['filename'] ) && is_readable( $d['filename'] ) ) {
|
if( file_exists( $d['filename'] ) && is_file( $d['filename'] ) && is_readable( $d['filename'] ) ) {
|
||||||
$content = @file_get_contents( $d['filename'] );
|
$content = @file_get_contents( $d['filename'] );
|
||||||
file_put_contents( "debugifm.txt", "content: ".$content."\n\n\n" );
|
file_put_contents( "debugifm.txt", "content: ".$content."\n\n\n" );
|
||||||
if( function_exists( "mb_check_encoding" ) && ! mb_check_encoding( $content, "UTF-8" ) )
|
if( function_exists( "mb_check_encoding" ) && ! mb_check_encoding( $content, "UTF-8" ) )
|
||||||
@@ -491,6 +491,8 @@ f00bar;
|
|||||||
private function renameFile( array $d ) {
|
private function renameFile( array $d ) {
|
||||||
if( $this->config['rename'] != 1 ) {
|
if( $this->config['rename'] != 1 ) {
|
||||||
echo json_encode( array( "status" => "ERROR", "message" => "No permission to rename files" ) );
|
echo json_encode( array( "status" => "ERROR", "message" => "No permission to rename files" ) );
|
||||||
|
} elseif( $d['filename'] == ".." ) {
|
||||||
|
echo json_encode( array( "status" => "ERROR", "message" => "No valid file name given" ) );
|
||||||
} else {
|
} else {
|
||||||
$this->chDirIfNecessary( $d['dir'] );
|
$this->chDirIfNecessary( $d['dir'] );
|
||||||
if( strpos( $d['newname'], '/' ) !== false )
|
if( strpos( $d['newname'], '/' ) !== false )
|
||||||
|
Reference in New Issue
Block a user