mirror of
https://github.com/xevidos/codiad.git
synced 2024-11-10 21:26:35 +01:00
Continued implementation of new permissions systems and new table structures
This commit is contained in:
parent
a377b4dddd
commit
825154a4b3
@ -113,8 +113,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Assuming the mode file has no dependencies
|
// Assuming the mode file has no dependencies
|
||||||
$.loadScript( 'components/editor/ace-editor/mode-' + mode.name + '.js',
|
$.loadScript( 'components/editor/ace-editor/mode-' + mode.name + '.js', fn );
|
||||||
fn );
|
|
||||||
},
|
},
|
||||||
|
|
||||||
init: function() {
|
init: function() {
|
||||||
|
@ -78,6 +78,8 @@ class Filemanager extends Common {
|
|||||||
);
|
);
|
||||||
$path = self::formatPath( $path );
|
$path = self::formatPath( $path );
|
||||||
|
|
||||||
|
if( Permissions::has_create( $path ) ) {
|
||||||
|
|
||||||
// Create file
|
// Create file
|
||||||
if( $type == "file" ) {
|
if( $type == "file" ) {
|
||||||
|
|
||||||
@ -116,6 +118,11 @@ class Filemanager extends Common {
|
|||||||
$response["message"] = "Directory Already Exists";
|
$response["message"] = "Directory Already Exists";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
$response["status"] = "error";
|
||||||
|
$response["message"] = "You do not have permission to create files in this project";
|
||||||
|
}
|
||||||
return $response;
|
return $response;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -354,13 +361,15 @@ class Filemanager extends Common {
|
|||||||
$paths[] = array(
|
$paths[] = array(
|
||||||
|
|
||||||
"basename" => $path_info["basename"],
|
"basename" => $path_info["basename"],
|
||||||
"children" => $this->index_path( $p ),
|
//"children" => $this->index_path( $p ),
|
||||||
|
"children" => array(),
|
||||||
"dirname" => str_replace( WORKSPACE . "/", "", $p ),
|
"dirname" => str_replace( WORKSPACE . "/", "", $p ),
|
||||||
"extension" => null,
|
"extension" => null,
|
||||||
"filename" => $path_info["filename"],
|
"filename" => $path_info["filename"],
|
||||||
"full_dirname" => $path_info["dirname"],
|
"full_dirname" => $path_info["dirname"],
|
||||||
"full_path" => $p,
|
"full_path" => $p,
|
||||||
"path" => str_replace( WORKSPACE . "/", "", $p ),
|
"path" => str_replace( WORKSPACE . "/", "", $p ),
|
||||||
|
"type" => "directory",
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
@ -370,6 +379,7 @@ class Filemanager extends Common {
|
|||||||
"extension" => isset( $path_info["extension"] ) ? $path_info["extension"] : null,
|
"extension" => isset( $path_info["extension"] ) ? $path_info["extension"] : null,
|
||||||
"filename" => $path_info["filename"],
|
"filename" => $path_info["filename"],
|
||||||
"path" => str_replace( WORKSPACE . "/", "", $p ),
|
"path" => str_replace( WORKSPACE . "/", "", $p ),
|
||||||
|
"type" => "file",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -377,9 +387,28 @@ class Filemanager extends Common {
|
|||||||
}
|
}
|
||||||
|
|
||||||
closedir( $handle );
|
closedir( $handle );
|
||||||
|
usort( $paths, array( $this, "sorter" ) );
|
||||||
return $paths;
|
return $paths;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function sorter( $a, $b ) {
|
||||||
|
|
||||||
|
$basename = strnatcmp( $a["basename"], $b["basename"] );
|
||||||
|
$type = strnatcmp( $a["type"], $b["type"] );
|
||||||
|
$result = 0;
|
||||||
|
|
||||||
|
if( $type == 0 ) {
|
||||||
|
|
||||||
|
$result = $basename;
|
||||||
|
} else {
|
||||||
|
|
||||||
|
$result = $type;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////
|
||||||
// MODIFY (Modifies a file name/contents or directory name)
|
// MODIFY (Modifies a file name/contents or directory name)
|
||||||
//////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////
|
||||||
@ -398,6 +427,13 @@ class Filemanager extends Common {
|
|||||||
$content = ''; // Blank out file
|
$content = ''; // Blank out file
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( ! Permissions::has_write( $path ) ) {
|
||||||
|
|
||||||
|
$response["status"] = "error";
|
||||||
|
$response["message"] = "You do not have access to write to this file.";
|
||||||
|
return $response;
|
||||||
|
}
|
||||||
|
|
||||||
if( $patch && ! $mtime ) {
|
if( $patch && ! $mtime ) {
|
||||||
|
|
||||||
$response["status"] = "error";
|
$response["status"] = "error";
|
||||||
@ -530,6 +566,7 @@ class Filemanager extends Common {
|
|||||||
$response["data"] = array(
|
$response["data"] = array(
|
||||||
"content" => $output,
|
"content" => $output,
|
||||||
"mtime" => filemtime( $path ),
|
"mtime" => filemtime( $path ),
|
||||||
|
"read_only" => ( ! Permissions::has_write( $path ) ),
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
@ -193,10 +193,9 @@
|
|||||||
console.log( data );
|
console.log( data );
|
||||||
let response = codiad.jsend.parse( data );
|
let response = codiad.jsend.parse( data );
|
||||||
console.log( response );
|
console.log( response );
|
||||||
/*parent = path.split( '/' );
|
parent = path.split( '/' );
|
||||||
parent.pop();
|
parent.pop();
|
||||||
_this.rescan( parent.join( '/' ) );
|
_this.rescan( parent.join( '/' ) );
|
||||||
*/
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -446,6 +445,7 @@
|
|||||||
//////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
opened_folders: [],
|
opened_folders: [],
|
||||||
|
indexFiles: [],
|
||||||
|
|
||||||
index: function( path, rescan ) {
|
index: function( path, rescan ) {
|
||||||
|
|
||||||
@ -475,14 +475,16 @@
|
|||||||
_this.opened_folders.push( path );
|
_this.opened_folders.push( path );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( open && ! rescan ) {
|
if( node.hasClass( 'open' ) && ! rescan ) {
|
||||||
|
|
||||||
node.parent( 'li' )
|
node.parent( 'li' )
|
||||||
.children( 'ul' )
|
.children( 'ul' )
|
||||||
.slideUp( 300, function() {
|
.slideUp( 300, function() {
|
||||||
$( this )
|
|
||||||
.remove();
|
$( this ).remove();
|
||||||
node.removeClass( 'open' );
|
node.removeClass( 'open' );
|
||||||
|
node.parent().children( 'span' ).removeClass( 'minus' ).addClass( 'plus' );
|
||||||
|
node.parent().children().find( 'span' ).removeClass( 'minus' ).addClass( 'plus' );
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
@ -491,6 +493,7 @@
|
|||||||
|
|
||||||
node.addClass( 'open' );
|
node.addClass( 'open' );
|
||||||
let response = codiad.jsend.parse( data );
|
let response = codiad.jsend.parse( data );
|
||||||
|
|
||||||
console.log( response );
|
console.log( response );
|
||||||
|
|
||||||
if( response != 'error' ) {
|
if( response != 'error' ) {
|
||||||
@ -504,13 +507,6 @@
|
|||||||
|
|
||||||
if( Object.keys( files ).length > 0 ) {
|
if( Object.keys( files ).length > 0 ) {
|
||||||
|
|
||||||
let expanded = parentNode.children( 'span' ).hasClass( 'plus' );
|
|
||||||
|
|
||||||
if( expanded ) {
|
|
||||||
|
|
||||||
parentNode.children( 'span' ).removeClass( 'plus' ).addClass( 'minus' );
|
|
||||||
}
|
|
||||||
|
|
||||||
let display = 'display:none;';
|
let display = 'display:none;';
|
||||||
let container = $( '<ul></ul>' );
|
let container = $( '<ul></ul>' );
|
||||||
|
|
||||||
|
@ -43,76 +43,68 @@ class Project extends Common {
|
|||||||
// NEW METHODS
|
// NEW METHODS
|
||||||
//////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
public function add_project( $project_name, $project_path, $owner = null ) {
|
public function add_project( $project_name, $project_path, $owner ) {
|
||||||
|
|
||||||
global $sql;
|
global $sql;
|
||||||
if( $owner == null ) {
|
|
||||||
|
|
||||||
$owner = -1;
|
|
||||||
} else {
|
|
||||||
|
|
||||||
$owner = $_SESSION["user_id"];
|
|
||||||
}
|
|
||||||
|
|
||||||
$query = "INSERT INTO projects( name, path, owner ) VALUES ( ?, ?, ? );";
|
$query = "INSERT INTO projects( name, path, owner ) VALUES ( ?, ?, ? );";
|
||||||
$bind_variables = array( $project_name, $project_path, $owner );
|
$bind_variables = array( $project_name, $project_path, $owner );
|
||||||
$return = $sql->query( $query, $bind_variables, 0, "rowCount" );
|
$return = $sql->query( $query, $bind_variables, 0, "rowCount" );
|
||||||
|
return $return;
|
||||||
if( ! ( $return > 0 ) ) {
|
|
||||||
|
|
||||||
exit( formatJSEND( "error", "Error creating project $project_name" ) );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function add_user() {
|
public function add_user( $path, $user_id, $access ) {
|
||||||
|
|
||||||
global $sql;
|
global $sql;
|
||||||
|
$return = array(
|
||||||
|
"status" => null,
|
||||||
|
"message" => null,
|
||||||
|
);
|
||||||
$query = "SELECT * FROM projects WHERE path=? AND owner=? LIMIT 1";
|
$query = "SELECT * FROM projects WHERE path=? AND owner=? LIMIT 1";
|
||||||
$bind_variables = array( $this->path, $_SESSION["user_id"] );
|
$bind_variables = array( $path, $_SESSION["user_id"] );
|
||||||
$project = $sql->query( $query, $bind_variables, array(), "fetch" );
|
$project = $sql->query( $query, $bind_variables, array(), "fetch" );
|
||||||
|
|
||||||
if( empty( $project ) ) {
|
if( empty( $project ) ) {
|
||||||
|
|
||||||
exit( formatJSEND( "error", "Error fetching projects." ) );
|
$return["status"] = "error";
|
||||||
}
|
$return["message"] = "Error fetching projects.";
|
||||||
|
} else {
|
||||||
|
|
||||||
$user_id = get_user_id( $this->user );
|
$user = $sql->query( "SELECT * FROM access WHERE project = ? AND user = ? LIMIT 1", array( $project["id"], $user_id ), array(), "fetch" );
|
||||||
|
|
||||||
if( $user_id === false ) {
|
|
||||||
|
|
||||||
exit( formatJSEND( "error", "Error fetching user information." ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
$user = $sql->query( "SELECT * FROM access WHERE project = ? AND user = ?", array( $project["id"], $user_id ), array(), "fetch" );
|
|
||||||
|
|
||||||
if( ! empty( $user ) ) {
|
if( ! empty( $user ) ) {
|
||||||
|
|
||||||
$query = "UPDATE access SET level=? WHERE project=? AND user=?;";
|
$query = "UPDATE access SET level=? WHERE project=? AND user=?;";
|
||||||
$bind_variables = array( $this->access, $project["id"], $user_id );
|
$bind_variables = array( $access, $project["id"], $user_id );
|
||||||
$result = $sql->query( $query, $bind_variables, 0, "rowCount" );
|
$result = $sql->query( $query, $bind_variables, 0, "rowCount" );
|
||||||
|
|
||||||
if( $result > 0 ) {
|
if( $result > 0 ) {
|
||||||
|
|
||||||
echo formatJSEND( "success", "Successfully updated {$this->user}." );
|
$return["status"] = "success";
|
||||||
|
$return["message"] = "Successfully updated access.";
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
echo formatJSEND( "error", "Error setting access for project." );
|
$return["status"] = "error";
|
||||||
|
$return["message"] = "Error setting access for project.";
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
$query = "INSERT INTO access ( project, user, level ) VALUES ( ?,?,? );";
|
$query = "INSERT INTO access ( project, user, level ) VALUES ( ?,?,? );";
|
||||||
$bind_variables = array( $project["id"], $user_id, $this->access );
|
$bind_variables = array( $project["id"], $user_id, $access );
|
||||||
$result = $sql->query( $query, $bind_variables, 0, "rowCount" );
|
$result = $sql->query( $query, $bind_variables, 0, "rowCount", "exception" );
|
||||||
|
|
||||||
if( $result > 0 ) {
|
if( $result > 0 ) {
|
||||||
|
|
||||||
echo formatJSEND( "success", "Successfully added {$this->user}." );
|
$return["status"] = "success";
|
||||||
|
$return["message"] = "Successfully updated access.";
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
echo formatJSEND( "error", "Error setting access for project." );
|
$return["status"] = "error";
|
||||||
|
$return["message"] = "Error setting access for project.";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
public function check_duplicate( $full_path ) {
|
public function check_duplicate( $full_path ) {
|
||||||
|
|
||||||
@ -397,26 +389,39 @@ class Project extends Common {
|
|||||||
// Create
|
// Create
|
||||||
//////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
public function Create() {
|
public function Create( $path, $name, $public ) {
|
||||||
|
|
||||||
if ( $this->name != '' && $this->path != '' ) {
|
$return = array(
|
||||||
|
"status" => null,
|
||||||
|
"message" => null,
|
||||||
|
);
|
||||||
|
|
||||||
$this->path = $this->cleanPath();
|
if( $public === true ) {
|
||||||
$this->name = htmlspecialchars( $this->name );
|
|
||||||
if ( ! $this->isAbsPath( $this->path ) ) {
|
|
||||||
|
|
||||||
$this->path = $this->SanitizePath();
|
$owner = -1;
|
||||||
|
} else {
|
||||||
|
|
||||||
|
$owner = $_SESSION["user_id"];
|
||||||
}
|
}
|
||||||
if ( $this->path != '' ) {
|
|
||||||
|
if ( $name != '' && $path != '' ) {
|
||||||
|
|
||||||
|
$path = $this->clean_path( $path );
|
||||||
|
$name = htmlspecialchars( $name );
|
||||||
|
if ( ! $this->isAbsPath( $path ) ) {
|
||||||
|
|
||||||
|
$path = $this->sanitize_path( $path );
|
||||||
|
}
|
||||||
|
if ( $path != '' ) {
|
||||||
|
|
||||||
$user_path = WORKSPACE . '/' . preg_replace( '/[^\w-]/', '', strtolower( $_SESSION["user"] ) );
|
$user_path = WORKSPACE . '/' . preg_replace( '/[^\w-]/', '', strtolower( $_SESSION["user"] ) );
|
||||||
|
|
||||||
if( ! $this->isAbsPath( $this->path ) ) {
|
if( ! $this->isAbsPath( $path ) ) {
|
||||||
|
|
||||||
$this->path = $_SESSION["user"] . '/' . $this->path;
|
$path = $_SESSION["user"] . '/' . $path;
|
||||||
}
|
}
|
||||||
|
|
||||||
$pass = $this->check_duplicate( $this->path );
|
$pass = $this->check_duplicate( $path );
|
||||||
if ( $pass ) {
|
if ( $pass ) {
|
||||||
|
|
||||||
if( ! is_dir( $user_path ) ) {
|
if( ! is_dir( $user_path ) ) {
|
||||||
@ -424,78 +429,87 @@ class Project extends Common {
|
|||||||
mkdir( $user_path, 0755, true );
|
mkdir( $user_path, 0755, true );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ! $this->isAbsPath( $this->path ) ) {
|
if ( ! $this->isAbsPath( $path ) ) {
|
||||||
|
|
||||||
if( ! is_dir( WORKSPACE . '/' . $this->path ) ) {
|
if( ! is_dir( WORKSPACE . '/' . $path ) ) {
|
||||||
|
|
||||||
mkdir( WORKSPACE . '/' . $this->path );
|
mkdir( WORKSPACE . '/' . $path );
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
if( ! is_admin() ) {
|
if( is_admin() ) {
|
||||||
|
|
||||||
die( formatJSEND( "error", "Absolute Paths are only allowed for admins" ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( defined( 'WHITEPATHS' ) ) {
|
if ( defined( 'WHITEPATHS' ) ) {
|
||||||
|
|
||||||
$allowed = false;
|
$allowed = false;
|
||||||
foreach ( explode( ",", WHITEPATHS ) as $whitepath ) {
|
foreach ( explode( ",", WHITEPATHS ) as $whitepath ) {
|
||||||
|
|
||||||
if ( strpos( $this->path, $whitepath ) === 0 ) {
|
if ( strpos( $path, $whitepath ) === 0 ) {
|
||||||
|
|
||||||
$allowed = true;
|
$allowed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( ! $allowed ) {
|
if ( ! $allowed ) {
|
||||||
|
|
||||||
die( formatJSEND( "error", "Absolute Path Only Allowed for " . WHITEPATHS ) );
|
$return["status"] = "error";
|
||||||
|
$return["message"] = "Absolute Path Only Allowed for " . WHITEPATHS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( ! file_exists( $this->path ) ) {
|
if ( ! file_exists( $path ) ) {
|
||||||
|
|
||||||
if ( ! mkdir( $this->path . '/', 0755, true ) ) {
|
if ( ! mkdir( $path . '/', 0755, true ) ) {
|
||||||
|
|
||||||
die( formatJSEND( "error", "Unable to create Absolute Path" ) );
|
$return["status"] = "error";
|
||||||
|
$return["message"] = "Unable to create Absolute Path";
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
if ( ! is_writable( $this->path ) || ! is_readable( $this->path ) ) {
|
if ( ! is_writable( $path ) || ! is_readable( $path ) ) {
|
||||||
|
|
||||||
die( formatJSEND( "error", "No Read/Write Permission" ) );
|
$return["status"] = "error";
|
||||||
|
$return["message"] = "No Read/Write Permission";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
$this->projects[] = array( "name" => $this->name, "path" => $this->path );
|
|
||||||
$this->add_project( $this->name, $this->path );
|
|
||||||
|
|
||||||
// Pull from Git Repo?
|
|
||||||
if ( $this->gitrepo && filter_var( $this->gitrepo, FILTER_VALIDATE_URL ) !== false ) {
|
|
||||||
|
|
||||||
$this->gitbranch = $this->SanitizeGitBranch();
|
|
||||||
if ( ! $this->isAbsPath( $this->path ) ) {
|
|
||||||
|
|
||||||
$this->command_exec = "cd " . escapeshellarg( WORKSPACE . '/' . $this->path ) . " && git init && git remote add origin " . escapeshellarg( $this->gitrepo ) . " && git pull origin " . escapeshellarg( $this->gitbranch );
|
|
||||||
} else {
|
|
||||||
|
|
||||||
$this->command_exec = "cd " . escapeshellarg( $this->path ) . " && git init && git remote add origin " . escapeshellarg( $this->gitrepo ) . " && git pull origin " . escapeshellarg( $this->gitbranch );
|
|
||||||
}
|
|
||||||
$this->ExecuteCMD();
|
|
||||||
}
|
|
||||||
|
|
||||||
exit( formatJSEND( "success", array( "name" => $this->name, "path" => $this->path ) ) );
|
|
||||||
} else {
|
|
||||||
|
|
||||||
exit( formatJSEND( "error", "A Project With the Same Name or Path Exists" ) );
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
exit( formatJSEND( "error", "Project Name/Folder not allowed" ) );
|
$return["status"] = "error";
|
||||||
|
$return["message"] = "Absolute Paths are only allowed for admins";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( $return["status"] == null ) {
|
||||||
|
|
||||||
|
$this->projects[] = array( "name" => $name, "path" => $path );
|
||||||
|
$result = $this->add_project( $name, $path, $owner );
|
||||||
|
|
||||||
|
if( $result > 0 ) {
|
||||||
|
|
||||||
|
$return["status"] = "success";
|
||||||
|
$return["message"] = "Created Project";
|
||||||
|
$return["data"] = array( "name" => $name, "path" => $path );
|
||||||
|
} else {
|
||||||
|
|
||||||
|
$return["status"] = "error";
|
||||||
|
$return["message"] = "A Project With the Same Name or Path Exists";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
exit( formatJSEND( "error", "Project Name/Folder is empty" ) );
|
$return["status"] = "error";
|
||||||
|
$return["message"] = "A Project With the Same Name or Path Exists";
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
$return["status"] = "error";
|
||||||
|
$return["message"] = "Project Name/Folder not allowed";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
$return["status"] = "error";
|
||||||
|
$return["message"] = "Project Name/Folder is empty";
|
||||||
|
}
|
||||||
|
|
||||||
|
return $return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////
|
||||||
@ -565,6 +579,12 @@ class Project extends Common {
|
|||||||
return preg_replace( '/[^\w-]/', '', strtolower( $sanitized ) );
|
return preg_replace( '/[^\w-]/', '', strtolower( $sanitized ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function sanitize_path( $path ) {
|
||||||
|
|
||||||
|
$sanitized = str_replace( " ", "_", $path );
|
||||||
|
return preg_replace( '/[^\w-]/', '', strtolower( $sanitized ) );
|
||||||
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////
|
||||||
// Clean Path
|
// Clean Path
|
||||||
//////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////
|
||||||
@ -583,31 +603,16 @@ class Project extends Common {
|
|||||||
return $path;
|
return $path;
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////
|
public function clean_path( $path ) {
|
||||||
// Execute Command
|
|
||||||
//////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
public function ExecuteCMD() {
|
// prevent Poison Null Byte injections
|
||||||
|
$path = str_replace( chr( 0 ), '', $path );
|
||||||
|
|
||||||
if ( function_exists( 'system' ) ) {
|
// prevent go out of the workspace
|
||||||
|
while( strpos( $path, '../' ) !== false ) {
|
||||||
|
|
||||||
ob_start();
|
$path = str_replace( '../', '', $path );
|
||||||
system( $this->command_exec );
|
|
||||||
ob_end_clean();
|
|
||||||
} elseif( function_exists( 'passthru' ) ) {
|
|
||||||
|
|
||||||
//passthru
|
|
||||||
ob_start();
|
|
||||||
passthru($this->command_exec);
|
|
||||||
ob_end_clean();
|
|
||||||
} elseif ( function_exists( 'exec' ) ) {
|
|
||||||
|
|
||||||
//exec
|
|
||||||
exec( $this->command_exec, $this->output );
|
|
||||||
} elseif ( function_exists( 'shell_exec' ) ) {
|
|
||||||
|
|
||||||
//shell_exec
|
|
||||||
shell_exec( $this->command_exec );
|
|
||||||
}
|
}
|
||||||
|
return $path;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -37,33 +37,31 @@ if( $_GET['action'] == 'add_user' ) {
|
|||||||
exit( formatJSEND( "error", "No access set." ) );
|
exit( formatJSEND( "error", "No access set." ) );
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
$Project->access = Permissions::LEVELS[$_GET['access']];
|
$access = Permissions::LEVELS[$_GET['access']];
|
||||||
}
|
}
|
||||||
|
|
||||||
if( isset( $_GET['username'] ) && ! in_array( $_GET['username'], $invalid_users ) ) {
|
if( isset( $_GET['user_id'] ) && ! in_array( $_GET['user_id'], $invalid_users ) ) {
|
||||||
|
|
||||||
$Project->user = $_GET['username'];
|
$user = $_GET['user_id'];
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
echo formatJSEND( "error", "No username set." );
|
exit( formatJSEND( "error", "No user id set." ) );
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( $_GET['project_path'] != '' ) {
|
if( isset( $_GET['project_path'] ) && $_GET['project_path'] != '' ) {
|
||||||
|
|
||||||
$Project->path = $_GET['project_path'];
|
$project = $_GET['project_path'];
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
echo formatJSEND( "error", "No project path set." );
|
exit( formatJSEND( "error", "No project path set." ) );
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( $Project->check_owner( $_GET["project_path"], true ) ) {
|
if( $Project->check_owner( $_GET['project_path'], true ) ) {
|
||||||
|
|
||||||
$Project->add_user();
|
return $Project->add_user( $project, $user, $access );
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
echo formatJSEND( "error", "You can not manage this project." );
|
exit( formatJSEND( "error", "You can not manage this project." ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,27 +72,11 @@ if( $_GET['action'] == 'add_user' ) {
|
|||||||
|
|
||||||
if( $_GET['action'] == 'create' ) {
|
if( $_GET['action'] == 'create' ) {
|
||||||
|
|
||||||
$Project->name = $_GET['project_name'];
|
$name = $_GET['project_name'];
|
||||||
|
$public = ( $_GET['public_project'] != 'true' ) ? false : true;
|
||||||
if( $_GET['public_project'] == 'true' ) {
|
$path = ( $_GET['project_path'] != '' ) ? $_GET['project_path'] : $_GET['project_name'];
|
||||||
|
$return = $Project->Create( $path, $name, $public );
|
||||||
$Project->public_project = true;
|
exit( json_encode( $return ) );
|
||||||
}
|
|
||||||
|
|
||||||
if( $_GET['project_path'] != '' ) {
|
|
||||||
|
|
||||||
$Project->path = $_GET['project_path'];
|
|
||||||
} else {
|
|
||||||
|
|
||||||
$Project->path = $_GET['project_name'];
|
|
||||||
}
|
|
||||||
// Git Clone?
|
|
||||||
if( ! empty( $_GET['git_repo'] ) ) {
|
|
||||||
|
|
||||||
$Project->gitrepo = $_GET['git_repo'];
|
|
||||||
$Project->gitbranch = $_GET['git_branch'];
|
|
||||||
}
|
|
||||||
$Project->Create();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////
|
||||||
|
@ -91,7 +91,7 @@ switch( $_GET['action'] ) {
|
|||||||
<td width="250"><?php echo($data['path']);?></td>
|
<td width="250"><?php echo($data['path']);?></td>
|
||||||
<?php
|
<?php
|
||||||
$owner = $Project->get_owner( $data['path'] );
|
$owner = $Project->get_owner( $data['path'] );
|
||||||
if( $owner == 'nobody' ) {
|
if( $owner == -1 ) {
|
||||||
|
|
||||||
?>
|
?>
|
||||||
<td width="70"><a onclick="codiad.message.error(i18n('Public projects can not be managed'));" class="icon-block bigger-icon"></a></td>
|
<td width="70"><a onclick="codiad.message.error(i18n('Public projects can not be managed'));" class="icon-block bigger-icon"></a></td>
|
||||||
@ -114,7 +114,7 @@ switch( $_GET['action'] ) {
|
|||||||
?>
|
?>
|
||||||
<td width="70"><a onclick="codiad.message.error(i18n('Active Project Cannot Be Removed'));" class="icon-block bigger-icon"></a></td>
|
<td width="70"><a onclick="codiad.message.error(i18n('Active Project Cannot Be Removed'));" class="icon-block bigger-icon"></a></td>
|
||||||
<?php
|
<?php
|
||||||
} elseif( $owner !== $_SESSION["user"] && $owner != -1 ) {
|
} elseif( $owner !== $_SESSION["user_id"] && $owner != -1 ) {
|
||||||
|
|
||||||
?>
|
?>
|
||||||
<td width="70"><a onclick="codiad.message.error(i18n('Projects owned by others can not be deleted'));" class="icon-block bigger-icon"></a></td>
|
<td width="70"><a onclick="codiad.message.error(i18n('Projects owned by others can not be deleted'));" class="icon-block bigger-icon"></a></td>
|
||||||
@ -229,7 +229,7 @@ switch( $_GET['action'] ) {
|
|||||||
foreach( $users as $user ) {
|
foreach( $users as $user ) {
|
||||||
|
|
||||||
?>
|
?>
|
||||||
<option value="<?php echo htmlentities( $user["username"] );?>"><?php echo htmlentities( $user["username"] );?></option>
|
<option value="<?php echo htmlentities( $user["id"] );?>"><?php echo htmlentities( $user["username"] );?></option>
|
||||||
<?php
|
<?php
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
@ -281,7 +281,7 @@ switch( $_GET['action'] ) {
|
|||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
</select>
|
</select>
|
||||||
<button class="btn-left" onclick="codiad.project.remove_user( '<?php echo htmlentities( $user["username"] );?>' );">Remove Access</button>
|
<button class="btn-left" onclick="codiad.project.remove_user( '<?php echo htmlentities( $user["id"] );?>' );">Remove Access</button>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<?php
|
<?php
|
||||||
|
@ -54,11 +54,11 @@
|
|||||||
add_user: function() {
|
add_user: function() {
|
||||||
|
|
||||||
let _this = this;
|
let _this = this;
|
||||||
let username = $( '#modal-content form select[name="user_list"]' ).val();
|
let id = $( '#modal-content form select[name="user_list"]' ).val();
|
||||||
let project_path = $( '#modal-content form input[name="project_path"]' ).val();
|
let project_path = $( '#modal-content form input[name="project_path"]' ).val();
|
||||||
let project_id = $( '#modal-content form input[name="project_id"]' ).val();
|
let project_id = $( '#modal-content form input[name="project_id"]' ).val();
|
||||||
|
|
||||||
$.get( _this.controller + '?action=add_user&project_path=' + encodeURIComponent( project_path ) + '&project_id=' + encodeURIComponent( project_id ) + '&username=' + encodeURIComponent( username ) + '&access=delete', function( data ) {
|
$.get( _this.controller + '?action=add_user&project_path=' + encodeURIComponent( project_path ) + '&project_id=' + encodeURIComponent( project_id ) + '&user_id=' + encodeURIComponent( id ) + '&access=delete', function( data ) {
|
||||||
|
|
||||||
response = codiad.jsend.parse( data );
|
response = codiad.jsend.parse( data );
|
||||||
console.log( response );
|
console.log( response );
|
||||||
@ -72,14 +72,14 @@
|
|||||||
change_access: function( e ) {
|
change_access: function( e ) {
|
||||||
|
|
||||||
let _this = codiad.project;
|
let _this = codiad.project;
|
||||||
let username = $( '#modal-content form select[name="user_list"]' ).val();
|
let id = $( '#modal-content form select[name="user_list"]' ).val();
|
||||||
let project_path = $( '#modal-content form input[name="project_path"]' ).val();
|
let project_path = $( '#modal-content form input[name="project_path"]' ).val();
|
||||||
let project_id = $( '#modal-content form input[name="project_id"]' ).val();
|
let project_id = $( '#modal-content form input[name="project_id"]' ).val();
|
||||||
let access = $( e.target ).children( "option:selected" ).val();
|
let access = $( e.target ).children( "option:selected" ).val();
|
||||||
|
|
||||||
console.log( access, username, project_path, project_id );
|
console.log( access, id, project_path, project_id );
|
||||||
|
|
||||||
$.get( _this.controller + '?action=add_user&path=' + encodeURIComponent( project_path ) + '&id=' + encodeURIComponent( project_id ) + '&username=' + encodeURIComponent( username ) + '&access=' + encodeURIComponent( access ), function( data ) {
|
$.get( _this.controller + '?action=add_user&project_path=' + encodeURIComponent( project_path ) + '&id=' + encodeURIComponent( project_id ) + '&user_id=' + encodeURIComponent( id ) + '&access=' + encodeURIComponent( access ), function( data ) {
|
||||||
|
|
||||||
let response = codiad.jsend.parse( data );
|
let response = codiad.jsend.parse( data );
|
||||||
console.log( response );
|
console.log( response );
|
||||||
|
@ -52,16 +52,13 @@ class User {
|
|||||||
$return = $sql->query( $query, $bind_variables, -1, "rowCount" );
|
$return = $sql->query( $query, $bind_variables, -1, "rowCount" );
|
||||||
if( $return > -1 ) {
|
if( $return > -1 ) {
|
||||||
|
|
||||||
//TODO: add new permissions system to delete cleanup
|
$query = "
|
||||||
|
DELETE FROM projects
|
||||||
$query = "DELETE FROM projects WHERE owner=? AND access IN ( ?,?,?,?,? );";
|
WHERE owner=( SELECT id FROM users WHERE username=? )
|
||||||
|
AND ( SELECT COUNT(*) FROM access WHERE project = projects.id AND WHERE user <> ( SELECT id FROM users WHERE username=? ) );";
|
||||||
$bind_variables = array(
|
$bind_variables = array(
|
||||||
$username,
|
$username,
|
||||||
"null",
|
$username
|
||||||
null,
|
|
||||||
"[]",
|
|
||||||
"",
|
|
||||||
json_encode( array( $username ) )
|
|
||||||
);
|
);
|
||||||
$return = $sql->query( $query, $bind_variables, -1, "rowCount" );
|
$return = $sql->query( $query, $bind_variables, -1, "rowCount" );
|
||||||
|
|
||||||
@ -296,16 +293,18 @@ class User {
|
|||||||
|
|
||||||
$username = self::CleanUsername( $username );
|
$username = self::CleanUsername( $username );
|
||||||
$password = $this->encrypt_password( $password );
|
$password = $this->encrypt_password( $password );
|
||||||
$this->add_user( $username, $password );
|
$result = $this->add_user( $username, $password, Permissions::SYSTEM_LEVELS["user"] );
|
||||||
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////
|
||||||
// Delete Account
|
// Delete Account
|
||||||
//////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
public function Delete() {
|
public function Delete( $username ) {
|
||||||
|
|
||||||
$this->delete_user();
|
$username = self::CleanUsername( $username );
|
||||||
|
return $this->delete_user( $username );
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////
|
||||||
|
@ -137,7 +137,12 @@ if( $_GET['action'] == 'create' ) {
|
|||||||
exit( formatJSEND( "error", "Invalid characters in username" ) );
|
exit( formatJSEND( "error", "Invalid characters in username" ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
$User->Create( $_POST['username'], $_POST['password'] );
|
$result = $User->Create( $_POST['username'], $_POST['password'] );
|
||||||
|
|
||||||
|
if( $result ) {
|
||||||
|
|
||||||
|
exit( formatJSEND( "success", "User successfully created." ) );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -151,11 +156,11 @@ if( $_GET['action'] == 'delete' ) {
|
|||||||
|
|
||||||
if( ! isset( $_GET['username'] ) ) {
|
if( ! isset( $_GET['username'] ) ) {
|
||||||
|
|
||||||
die( formatJSEND( "error", "Missing username" ) );
|
exit( formatJSEND( "error", "Missing username" ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
$User->username = User::CleanUsername( $_GET['username'] );
|
$return = $User->Delete( $_GET['username'] );
|
||||||
$User->Delete();
|
exit( json_encode( $return ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user