mirror of https://github.com/xevidos/codiad.git
Merge branch 'development' into 'admin-portal'
Update admin branch with latest dev updates See merge request xevidos/codiad!28
This commit is contained in:
commit
036c99cb4e
|
@ -1,4 +1,4 @@
|
|||
Codaid
|
||||
Codiad
|
||||
|
||||
This is the Telaaedifex team's custom version of Codiad. Codiad is a web-based IDE framework with a small footprint and minimal requirements.
|
||||
|
||||
|
@ -27,7 +27,7 @@ Task List:
|
|||
|
||||
* Add ability to login with LDAP
|
||||
* Add custom market
|
||||
* Add in new admin interface
|
||||
* Add in new admin interface ( Check admin-portal branch for progress )
|
||||
- Group Management
|
||||
- Permissions Management
|
||||
- Plugin Management
|
||||
|
@ -37,6 +37,7 @@ Task List:
|
|||
* Add if file could not be saved 5 times close the open file
|
||||
* Add multi level users. ( Projects for only certain groups, Permission levels )
|
||||
* Add mobile compatibility
|
||||
* Add support for more database systems and test ( MSSQL, Oracle, Postgre SQL, SQLite, etc )
|
||||
* Clean up update script
|
||||
* Re Add the language recognition system after recode
|
||||
|
||||
|
@ -47,6 +48,10 @@ Completed:
|
|||
* Add ability to center bottom of code
|
||||
* Add updating script
|
||||
* Add site renaming
|
||||
* Database Update
|
||||
- Added Mysql Support.
|
||||
- Project Updated to use PDO so future support for more database systems can be added.
|
||||
- Updated to store program data ( Not project data ) in databases.
|
||||
* Fix JS errors already showing
|
||||
* Remove Codiad autocomplete in favor of Ace's
|
||||
* Updated for PHP 7.2
|
29
common.php
29
common.php
|
@ -32,8 +32,7 @@ class Common {
|
|||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
public static function construct() {
|
||||
|
||||
global $cookie_lifetime;
|
||||
|
||||
$path = str_replace( "index.php", "", $_SERVER['SCRIPT_FILENAME'] );
|
||||
foreach ( array( "components", "plugins" ) as $folder ) {
|
||||
|
||||
|
@ -201,15 +200,9 @@ class Common {
|
|||
global $sql;
|
||||
$query = "SELECT COUNT( * ) FROM users WHERE username=? AND access=?;";
|
||||
$bind_variables = array( $_SESSION["user"], "admin" );
|
||||
$return = $sql->query( $query, $bind_variables, formatJSEND( "error", "Error checking user acess." ), 'fetchColumn' );
|
||||
|
||||
if( $return > 0 ) {
|
||||
|
||||
return( true );
|
||||
} else {
|
||||
|
||||
return( false );
|
||||
}
|
||||
$return = $sql->query( $query, $bind_variables, -1, 'fetchColumn' );
|
||||
$admin = ( $return > 0 );
|
||||
return $admin;
|
||||
}
|
||||
|
||||
public static function logout() {
|
||||
|
@ -301,12 +294,6 @@ class Common {
|
|||
public static function start_session() {
|
||||
|
||||
Common::construct();
|
||||
global $cookie_lifetime;
|
||||
|
||||
if( isset( $cookie_lifetime ) && $cookie_lifetime != "" ) {
|
||||
|
||||
ini_set( "session.cookie_lifetime", $cookie_lifetime );
|
||||
}
|
||||
|
||||
//Set a Session Name
|
||||
session_name( md5( BASE_PATH ) );
|
||||
|
@ -361,12 +348,6 @@ class Common {
|
|||
public static function startSession() {
|
||||
|
||||
Common::construct();
|
||||
global $cookie_lifetime;
|
||||
|
||||
if( isset( $cookie_lifetime ) && $cookie_lifetime != "" ) {
|
||||
|
||||
ini_set( "session.cookie_lifetime", $cookie_lifetime );
|
||||
}
|
||||
|
||||
//Set a Session Name
|
||||
session_name( md5( BASE_PATH ) );
|
||||
|
@ -644,7 +625,7 @@ class Common {
|
|||
// Wrapper for old method names
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
function is_admin() { Common::is_admin(); }
|
||||
function is_admin() { return Common::is_admin(); }
|
||||
function debug($message) { Common::debug($message); }
|
||||
function i18n($key, $args = array()) { echo Common::i18n($key, $args); }
|
||||
function get_i18n($key, $args = array()) { return Common::get_i18n($key, $args); }
|
||||
|
|
|
@ -69,7 +69,7 @@
|
|||
if( option != codiad.filemanager.auto_reload ) {
|
||||
|
||||
//codiad.auto_save.reload_interval();
|
||||
window.location.reload();
|
||||
window.location.reload( true );
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -509,7 +509,7 @@
|
|||
codiad.editor.getActive().removeEventListener( "change", _this.refreshPreview );
|
||||
return;
|
||||
}
|
||||
_this.preview.location.reload();
|
||||
_this.preview.location.reload( true );
|
||||
} catch( e ) {
|
||||
|
||||
console.log( e );
|
||||
|
|
|
@ -151,7 +151,7 @@ class Settings {
|
|||
}
|
||||
|
||||
if( ! empty( $return ) ) {
|
||||
|
||||
|
||||
$return = $return["value"];
|
||||
} else {
|
||||
|
||||
|
@ -208,26 +208,48 @@ class Settings {
|
|||
}
|
||||
}
|
||||
|
||||
public function update_option( $option, $value, $user_setting = null ) {
|
||||
public function update_option( $option, $value, $user_setting = true ) {
|
||||
|
||||
global $sql;
|
||||
$query = "INSERT INTO user_options ( name, username, value ) VALUES ( ?, ?, ? );";
|
||||
$bind_variables = array(
|
||||
$option,
|
||||
$this->username,
|
||||
$value,
|
||||
);
|
||||
$result = $sql->query( $query, $bind_variables, 0, "rowCount" );
|
||||
|
||||
if( $result == 0 ) {
|
||||
if( $user_setting == null ) {
|
||||
|
||||
$query = "UPDATE user_options SET value=? WHERE name=? AND username=?;";
|
||||
$query = "INSERT INTO options ( name, username, value ) VALUES ( ?, ? );";
|
||||
$bind_variables = array(
|
||||
$value,
|
||||
$option,
|
||||
$this->username,
|
||||
$value,
|
||||
);
|
||||
$result = $sql->query( $query, $bind_variables, 0, "rowCount" );
|
||||
|
||||
if( $result == 0 ) {
|
||||
|
||||
$query = "UPDATE options SET value=? WHERE name=?;";
|
||||
$bind_variables = array(
|
||||
$value,
|
||||
$option,
|
||||
);
|
||||
$result = $sql->query( $query, $bind_variables, 0, "rowCount" );
|
||||
}
|
||||
} else {
|
||||
|
||||
$query = "INSERT INTO user_options ( name, username, value ) VALUES ( ?, ?, ? );";
|
||||
$bind_variables = array(
|
||||
$option,
|
||||
$this->username,
|
||||
$value,
|
||||
);
|
||||
$result = $sql->query( $query, $bind_variables, 0, "rowCount" );
|
||||
|
||||
if( $result == 0 ) {
|
||||
|
||||
$query = "UPDATE user_options SET value=? WHERE name=? AND username=?;";
|
||||
$bind_variables = array(
|
||||
$value,
|
||||
$option,
|
||||
$this->username,
|
||||
);
|
||||
$result = $sql->query( $query, $bind_variables, 0, "rowCount" );
|
||||
}
|
||||
}
|
||||
|
||||
if( $result > 0 ) {
|
||||
|
|
|
@ -24,7 +24,7 @@ class Update {
|
|||
public $archive = "";
|
||||
public $version = "";
|
||||
public $protocol = "";
|
||||
public $update_fiile = "";
|
||||
public $update_file = "";
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// METHODS
|
||||
|
|
|
@ -56,69 +56,6 @@ class updater {
|
|||
/**
|
||||
* Constants
|
||||
*/
|
||||
|
||||
const DEFAULT_OPTIONS = array(
|
||||
array(
|
||||
"name" => "codiad.editor.autocomplete",
|
||||
"value" => "false",
|
||||
),
|
||||
array(
|
||||
"name" => "codiad.editor.fileManagerTrigger",
|
||||
"value" => "false",
|
||||
),
|
||||
array(
|
||||
"name" => "codiad.editor.fontSize",
|
||||
"value" => "14px",
|
||||
),
|
||||
array(
|
||||
"name" => "codiad.editor.highlightLine",
|
||||
"value" => "true",
|
||||
),
|
||||
array(
|
||||
"name" => "codiad.editor.indentGuides",
|
||||
"value" => "true",
|
||||
),
|
||||
array(
|
||||
"name" => "codiad.editor.overScroll",
|
||||
"value" => "0.5",
|
||||
),
|
||||
array(
|
||||
"name" => "codiad.editor.persistentModal",
|
||||
"value" => "true",
|
||||
),
|
||||
array(
|
||||
"name" => "codiad.editor.printMargin",
|
||||
"value" => "true",
|
||||
),
|
||||
array(
|
||||
"name" => "codiad.editor.printMarginColumn",
|
||||
"value" => "80",
|
||||
),
|
||||
array(
|
||||
"name" => "codiad.editor.rightSidebarTrigger",
|
||||
"value" => "false",
|
||||
),
|
||||
array(
|
||||
"name" => "codiad.editor.softTabs",
|
||||
"value" => "false",
|
||||
),
|
||||
array(
|
||||
"name" => "codiad.editor.tabSize",
|
||||
"value" => "4",
|
||||
),
|
||||
array(
|
||||
"name" => "codiad.editor.theme",
|
||||
"value" => "twilight",
|
||||
),
|
||||
array(
|
||||
"name" => "codiad.editor.wrapMode",
|
||||
"value" => "false",
|
||||
),
|
||||
array(
|
||||
"name" => "codiad.settings.autosave",
|
||||
"value" => "true",
|
||||
),
|
||||
);
|
||||
|
||||
/**
|
||||
* Properties
|
||||
|
@ -253,12 +190,12 @@ class updater {
|
|||
|
||||
require_once('../../common.php');
|
||||
require_once('../sql/class.sql.php');
|
||||
require_once('../settings/class.settings.php');
|
||||
|
||||
$user_settings_file = DATA . "/settings.php";
|
||||
$projects_file = DATA . "/projects.php";
|
||||
$users_file = DATA . "/users.php";
|
||||
|
||||
$sql = new sql();
|
||||
global $sql;
|
||||
$connection = $sql->connect();
|
||||
|
||||
$query = "
|
||||
|
@ -485,7 +422,7 @@ DELETE FROM user_options;
|
|||
|
||||
public function set_default_options() {
|
||||
|
||||
foreach( self::DEFAULT_OPTIONS as $id => $option ) {
|
||||
foreach( Settings::DEFAULT_OPTIONS as $id => $option ) {
|
||||
|
||||
$this->update_option( $option["name"], $option["value"], true );
|
||||
}
|
||||
|
@ -571,25 +508,32 @@ DELETE FROM user_options;
|
|||
|
||||
public function update_option( $option, $value, $user_setting = null ) {
|
||||
|
||||
$sql = new sql();
|
||||
$query = "INSERT INTO user_options ( name, username, value ) VALUES ( ?, ?, ? );";
|
||||
$bind = "sss";
|
||||
$bind_variables = array(
|
||||
$option,
|
||||
$this->username,
|
||||
$value,
|
||||
);
|
||||
$result = sql::sql( $query, $bind, $bind_variables, formatJSEND( "error", "Error, Could not add user's settings." ) );
|
||||
$result = $sql->query( $query, $bind_variables, 0, "rowCount" );
|
||||
|
||||
if( $result !== true ) {
|
||||
if( $result == 0 ) {
|
||||
|
||||
$query = "UPDATE user_options SET value=? WHERE name=? AND username=?;";
|
||||
$bind = "sss";
|
||||
$bind_variables = array(
|
||||
$value,
|
||||
$option,
|
||||
$this->username,
|
||||
);
|
||||
$result = sql::sql( $query, $bind, $bind_variables, formatJSEND( "error", "Error, Could not update user's settings." ) );
|
||||
$result = $sql->query( $query, $bind_variables, 0, "rowCount" );
|
||||
}
|
||||
|
||||
if( $result > 0 ) {
|
||||
|
||||
echo formatJSEND( "success", null );
|
||||
} else {
|
||||
|
||||
echo formatJSEND( "error", "Error, Could not update option $option" );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -606,8 +550,10 @@ DELETE FROM user_options;
|
|||
|
||||
if( isset( $_GET["action"] ) && $_GET["action"] !== '' ) {
|
||||
|
||||
global $sql;
|
||||
$updater = new updater();
|
||||
$action = $_GET["action"];
|
||||
$sql = new sql();
|
||||
|
||||
switch( $action ) {
|
||||
|
||||
|
|
|
@ -10,6 +10,11 @@ require_once( "../settings/class.settings.php" );
|
|||
|
||||
class User {
|
||||
|
||||
const ACCESS = array(
|
||||
"admin",
|
||||
"user"
|
||||
);
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// PROPERTIES
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
@ -162,10 +167,13 @@ class User {
|
|||
|
||||
public function Authenticate() {
|
||||
|
||||
ini_set('display_errors', 1);
|
||||
ini_set('display_startup_errors', 1);
|
||||
error_reporting(E_ALL);
|
||||
|
||||
if( $this->username == "" || $this->password == "" ) {
|
||||
|
||||
echo( formatJSEND( "error", "Username or password can not be blank." ) );
|
||||
return;
|
||||
exit( formatJSEND( "error", "Username or password can not be blank." ) );
|
||||
}
|
||||
|
||||
if( ! is_dir( SESSIONS_PATH ) ) {
|
||||
|
@ -189,8 +197,7 @@ class User {
|
|||
chown( SESSIONS_PATH, $server_user );
|
||||
} catch( Exception $e ) {
|
||||
|
||||
echo( formatJSEND("error", "Error, incorrect owner of sessions folder. Expecting: $server_user, Recieved: " . $sessions_owner ) );
|
||||
return;
|
||||
exit( formatJSEND("error", "Error, incorrect owner of sessions folder. Expecting: $server_user, Recieved: " . $sessions_owner ) );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -201,8 +208,7 @@ class User {
|
|||
chmod( SESSIONS_PATH, 00755 );
|
||||
} catch( Exception $e ) {
|
||||
|
||||
echo( formatJSEND("error", "Error, incorrect permissions on sessions folder. Expecting: 0755, Recieved: " . $sessions_permissions ) );
|
||||
return;
|
||||
exit( formatJSEND("error", "Error, incorrect permissions on sessions folder. Expecting: 0755, Recieved: " . $sessions_permissions ) );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -405,6 +411,22 @@ class User {
|
|||
}
|
||||
}
|
||||
|
||||
public function update_access() {
|
||||
|
||||
global $sql;
|
||||
$query = "UPDATE users SET access=? WHERE username=?;";
|
||||
$bind_variables = array( $this->access, $this->username );
|
||||
$return = $sql->query( $query, $bind_variables, 0, "rowCount" );
|
||||
|
||||
if( $return > 0 ) {
|
||||
|
||||
echo formatJSEND( "success", "Updated access for {$this->username}" );
|
||||
} else {
|
||||
|
||||
echo formatJSEND( "error", "Error updating project" );
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Verify Account Exists
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
|
|
@ -142,3 +142,23 @@ if ($_GET['action']=='verify') {
|
|||
//$User->Verify();
|
||||
checkSession();
|
||||
}
|
||||
|
||||
|
||||
if ( $_GET['action'] == 'update_access' ) {
|
||||
|
||||
checkSession();
|
||||
|
||||
if ( ! isset( $_GET['access'] ) || ! isset( $_GET['username'] ) ) {
|
||||
|
||||
die( formatJSEND( "error", "Could not update access." ) );
|
||||
}
|
||||
|
||||
if( ! is_admin() ) {
|
||||
|
||||
die( formatJSEND( "error", "You do not have permission to update access." ) );
|
||||
}
|
||||
|
||||
$User->username = $_GET["username"];
|
||||
$User->access = $_GET["access"];
|
||||
$User->update_access();
|
||||
}
|
||||
|
|
|
@ -1,140 +1,176 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
* Copyright (c) Codiad & Kent Safranski (codiad.com), distributed
|
||||
* as-is and without warranty under the MIT License. See
|
||||
* [root]/license.txt for more. This information must remain intact.
|
||||
*/
|
||||
require_once('../../common.php');
|
||||
require_once('./class.user.php');
|
||||
$User = new User();
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Verify Session or Key
|
||||
//////////////////////////////////////////////////////////////////
|
||||
/*
|
||||
* Copyright (c) Codiad & Kent Safranski (codiad.com), distributed
|
||||
* as-is and without warranty under the MIT License. See
|
||||
* [root]/license.txt for more. This information must remain intact.
|
||||
*/
|
||||
require_once('../../common.php');
|
||||
require_once('./class.user.php');
|
||||
$User = new User();
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Verify Session or Key
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
checkSession();
|
||||
checkSession();
|
||||
|
||||
switch($_GET['action']){
|
||||
|
||||
//////////////////////////////////////////////////////////////
|
||||
// List Projects
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
case 'list':
|
||||
|
||||
$projects_assigned = false;
|
||||
if( ! checkAccess() ){
|
||||
?>
|
||||
<label><?php i18n("Restricted"); ?></label>
|
||||
<pre><?php i18n("You can not edit the user list"); ?></pre>
|
||||
<button onclick="codiad.modal.unload();return false;"><?php i18n("Close"); ?></button>
|
||||
<?php } else { ?>
|
||||
<label><?php i18n("User List"); ?></label>
|
||||
<div id="user-list">
|
||||
<table width="100%">
|
||||
<tr>
|
||||
<th width="150"><?php i18n("Username"); ?></th>
|
||||
<th width="85"><?php i18n("Password"); ?></th>
|
||||
<th width="70"><?php i18n("Delete"); ?></th>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="user-wrapper">
|
||||
<table width="100%" style="word-wrap: break-word;word-break: break-all;">
|
||||
<?php
|
||||
|
||||
// Get projects JSON data
|
||||
$users = $User->list_users();
|
||||
foreach( $users as $user => $data ) {
|
||||
?>
|
||||
<tr>
|
||||
<td width="150"><?php echo($data['username']); ?></td>
|
||||
<td width="85"><a onclick="codiad.user.password('<?php echo($data['username']); ?>');" class="icon-flashlight bigger-icon"></a></td>
|
||||
<?php
|
||||
if($_SESSION['user'] == $data['username']){
|
||||
?>
|
||||
<td width="75"><a onclick="codiad.message.error('You Cannot Delete Your Own Account');" class="icon-block bigger-icon"></a></td>
|
||||
<?php
|
||||
}else{
|
||||
?>
|
||||
<td width="70"><a onclick="codiad.user.delete('<?php echo($data['username']); ?>');" class="icon-cancel-circled bigger-icon"></a></td>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</tr>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<button class="btn-left" onclick="codiad.user.createNew();"><?php i18n("New Account"); ?></button>
|
||||
<button class="btn-right" onclick="codiad.modal.unload();return false;"><?php i18n("Close"); ?></button>
|
||||
<?php
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Create New User
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
case 'create':
|
||||
|
||||
?>
|
||||
<form>
|
||||
<label><?php i18n("Username"); ?></label>
|
||||
<input type="text" name="username" autofocus="autofocus" autocomplete="off">
|
||||
<label><?php i18n("Password"); ?></label>
|
||||
<input type="password" name="password1">
|
||||
<label><?php i18n("Confirm Password"); ?></label>
|
||||
<input type="password" name="password2">
|
||||
<button class="btn-left"><?php i18n("Create Account"); ?></button>
|
||||
switch($_GET['action']){
|
||||
|
||||
//////////////////////////////////////////////////////////////
|
||||
// List Projects
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
case 'list':
|
||||
|
||||
$projects_assigned = false;
|
||||
|
||||
if( ! checkAccess() ) {
|
||||
|
||||
?>
|
||||
<label><?php i18n("Restricted"); ?></label>
|
||||
<pre><?php i18n("You can not edit the user list"); ?></pre>
|
||||
<button onclick="codiad.modal.unload();return false;"><?php i18n("Close"); ?></button>
|
||||
<?php
|
||||
} else {
|
||||
|
||||
$admin = is_admin();
|
||||
?>
|
||||
<label><?php i18n("User List"); ?></label>
|
||||
<div id="user-list">
|
||||
<table width="100%">
|
||||
<tr>
|
||||
<th width="150"><?php i18n("Username"); ?></th>
|
||||
<th width="85"><?php i18n("Password"); ?></th>
|
||||
<?php
|
||||
|
||||
if( $admin ) {
|
||||
|
||||
?>
|
||||
<th width="70"><?php i18n("Access"); ?></th>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
<th width="70"><?php i18n("Delete"); ?></th>
|
||||
</tr>
|
||||
</table>
|
||||
<div class="user-wrapper">
|
||||
<table width="100%" style="word-wrap: break-word;word-break: break-all;">
|
||||
<?php
|
||||
|
||||
// Get projects JSON data
|
||||
$users = $User->list_users();
|
||||
foreach( $users as $user => $data ) {
|
||||
?>
|
||||
<tr>
|
||||
<td width="150"><?php echo($data['username']); ?></td>
|
||||
<td width="85"><a onclick="codiad.user.password('<?php echo($data['username']); ?>');" class="icon-flashlight bigger-icon"></a></td>
|
||||
<?php
|
||||
|
||||
if( $admin ) {
|
||||
|
||||
?>
|
||||
<td width="75">
|
||||
<select onchange="codiad.user.update_access( event, '<?php echo( $data['username'] ); ?>' )">
|
||||
<?php
|
||||
foreach( User::ACCESS as $role ) {
|
||||
|
||||
?>
|
||||
<option value="<?php echo $role;?>" <?php if( $data["access"] == $role ) { echo 'selected="selected"'; }?>><?php echo i18n( $role );?></option>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</select>
|
||||
</td>
|
||||
<?php
|
||||
}
|
||||
|
||||
if( $_SESSION['user'] == $data['username'] ) {
|
||||
|
||||
?>
|
||||
<td width="75"><a onclick="codiad.message.error('You Cannot Delete Your Own Account');" class="icon-block bigger-icon"></a></td>
|
||||
<?php
|
||||
} else {
|
||||
|
||||
?>
|
||||
<td width="70"><a onclick="codiad.user.delete('<?php echo($data['username']); ?>');" class="icon-cancel-circled bigger-icon"></a></td>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</tr>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<button class="btn-left" onclick="codiad.user.createNew();"><?php i18n("New Account"); ?></button>
|
||||
<button class="btn-right" onclick="codiad.modal.unload();return false;"><?php i18n("Close"); ?></button>
|
||||
<?php
|
||||
}
|
||||
break;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Create New User
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
case 'create':
|
||||
|
||||
?>
|
||||
<form>
|
||||
<label><?php i18n("Username"); ?></label>
|
||||
<input type="text" name="username" autofocus="autofocus" autocomplete="off">
|
||||
<label><?php i18n("Password"); ?></label>
|
||||
<input type="password" name="password1">
|
||||
<label><?php i18n("Confirm Password"); ?></label>
|
||||
<input type="password" name="password2">
|
||||
<button class="btn-left"><?php i18n("Create Account"); ?></button>
|
||||
<button class="btn-right" onclick="codiad.user.list();return false;"><?php i18n("Cancel"); ?></button>
|
||||
<form>
|
||||
<?php
|
||||
break;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Delete User
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
case 'delete':
|
||||
|
||||
?>
|
||||
<form>
|
||||
<input type="hidden" name="username" value="<?php echo($_GET['username']); ?>">
|
||||
<label><?php i18n("Confirm User Deletion"); ?></label>
|
||||
<pre><?php i18n("Account:"); ?> <?php echo($_GET['username']); ?></pre>
|
||||
<button class="btn-left"><?php i18n("Confirm"); ?></button>
|
||||
<form>
|
||||
<?php
|
||||
break;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Delete User
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
case 'delete':
|
||||
|
||||
?>
|
||||
<form>
|
||||
<input type="hidden" name="username" value="<?php echo($_GET['username']); ?>">
|
||||
<label><?php i18n("Confirm User Deletion"); ?></label>
|
||||
<pre><?php i18n("Account:"); ?> <?php echo($_GET['username']); ?></pre>
|
||||
<button class="btn-left"><?php i18n("Confirm"); ?></button>
|
||||
<button class="btn-right" onclick="codiad.user.list();return false;"><?php i18n("Cancel"); ?></button>
|
||||
<div class="loading"></div>
|
||||
<?php
|
||||
break;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Change Password
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
case 'password':
|
||||
|
||||
if($_GET['username']=='undefined'){
|
||||
$username = $_SESSION['user'];
|
||||
}else{
|
||||
$username = $_GET['username'];
|
||||
}
|
||||
|
||||
?>
|
||||
<form>
|
||||
<input type="hidden" name="username" value="<?php echo($username); ?>">
|
||||
<label><?php i18n("New Password"); ?></label>
|
||||
<input type="password" name="password1" autofocus="autofocus">
|
||||
<label><?php i18n("Confirm Password"); ?></label>
|
||||
<input type="password" name="password2">
|
||||
<button class="btn-left"><?php i18n("Change %{username}%'s Password", array("username" => ucfirst($username))) ?></button>
|
||||
<?php
|
||||
break;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Change Password
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
case 'password':
|
||||
|
||||
if( $_GET['username'] == 'undefined' ) {
|
||||
|
||||
$username = $_SESSION['user'];
|
||||
} else {
|
||||
$username = $_GET['username'];
|
||||
}
|
||||
|
||||
?>
|
||||
<form>
|
||||
<input type="hidden" name="username" value="<?php echo($username); ?>">
|
||||
<label><?php i18n("New Password"); ?></label>
|
||||
<input type="password" name="password1" autofocus="autofocus">
|
||||
<label><?php i18n("Confirm Password"); ?></label>
|
||||
<input type="password" name="password2">
|
||||
<button class="btn-left"><?php i18n("Change %{username}%'s Password", array("username" => ucfirst($username))) ?></button>
|
||||
<button class="btn-right" onclick="codiad.modal.unload();return false;"><?php i18n("Cancel"); ?></button>
|
||||
<?php
|
||||
break;
|
||||
<?php
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
|
@ -3,249 +3,291 @@
|
|||
* as-is and without warranty under the MIT License. See
|
||||
* [root]/license.txt for more. This information must remain intact.
|
||||
*/
|
||||
(function(global, $) {
|
||||
|
||||
(function(global, $){
|
||||
var codiad = global.codiad;
|
||||
|
||||
var codiad = global.codiad;
|
||||
|
||||
$(function() {
|
||||
codiad.user.init();
|
||||
});
|
||||
|
||||
codiad.user = {
|
||||
|
||||
loginForm: $('#login'),
|
||||
controller: 'components/user/controller.php',
|
||||
dialog: 'components/user/dialog.php',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Initilization
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
init: async function() {
|
||||
var _this = this;
|
||||
this.loginForm.on('submit', function(e) {
|
||||
e.preventDefault();
|
||||
_this.authenticate();
|
||||
});
|
||||
|
||||
// Get Theme
|
||||
if( codiad.settings !== undefined ) {
|
||||
|
||||
var theme = await codiad.settings.get_option( 'codiad.theme' );
|
||||
} else {
|
||||
|
||||
var theme = 'default';
|
||||
}
|
||||
$("#theme option").each(function()
|
||||
{
|
||||
if($(this).val() == theme) {
|
||||
$(this).attr("selected","selected");
|
||||
}
|
||||
});
|
||||
|
||||
// Get Language
|
||||
if( codiad.settings !== undefined ) {
|
||||
|
||||
var language = await codiad.settings.get_option('codiad.language');
|
||||
} else {
|
||||
|
||||
var language = 'en';
|
||||
}
|
||||
|
||||
$("#language option").each(function()
|
||||
{
|
||||
if($(this).val() == language) {
|
||||
$(this).attr("selected","selected");
|
||||
}
|
||||
});
|
||||
|
||||
// More Selector
|
||||
$('.show-language-selector').click(function(){
|
||||
$(this).hide();
|
||||
$('.language-selector').animate({height:'toggle'}, "fast");
|
||||
});
|
||||
},
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Authenticate User
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
authenticate: function() {
|
||||
$.post(this.controller + '?action=authenticate', this.loginForm.serialize(), function(data) {
|
||||
parsed = codiad.jsend.parse(data);
|
||||
if (parsed != 'error') {
|
||||
// Session set, reload
|
||||
window.location.reload();
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Logout
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
logout: function() {
|
||||
var forcelogout = true;
|
||||
if ($('#list-active-files li.changed').length > 0) {
|
||||
forcelogout = confirm(i18n('You have unsaved files.'));
|
||||
}
|
||||
if(forcelogout) {
|
||||
$('#list-active-files li.changed').each(function () { $(this).removeClass('changed')});
|
||||
amplify.publish('user.logout', {});
|
||||
codiad.settings.save();
|
||||
$.get(this.controller + '?action=logout', function() {
|
||||
window.location.reload();
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Open the user manager dialog
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
list: function() {
|
||||
$('#modal-content form')
|
||||
.die('submit'); // Prevent form bubbling
|
||||
codiad.modal.load(400, this.dialog + '?action=list');
|
||||
},
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Create User
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
createNew: function() {
|
||||
var _this = this;
|
||||
codiad.modal.load(400, this.dialog + '?action=create');
|
||||
$('#modal-content form')
|
||||
.live('submit', function(e) {
|
||||
e.preventDefault();
|
||||
var pass = true;
|
||||
var username = $('#modal-content form input[name="username"]')
|
||||
.val();
|
||||
var password1 = $('#modal-content form input[name="password1"]')
|
||||
.val();
|
||||
var password2 = $('#modal-content form input[name="password2"]')
|
||||
.val();
|
||||
|
||||
// Check matching passwords
|
||||
if (password1 != password2) {
|
||||
codiad.message.error(i18n('Passwords Do Not Match'));
|
||||
pass = false;
|
||||
}
|
||||
|
||||
// Check no spaces in username
|
||||
if (!/^[a-z0-9]+$/i.test(username) || username.length===0) {
|
||||
codiad.message.error(i18n('Username Must Be Alphanumeric String'));
|
||||
pass = false;
|
||||
}
|
||||
|
||||
if (pass) {
|
||||
$.post(_this.controller + '?action=create', {'username' : username , 'password' : password1 }, function(data) {
|
||||
var createResponse = codiad.jsend.parse(data);
|
||||
if (createResponse != 'error') {
|
||||
codiad.message.success(i18n('User Account Created'))
|
||||
_this.list();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Delete User
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
delete: function(username) {
|
||||
var _this = this;
|
||||
codiad.modal.load(400, this.dialog + '?action=delete&username=' + username);
|
||||
$('#modal-content form')
|
||||
.live('submit', function(e) {
|
||||
e.preventDefault();
|
||||
var username = $('#modal-content form input[name="username"]')
|
||||
.val();
|
||||
codiad.modal.show_loading();
|
||||
$.get(_this.controller + '?action=delete&username=' + username, function(data) {
|
||||
var deleteResponse = codiad.jsend.parse(data);
|
||||
if (deleteResponse != 'error') {
|
||||
codiad.message.success(i18n('Account Deleted'))
|
||||
_this.list();
|
||||
}
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Set Project Access
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
projects: function(username) {
|
||||
codiad.modal.load(400, this.dialog + '?action=projects&username=' + username);
|
||||
var _this = this;
|
||||
$('#modal-content form')
|
||||
.live('submit', function(e) {
|
||||
e.preventDefault();
|
||||
var username = $('#modal-content form input[name="username"]')
|
||||
.val();
|
||||
var accessLevel = $('#modal-content form select[name="access_level"]')
|
||||
.val();
|
||||
var projects = new Array();
|
||||
$('input:checkbox[name="project"]:checked').each(function(){
|
||||
projects.push($(this).val());
|
||||
});
|
||||
if(accessLevel==0){ projects = 0; }
|
||||
// Check and make sure if access level not full that at least on project is selected
|
||||
if (accessLevel==1 && !projects) {
|
||||
codiad.message.error(i18n('At Least One Project Must Be Selected'));
|
||||
} else {
|
||||
$.post(_this.controller + '?action=project_access&username=' + username,{projects: projects}, function(data) {
|
||||
var projectsResponse = codiad.jsend.parse(data);
|
||||
if (projectsResponse != 'error') {
|
||||
codiad.message.success(i18n('Account Modified'));
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Change Password
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
password: function(username) {
|
||||
var _this = this;
|
||||
codiad.modal.load(400, this.dialog + '?action=password&username=' + username);
|
||||
$('#modal-content form')
|
||||
.live('submit', function(e) {
|
||||
e.preventDefault();
|
||||
var username = $('#modal-content form input[name="username"]')
|
||||
.val();
|
||||
var password1 = $('#modal-content form input[name="password1"]')
|
||||
.val();
|
||||
var password2 = $('#modal-content form input[name="password2"]')
|
||||
.val();
|
||||
if (password1 != password2) {
|
||||
codiad.message.error(i18n('Passwords Do Not Match'));
|
||||
} else {
|
||||
$.post(_this.controller + '?action=password', {'username' : username , 'password' : password1 }, function(data) {
|
||||
var passwordResponse = codiad.jsend.parse(data);
|
||||
if (passwordResponse != 'error') {
|
||||
codiad.message.success(i18n('Password Changed'));
|
||||
codiad.modal.unload();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Change Current Project
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
project: function(project) {
|
||||
$.get(this.controller + '?action=project&project=' + project);
|
||||
}
|
||||
|
||||
};
|
||||
$(function() {
|
||||
codiad.user.init();
|
||||
});
|
||||
|
||||
codiad.user = {
|
||||
|
||||
loginForm: $('#login'),
|
||||
controller: 'components/user/controller.php',
|
||||
dialog: 'components/user/dialog.php',
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Initilization
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
init: async function() {
|
||||
var _this = this;
|
||||
this.loginForm.on('submit', function(e) {
|
||||
e.preventDefault();
|
||||
_this.authenticate();
|
||||
});
|
||||
|
||||
// Get Theme
|
||||
if(codiad.settings !== undefined) {
|
||||
|
||||
var theme = await codiad.settings.get_option('codiad.theme');
|
||||
} else {
|
||||
|
||||
var theme = 'default';
|
||||
}
|
||||
$("#theme option").each(function() {
|
||||
if($(this).val() == theme) {
|
||||
$(this).attr("selected", "selected");
|
||||
}
|
||||
});
|
||||
|
||||
// Get Language
|
||||
if(codiad.settings !== undefined) {
|
||||
|
||||
var language = await codiad.settings.get_option('codiad.language');
|
||||
} else {
|
||||
|
||||
var language = 'en';
|
||||
}
|
||||
|
||||
$("#language option").each(function() {
|
||||
if($(this).val() == language) {
|
||||
$(this).attr("selected", "selected");
|
||||
}
|
||||
});
|
||||
|
||||
// More Selector
|
||||
$('.show-language-selector').click(function() {
|
||||
$(this).hide();
|
||||
$('.language-selector').animate({
|
||||
height: 'toggle'
|
||||
}, "fast");
|
||||
});
|
||||
},
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Authenticate User
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
authenticate: function() {
|
||||
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: this.controller + '?action=authenticate',
|
||||
data: this.loginForm.serialize(),
|
||||
success: function( data ) {
|
||||
|
||||
parsed = codiad.jsend.parse(data);
|
||||
if( parsed != 'error' ) {
|
||||
// Session set, reload
|
||||
window.location.reload();
|
||||
}
|
||||
},
|
||||
error: function( XMLHttpRequest, textStatus, errorThrown ) {
|
||||
|
||||
console.log( XMLHttpRequest, textStatus, errorThrown );
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Logout
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
logout: function() {
|
||||
var forcelogout = true;
|
||||
if($('#list-active-files li.changed').length > 0) {
|
||||
forcelogout = confirm(i18n('You have unsaved files.'));
|
||||
}
|
||||
if(forcelogout) {
|
||||
$('#list-active-files li.changed').each(function() {
|
||||
$(this).removeClass('changed')
|
||||
});
|
||||
amplify.publish('user.logout', {});
|
||||
codiad.settings.save();
|
||||
$.get(this.controller + '?action=logout', function() {
|
||||
window.location.reload();
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Open the user manager dialog
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
list: function() {
|
||||
$('#modal-content form')
|
||||
.die('submit'); // Prevent form bubbling
|
||||
codiad.modal.load(600, this.dialog + '?action=list');
|
||||
},
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Create User
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
createNew: function() {
|
||||
var _this = this;
|
||||
codiad.modal.load(400, this.dialog + '?action=create');
|
||||
$('#modal-content form')
|
||||
.live('submit', function(e) {
|
||||
e.preventDefault();
|
||||
var pass = true;
|
||||
var username = $('#modal-content form input[name="username"]')
|
||||
.val();
|
||||
var password1 = $('#modal-content form input[name="password1"]')
|
||||
.val();
|
||||
var password2 = $('#modal-content form input[name="password2"]')
|
||||
.val();
|
||||
|
||||
// Check matching passwords
|
||||
if(password1 != password2) {
|
||||
codiad.message.error(i18n('Passwords Do Not Match'));
|
||||
pass = false;
|
||||
}
|
||||
|
||||
// Check no spaces in username
|
||||
if(!/^[a-z0-9]+$/i.test(username) || username.length === 0) {
|
||||
codiad.message.error(i18n('Username Must Be Alphanumeric String'));
|
||||
pass = false;
|
||||
}
|
||||
|
||||
if(pass) {
|
||||
$.post(_this.controller + '?action=create', {
|
||||
'username': username,
|
||||
'password': password1
|
||||
}, function(data) {
|
||||
var createResponse = codiad.jsend.parse(data);
|
||||
if(createResponse != 'error') {
|
||||
codiad.message.success(i18n('User Account Created'))
|
||||
_this.list();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Delete User
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
delete: function(username) {
|
||||
var _this = this;
|
||||
codiad.modal.load(400, this.dialog + '?action=delete&username=' + username);
|
||||
$('#modal-content form')
|
||||
.live('submit', function(e) {
|
||||
e.preventDefault();
|
||||
var username = $('#modal-content form input[name="username"]')
|
||||
.val();
|
||||
codiad.modal.show_loading();
|
||||
$.get(_this.controller + '?action=delete&username=' + username, function(data) {
|
||||
var deleteResponse = codiad.jsend.parse(data);
|
||||
if(deleteResponse != 'error') {
|
||||
codiad.message.success(i18n('Account Deleted'))
|
||||
_this.list();
|
||||
}
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Set Project Access
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
projects: function(username) {
|
||||
codiad.modal.load(400, this.dialog + '?action=projects&username=' + username);
|
||||
var _this = this;
|
||||
$('#modal-content form')
|
||||
.live('submit', function(e) {
|
||||
e.preventDefault();
|
||||
var username = $('#modal-content form input[name="username"]')
|
||||
.val();
|
||||
var accessLevel = $('#modal-content form select[name="access_level"]')
|
||||
.val();
|
||||
var projects = new Array();
|
||||
$('input:checkbox[name="project"]:checked').each(function() {
|
||||
projects.push($(this).val());
|
||||
});
|
||||
if(accessLevel == 0) {
|
||||
projects = 0;
|
||||
}
|
||||
// Check and make sure if access level not full that at least on project is selected
|
||||
if(accessLevel == 1 && !projects) {
|
||||
codiad.message.error(i18n('At Least One Project Must Be Selected'));
|
||||
} else {
|
||||
$.post(_this.controller + '?action=project_access&username=' + username, {
|
||||
projects: projects
|
||||
}, function(data) {
|
||||
var projectsResponse = codiad.jsend.parse(data);
|
||||
if(projectsResponse != 'error') {
|
||||
codiad.message.success(i18n('Account Modified'));
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Change Password
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
password: function(username) {
|
||||
var _this = this;
|
||||
codiad.modal.load(400, this.dialog + '?action=password&username=' + username);
|
||||
$('#modal-content form')
|
||||
.live('submit', function(e) {
|
||||
e.preventDefault();
|
||||
var username = $('#modal-content form input[name="username"]')
|
||||
.val();
|
||||
var password1 = $('#modal-content form input[name="password1"]')
|
||||
.val();
|
||||
var password2 = $('#modal-content form input[name="password2"]')
|
||||
.val();
|
||||
if(password1 != password2) {
|
||||
codiad.message.error(i18n('Passwords Do Not Match'));
|
||||
} else {
|
||||
$.post(_this.controller + '?action=password', {
|
||||
'username': username,
|
||||
'password': password1
|
||||
}, function(data) {
|
||||
var passwordResponse = codiad.jsend.parse(data);
|
||||
if(passwordResponse != 'error') {
|
||||
codiad.message.success(i18n('Password Changed'));
|
||||
codiad.modal.unload();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// Change Current Project
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
project: function(project) {
|
||||
$.get(this.controller + '?action=project&project=' + project);
|
||||
},
|
||||
|
||||
update_access: function( e, username=null ) {
|
||||
|
||||
let access = "";
|
||||
|
||||
if( ( typeof e ) == "string" ) {
|
||||
|
||||
access = e;
|
||||
} else {
|
||||
|
||||
access = e.target.value;
|
||||
}
|
||||
|
||||
$.get( this.controller + `?action=update_access&username=${username}&access=${access}`, function( data ) {
|
||||
|
||||
let response = codiad.jsend.parse( data );
|
||||
if( response != 'error' ) {
|
||||
|
||||
codiad.message.success( i18n( 'Access Updated' ) );
|
||||
}
|
||||
});
|
||||
},
|
||||
};
|
||||
})(this, jQuery);
|
||||
|
|
Loading…
Reference in New Issue