cp and mv commands implemented

remotes/origin/HEAD
BlackLight 12 years ago
parent c6730f6dec
commit b1b6206baa
  1. 6
      commands/chmod.json
  2. 73
      commands/cp.json
  3. 45
      commands/ln.json
  4. 39
      commands/logout.json
  5. 47
      commands/mkdir.json
  6. 73
      commands/mv.json
  7. 40
      commands/nano.json
  8. 8
      commands/passwd.json
  9. 47
      commands/rm.json
  10. 47
      commands/rmdir.json
  11. 40
      commands/su.json
  12. 47
      commands/touch.json
  13. 8
      commands/useradd.json
  14. 6
      commands/userdel.json
  15. 6
      commands/users.json
  16. 105
      modules/users/user_utils.php
  17. 19
      modules/users/users.php
  18. 49
      system/blash.js
  19. 2
      system/blash.json
  20. 2
      system/files_json.php

@ -48,11 +48,7 @@
{
if ( http.readyState == 4 && http.status == 200 )
{
if ( http.responseText.length > 0 )
{
shell.cmdOut.innerHTML = http.responseText;
}
shell.cmdOut.innerHTML = http.responseText;
shell.auto_prompt_refresh = true;
shell.refreshPrompt ( false, false );
}

@ -0,0 +1,73 @@
{
"name" : "cp",
"info" : {
"syntax" : "cp <source file> <destination file>",
"brief" : "Copy a file to another",
},
"action" : function ( arg )
{
var src = null;
var dest = null;
if ( !arg || arg.length == 0 )
{
return "Usage: " + this.info.syntax + "<br/>\n";
}
if ( arg.match ( /^\s*('|")([^'|"]+)('|")/ ))
{
src = RegExp.$2;
arg = arg.replace ( new RegExp ( '^\s*' + RegExp.$1 + RegExp.$2 + RegExp.$3 + '\s*' ), '' );
} else if ( arg.match ( /^\s*([^\s]+)/ )) {
src = RegExp.$1;
arg = arg.replace ( new RegExp ( '^\s*' + RegExp.$1 + '\s*' ), '' );
} else {
return "Usage: " + this.info.syntax + "<br/>\n";
}
if ( !src || arg.length == 0 )
{
return "Usage: " + this.info.syntax + "<br/>\n";
}
if ( arg.match ( /^\s*('|")([^'|"]+)('|")/ ))
{
dest = RegExp.$2;
} else {
arg.match ( /^\s*(.*)$/ );
dest = RegExp.$1;
}
src = shell.expandPath ( src );
dest = shell.expandPath ( dest );
shell.auto_prompt_refresh = false;
var users_php = window.location.href;
users_php = users_php.replace ( /\/([a-zA-Z\.]+)$/, '/modules/users/users.php' );
params = 'action=cp&src=' + escape ( src ) + '&dest=' + escape ( dest );
var http = new XMLHttpRequest();
http.open ( "POST", users_php, true );
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.setRequestHeader("Content-length", params.length);
http.setRequestHeader("Connection", "close");
http.onreadystatechange = function ()
{
if ( http.readyState == 4 && http.status == 200 )
{
shell.cmdOut.innerHTML = http.responseText;
shell.refreshFiles();
shell.refreshPrompt ( false, false );
shell.auto_prompt_refresh = true;
}
}
http.send ( params );
shell.cmdOut.innerHTML = '';
}
}

@ -65,49 +65,8 @@
{
if ( http.readyState == 4 && http.status == 200 )
{
if ( http.responseText.length > 0 )
{
shell.cmdOut.innerHTML = http.responseText;
}
var files_config = window.location.href;
files_config = files_config.replace ( /\/([a-zA-Z\.]+)$/, '/modules/users/files.php' );
var http2 = new XMLHttpRequest();
http2.open ( "GET", files_config, true );
http2.onreadystatechange = function ()
{
if ( http2.readyState == 4 && http2.status == 200 )
{
shell.files = eval ( '(' + http2.responseText + ')' );
// Remove duplicates
var tmp = new Array();
for ( var i in shell.files )
{
var contains = false;
for ( var j=0; j < tmp.length && !contains; j++ )
{
if ( shell.files[i].path == tmp[j].path )
{
contains = true;
}
}
if ( !contains )
{
tmp.push ( shell.files[i] );
}
}
shell.files = tmp;
}
}
http2.send ( null );
shell.cmdOut.innerHTML = http.responseText;
shell.refreshFiles();
shell.auto_prompt_refresh = true;
shell.refreshPrompt ( false, false );
}

@ -38,44 +38,7 @@
{
if ( http.readyState == 4 && http.status == 200 )
{
var files_config = window.location.href;
files_config = files_config.replace ( /\/([a-zA-Z\.]+)$/, '/modules/users/files.php' );
var http2 = new XMLHttpRequest();
http2.open ( "GET", files_config, true );
http2.onreadystatechange = function ()
{
if ( http2.readyState == 4 && http2.status == 200 )
{
shell.files = eval ( '(' + http2.responseText + ')' );
// Remove duplicates
var tmp = new Array();
for ( var i in shell.files )
{
var contains = false;
for ( var j=0; j < tmp.length && !contains; j++ )
{
if ( shell.files[i].path == tmp[j].path )
{
contains = true;
}
}
if ( !contains )
{
tmp.push ( shell.files[i] );
}
}
shell.files = tmp;
}
}
http2.send ( null );
shell.refreshFiles();
}
}

@ -31,51 +31,8 @@
{
if ( http.readyState == 4 && http.status == 200 )
{
if ( http.responseText.length > 0 )
{
shell.cmdOut.innerHTML = http.responseText;
} else {
var files_config = window.location.href;
files_config = files_config.replace ( /\/([a-zA-Z\.]+)$/, '/modules/users/files.php' );
var http2 = new XMLHttpRequest();
http2.open ( "GET", files_config, true );
http2.onreadystatechange = function ()
{
if ( http2.readyState == 4 && http2.status == 200 )
{
shell.files = eval ( '(' + http2.responseText + ')' );
// Remove duplicates
var tmp = new Array();
for ( var i in shell.files )
{
var contains = false;
for ( var j=0; j < tmp.length && !contains; j++ )
{
if ( shell.files[i].path == tmp[j].path )
{
contains = true;
}
}
if ( !contains )
{
tmp.push ( shell.files[i] );
}
}
shell.files = tmp;
}
}
http2.send ( null );
shell.cmdOut.innerHTML = '';
}
shell.cmdOut.innerHTML = http.responseText;
shell.refreshFiles();
shell.refreshPrompt ( false, false );
shell.auto_prompt_focus = true;
shell.auto_prompt_refresh = true;

@ -0,0 +1,73 @@
{
"name" : "mv",
"info" : {
"syntax" : "mv &lt;source file&gt; &lt;destination file&gt;",
"brief" : "Move a file to another",
},
"action" : function ( arg )
{
var src = null;
var dest = null;
if ( !arg || arg.length == 0 )
{
return "Usage: " + this.info.syntax + "<br/>\n";
}
if ( arg.match ( /^\s*('|")([^'|"]+)('|")/ ))
{
src = RegExp.$2;
arg = arg.replace ( new RegExp ( '^\s*' + RegExp.$1 + RegExp.$2 + RegExp.$3 + '\s*' ), '' );
} else if ( arg.match ( /^\s*([^\s]+)/ )) {
src = RegExp.$1;
arg = arg.replace ( new RegExp ( '^\s*' + RegExp.$1 + '\s*' ), '' );
} else {
return "Usage: " + this.info.syntax + "<br/>\n";
}
if ( !src || arg.length == 0 )
{
return "Usage: " + this.info.syntax + "<br/>\n";
}
if ( arg.match ( /^\s*('|")([^'|"]+)('|")/ ))
{
dest = RegExp.$2;
} else {
arg.match ( /^\s*(.*)$/ );
dest = RegExp.$1;
}
src = shell.expandPath ( src );
dest = shell.expandPath ( dest );
shell.auto_prompt_refresh = false;
var users_php = window.location.href;
users_php = users_php.replace ( /\/([a-zA-Z\.]+)$/, '/modules/users/users.php' );
params = 'action=mv&src=' + escape ( src ) + '&dest=' + escape ( dest );
var http = new XMLHttpRequest();
http.open ( "POST", users_php, true );
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.setRequestHeader("Content-length", params.length);
http.setRequestHeader("Connection", "close");
http.onreadystatechange = function ()
{
if ( http.readyState == 4 && http.status == 200 )
{
shell.cmdOut.innerHTML = http.responseText;
shell.refreshFiles();
shell.refreshPrompt ( false, false );
shell.auto_prompt_refresh = true;
}
}
http.send ( params );
shell.cmdOut.innerHTML = '';
}
}

@ -388,46 +388,8 @@
if ( http.responseText.length > 0 )
{
shell.editor_status.innerHTML = http.responseText;
shell.refreshFiles();
setTimeout ( 'shell.editor_status.innerHTML = shell.default_editor_status', 1500 );
var files_config = window.location.href;
files_config = files_config.replace ( /\/([a-zA-Z\.]+)$/, '/modules/users/files.php' );
var http2 = new XMLHttpRequest();
http2.open ( "GET", files_config, true );
http2.onreadystatechange = function ()
{
if ( http2.readyState == 4 && http2.status == 200 )
{
shell.files = eval ( '(' + http2.responseText + ')' );
// Remove duplicates
var tmp = new Array();
for ( var i in shell.files )
{
var contains = false;
for ( var j=0; j < tmp.length && !contains; j++ )
{
if ( shell.files[i].path == tmp[j].path )
{
contains = true;
}
}
if ( !contains )
{
tmp.push ( shell.files[i] );
}
}
shell.files = tmp;
}
}
http2.send ( null );
}
}
}

@ -72,13 +72,7 @@
{
if ( http.readyState == 4 && http.status == 200 )
{
if ( http.responseText.length > 0 )
{
shell.cmdOut.innerHTML = http.responseText;
} else {
shell.cmdOut.innerHTML = '';
}
shell.cmdOut.innerHTML = http.responseText;
shell.refreshPrompt ( false, false );
}
}

@ -31,51 +31,8 @@
{
if ( http.readyState == 4 && http.status == 200 )
{
if ( http.responseText.length > 0 )
{
shell.cmdOut.innerHTML = http.responseText;
} else {
var files_config = window.location.href;
files_config = files_config.replace ( /\/([a-zA-Z\.]+)$/, '/modules/users/files.php' );
var http2 = new XMLHttpRequest();
http2.open ( "GET", files_config, true );
http2.onreadystatechange = function ()
{
if ( http2.readyState == 4 && http2.status == 200 )
{
shell.files = eval ( '(' + http2.responseText + ')' );
// Remove duplicates
var tmp = new Array();
for ( var i in shell.files )
{
var contains = false;
for ( var j=0; j < tmp.length && !contains; j++ )
{
if ( shell.files[i].path == tmp[j].path )
{
contains = true;
}
}
if ( !contains )
{
tmp.push ( shell.files[i] );
}
}
shell.files = tmp;
}
}
http2.send ( null );
shell.cmdOut.innerHTML = '';
}
shell.cmdOut.innerHTML = http.responseText;
shell.refreshFiles();
shell.refreshPrompt ( false, false );
shell.auto_prompt_focus = true;
shell.auto_prompt_refresh = true;

@ -31,51 +31,8 @@
{
if ( http.readyState == 4 && http.status == 200 )
{
if ( http.responseText.length > 0 )
{
shell.cmdOut.innerHTML = http.responseText;
} else {
var files_config = window.location.href;
files_config = files_config.replace ( /\/([a-zA-Z\.]+)$/, '/modules/users/files.php' );
var http2 = new XMLHttpRequest();
http2.open ( "GET", files_config, true );
http2.onreadystatechange = function ()
{
if ( http2.readyState == 4 && http2.status == 200 )
{
shell.files = eval ( '(' + http2.responseText + ')' );
// Remove duplicates
var tmp = new Array();
for ( var i in shell.files )
{
var contains = false;
for ( var j=0; j < tmp.length && !contains; j++ )
{
if ( shell.files[i].path == tmp[j].path )
{
contains = true;
}
}
if ( !contains )
{
tmp.push ( shell.files[i] );
}
}
shell.files = tmp;
}
}
http2.send ( null );
shell.cmdOut.innerHTML = '';
}
shell.cmdOut.innerHTML = http.responseText;
shell.refreshFiles();
shell.refreshPrompt ( false, false );
shell.auto_prompt_focus = true;
shell.auto_prompt_refresh = true;

@ -73,45 +73,7 @@
{
var user = RegExp.$1;
shell.user = user;
var files_config = window.location.href;
files_config = files_config.replace ( /\/([a-zA-Z\.]+)$/, '/modules/users/files.php' );
var http2 = new XMLHttpRequest();
http2.open ( "GET", files_config, true );
http2.onreadystatechange = function ()
{
if ( http2.readyState == 4 && http2.status == 200 )
{
shell.files = eval ( '(' + http2.responseText + ')' );
// Remove duplicates
var tmp = new Array();
for ( var i in shell.files )
{
var contains = false;
for ( var j=0; j < tmp.length && !contains; j++ )
{
if ( shell.files[i].path == tmp[j].path )
{
contains = true;
}
}
if ( !contains )
{
tmp.push ( shell.files[i] );
}
}
shell.files = tmp;
}
}
http2.send ( null );
shell.refreshFiles();
var xml2 = new XMLHttpRequest();
xml2.open ( "POST", users_php, true );

@ -31,51 +31,8 @@
{
if ( http.readyState == 4 && http.status == 200 )
{
if ( http.responseText.length > 0 )
{
shell.cmdOut.innerHTML = http.responseText;
} else {
var files_config = window.location.href;
files_config = files_config.replace ( /\/([a-zA-Z\.]+)$/, '/modules/users/files.php' );
var http2 = new XMLHttpRequest();
http2.open ( "GET", files_config, true );
http2.onreadystatechange = function ()
{
if ( http2.readyState == 4 && http2.status == 200 )
{
shell.files = eval ( '(' + http2.responseText + ')' );
// Remove duplicates
var tmp = new Array();
for ( var i in shell.files )
{
var contains = false;
for ( var j=0; j < tmp.length && !contains; j++ )
{
if ( shell.files[i].path == tmp[j].path )
{
contains = true;
}
}
if ( !contains )
{
tmp.push ( shell.files[i] );
}
}
shell.files = tmp;
}
}
http2.send ( null );
shell.cmdOut.innerHTML = '';
}
shell.cmdOut.innerHTML = http.responseText;
shell.refreshFiles();
shell.refreshPrompt ( false, false );
shell.auto_prompt_focus = true;
shell.auto_prompt_refresh = true;

@ -59,13 +59,7 @@
{
if ( http.readyState == 4 && http.status == 200 )
{
if ( http.responseText.length > 0 )
{
shell.cmdOut.innerHTML = http.responseText;
} else {
shell.cmdOut.innerHTML = '';
}
shell.cmdOut.innerHTML = http.responseText;
shell.auto_prompt_focus = true;
shell.auto_prompt_refresh = true;
shell.refreshPrompt ( false, false );

@ -29,11 +29,7 @@
{
if ( http.readyState == 4 && http.status == 200 )
{
if ( http.responseText.length > 0 )
{
shell.cmdOut.innerHTML = http.responseText;
}
shell.cmdOut.innerHTML = http.responseText;
shell.auto_prompt_refresh = true;
shell.refreshPrompt ( false, false );
}

@ -23,11 +23,7 @@
{
if ( http.readyState == 4 && http.status == 200 )
{
if ( http.responseText.length > 0 )
{
shell.cmdOut.innerHTML = http.responseText;
}
shell.cmdOut.innerHTML = http.responseText;
shell.auto_prompt_refresh = true;
shell.refreshPrompt ( false, false );
}

@ -318,6 +318,111 @@ function __link ( $resource, $link, $type )
return "Unable to link the resource";
}
function __cp ( $src, $dest )
{
include "../../system/files_json.php";
if ( !$files_json || strlen ( $files_json ) == 0 )
{
return 'Error: Empty JSON file container';
}
$json = json_decode ( $files_json, true );
if ( !$json )
{
return 'Error: Empty JSON file container';
}
$src_index = -1;
$dest_index = -1;
for ( $i=0; $i < count ( $json ) && ( $src_index == -1 || $dest_index == -1 ); $i++ )
{
if ( $json[$i]['path'] == $src )
{
$src_index = $i;
}
if ( $json[$i]['path'] == $dest )
{
$dest_index = $i;
}
}
if ( $src_index == -1 )
{
$src = str_replace ( '<', '&lt;', $src );
$src = str_replace ( '>', '&gt;', $src );
return "cp: Cannot stat ".$src.": No such file or directory\n";
}
if ( $dest_index == -1 )
{
$ret = __touch ( $dest, null );
if ( strlen ( $ret ) > 0 )
{
return $ret;
}
include "../../system/files_json.php";
if ( !$files_json || strlen ( $files_json ) == 0 )
{
return 'Error: Empty JSON file container';
}
$json = json_decode ( $files_json, true );
if ( !$json )
{
return 'Error: Empty JSON file container';
}
for ( $i=0; $i < count ( $json ) && $dest_index == -1; $i++ )
{
$out .= $json[$i]['path']. ", ";
if ( $json[$i]['path'] == $dest )
{
$dest_index = $i;
}
}
}
if ( $dest_index == -1 )
{
$dest = str_replace ( '<', '&lt;', $dest );
$dest = str_replace ( '>', '&gt;', $dest );
return "cp: Could not create the file $dest\n";
}
foreach ( array_keys ( $json[$dest_index] ) as $key )
{
if ( $key != 'path' )
{
unset ( $json[$dest_index][$key] );
}
}
foreach ( array_keys ( $json[$src_index] ) as $key )
{
if ( $key != 'path' )
{
$json[$dest_index][$key] = $json[$src_index][$key];
}
}
if ( !( $fp = fopen ( "../../system/files_json.php", "w" )))
{
return "Unable to write on directories file\n";
}
fwrite ( $fp, "<?php\n\n\$files_json = <<<JSON\n".__json_encode ( $json )."\nJSON;\n\n?>");
fclose ( $fp );
return false;
}
function __json_encode( $data ) {
if ( is_array ($data) || is_object ($data) ) {
$islist = is_array ($data) && ( empty ($data) || array_keys ($data) === range (0,count($data)-1) );

@ -394,6 +394,25 @@ switch ( $action )
print __link ( $resource, $link, $type );
break;
case 'cp':
case 'mv':
$src = $_REQUEST['src'];
$dest = $_REQUEST['dest'];
if ( !( $src && $dest ))
{
return false;
}
print __cp ( $src, $dest );
if ( $action == 'mv' )
{
print __rm ( $src );
}
break;
default :
print "Unallowed action\n";
break;

@ -400,11 +400,7 @@ function blash ()
var outDiv = document.createElement ( 'span' );
outDiv.innerHTML = text;
//outDiv.innerHTML = ((value.length > 0) ? value : '') +
// ( value.match ( /<br\/?>\s*$/ ) ? '' : '<br/>' ) + ((out.length > 0) ? (out + '<br/>') : '') + text + (( shell.__first_cmd ) ? '<br/>' : '' );
//outDiv.innerHTML = outDiv.innerHTML.replace ( /<br\/?>\s*$/, '' );
this.window.insertBefore ( outDiv, document.getElementsByName ( "blashPrompt" )[0] );
// this.window.appendChild ( outDiv );
return false;
} else if ( key == 13 || key == 10 || ( key == 67 && evt.ctrlKey )) {
@ -942,5 +938,50 @@ function blash ()
return false;
}
/**
* \brief Refresh the file list for the current user
*/
this.refreshFiles = function ()
{
var files_config = window.location.href;
files_config = files_config.replace ( /\/([a-zA-Z\.]+)$/, '/modules/users/files.php' );
var http = new XMLHttpRequest();
http.open ( "GET", files_config, true );
http.onreadystatechange = function ()
{
if ( http.readyState == 4 && http.status == 200 )
{
shell.files = eval ( '(' + http.responseText + ')' );
// Remove duplicates
var tmp = new Array();
for ( var i in shell.files )
{
var contains = false;
for ( var j=0; j < tmp.length && !contains; j++ )
{
if ( shell.files[i].path == tmp[j].path )
{
contains = true;
}
}
if ( !contains )
{
tmp.push ( shell.files[i] );
}
}
shell.files = tmp;
}
}
http.send ( null );
}
}

@ -55,6 +55,7 @@
"commands" : [
"cat",
"cd",
"cp",
"chmod",
"clear",
"echo",
@ -66,6 +67,7 @@
"ls",
"man",
"mkdir",
"mv",
"nano",
"passwd",
"pwd",

@ -24,11 +24,11 @@ $files_json = <<<JSON
, {"path": "/tutorials/tut1", "type": "file", "href": "/software/tut1.pdf"}
, {"path": "/tutorials/tut2", "type": "file", "href": "/software/tut2.pdf"}
, {"path": "/github", "type": "file", "href": "https://github.com/BlackLight/blash"}
, {"path": "/aboutme", "type": "file", "content": "Luke, I am your father"}
, {"path": "/contacts", "type": "file", "content": "Contact me at spam@montypython.com"}
, {"path": "/irc", "type": "file", "content": "IRC channel at #thegame@irc.randomstuff.com"}
, {"path": "/root", "type": "directory", "can_write": "root", "can_read": "root"}
, {"path": "/google", "type": "file", "owner": "root", "can_read": "@all", "can_write": "root", "href": "http://www.google.com"}
, {"path": "/aboutme", "type": "file", "content": "Luke, I am your father"}
]
JSON;

Loading…
Cancel
Save