Merge branch 'development' into 'admin-portal'

Update admin branch with latest dev updates

See merge request xevidos/codiad!28
This commit is contained in:
Isaac Brown 2019-02-13 14:17:43 -05:00
commit 036c99cb4e
10 changed files with 564 additions and 490 deletions

View File

@ -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. 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 ability to login with LDAP
* Add custom market * Add custom market
* Add in new admin interface * Add in new admin interface ( Check admin-portal branch for progress )
- Group Management - Group Management
- Permissions Management - Permissions Management
- Plugin Management - Plugin Management
@ -37,6 +37,7 @@ Task List:
* Add if file could not be saved 5 times close the open file * 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 multi level users. ( Projects for only certain groups, Permission levels )
* Add mobile compatibility * Add mobile compatibility
* Add support for more database systems and test ( MSSQL, Oracle, Postgre SQL, SQLite, etc )
* Clean up update script * Clean up update script
* Re Add the language recognition system after recode * Re Add the language recognition system after recode
@ -47,6 +48,10 @@ Completed:
* Add ability to center bottom of code * Add ability to center bottom of code
* Add updating script * Add updating script
* Add site renaming * 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 * Fix JS errors already showing
* Remove Codiad autocomplete in favor of Ace's * Remove Codiad autocomplete in favor of Ace's
* Updated for PHP 7.2 * Updated for PHP 7.2

View File

@ -32,8 +32,7 @@ class Common {
////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////
public static function construct() { public static function construct() {
global $cookie_lifetime;
$path = str_replace( "index.php", "", $_SERVER['SCRIPT_FILENAME'] ); $path = str_replace( "index.php", "", $_SERVER['SCRIPT_FILENAME'] );
foreach ( array( "components", "plugins" ) as $folder ) { foreach ( array( "components", "plugins" ) as $folder ) {
@ -201,15 +200,9 @@ class Common {
global $sql; global $sql;
$query = "SELECT COUNT( * ) FROM users WHERE username=? AND access=?;"; $query = "SELECT COUNT( * ) FROM users WHERE username=? AND access=?;";
$bind_variables = array( $_SESSION["user"], "admin" ); $bind_variables = array( $_SESSION["user"], "admin" );
$return = $sql->query( $query, $bind_variables, formatJSEND( "error", "Error checking user acess." ), 'fetchColumn' ); $return = $sql->query( $query, $bind_variables, -1, 'fetchColumn' );
$admin = ( $return > 0 );
if( $return > 0 ) { return $admin;
return( true );
} else {
return( false );
}
} }
public static function logout() { public static function logout() {
@ -301,12 +294,6 @@ class Common {
public static function start_session() { public static function start_session() {
Common::construct(); Common::construct();
global $cookie_lifetime;
if( isset( $cookie_lifetime ) && $cookie_lifetime != "" ) {
ini_set( "session.cookie_lifetime", $cookie_lifetime );
}
//Set a Session Name //Set a Session Name
session_name( md5( BASE_PATH ) ); session_name( md5( BASE_PATH ) );
@ -361,12 +348,6 @@ class Common {
public static function startSession() { public static function startSession() {
Common::construct(); Common::construct();
global $cookie_lifetime;
if( isset( $cookie_lifetime ) && $cookie_lifetime != "" ) {
ini_set( "session.cookie_lifetime", $cookie_lifetime );
}
//Set a Session Name //Set a Session Name
session_name( md5( BASE_PATH ) ); session_name( md5( BASE_PATH ) );
@ -644,7 +625,7 @@ class Common {
// Wrapper for old method names // 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 debug($message) { Common::debug($message); }
function i18n($key, $args = array()) { echo Common::i18n($key, $args); } function i18n($key, $args = array()) { echo Common::i18n($key, $args); }
function get_i18n($key, $args = array()) { return Common::get_i18n($key, $args); } function get_i18n($key, $args = array()) { return Common::get_i18n($key, $args); }

View File

@ -69,7 +69,7 @@
if( option != codiad.filemanager.auto_reload ) { if( option != codiad.filemanager.auto_reload ) {
//codiad.auto_save.reload_interval(); //codiad.auto_save.reload_interval();
window.location.reload(); window.location.reload( true );
} }
}); });
@ -509,7 +509,7 @@
codiad.editor.getActive().removeEventListener( "change", _this.refreshPreview ); codiad.editor.getActive().removeEventListener( "change", _this.refreshPreview );
return; return;
} }
_this.preview.location.reload(); _this.preview.location.reload( true );
} catch( e ) { } catch( e ) {
console.log( e ); console.log( e );

View File

@ -151,7 +151,7 @@ class Settings {
} }
if( ! empty( $return ) ) { if( ! empty( $return ) ) {
$return = $return["value"]; $return = $return["value"];
} else { } 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; 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( $bind_variables = array(
$value,
$option, $option,
$this->username, $value,
); );
$result = $sql->query( $query, $bind_variables, 0, "rowCount" ); $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 ) { if( $result > 0 ) {

View File

@ -24,7 +24,7 @@ class Update {
public $archive = ""; public $archive = "";
public $version = ""; public $version = "";
public $protocol = ""; public $protocol = "";
public $update_fiile = ""; public $update_file = "";
////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////
// METHODS // METHODS

View File

@ -56,69 +56,6 @@ class updater {
/** /**
* Constants * 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 * Properties
@ -253,12 +190,12 @@ class updater {
require_once('../../common.php'); require_once('../../common.php');
require_once('../sql/class.sql.php'); require_once('../sql/class.sql.php');
require_once('../settings/class.settings.php');
$user_settings_file = DATA . "/settings.php"; $user_settings_file = DATA . "/settings.php";
$projects_file = DATA . "/projects.php"; $projects_file = DATA . "/projects.php";
$users_file = DATA . "/users.php"; $users_file = DATA . "/users.php";
global $sql;
$sql = new sql();
$connection = $sql->connect(); $connection = $sql->connect();
$query = " $query = "
@ -485,7 +422,7 @@ DELETE FROM user_options;
public function set_default_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 ); $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 ) { public function update_option( $option, $value, $user_setting = null ) {
$sql = new sql();
$query = "INSERT INTO user_options ( name, username, value ) VALUES ( ?, ?, ? );"; $query = "INSERT INTO user_options ( name, username, value ) VALUES ( ?, ?, ? );";
$bind = "sss";
$bind_variables = array( $bind_variables = array(
$option, $option,
$this->username, $this->username,
$value, $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=?;"; $query = "UPDATE user_options SET value=? WHERE name=? AND username=?;";
$bind = "sss";
$bind_variables = array( $bind_variables = array(
$value, $value,
$option, $option,
$this->username, $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"] !== '' ) { if( isset( $_GET["action"] ) && $_GET["action"] !== '' ) {
global $sql;
$updater = new updater(); $updater = new updater();
$action = $_GET["action"]; $action = $_GET["action"];
$sql = new sql();
switch( $action ) { switch( $action ) {

View File

@ -10,6 +10,11 @@ require_once( "../settings/class.settings.php" );
class User { class User {
const ACCESS = array(
"admin",
"user"
);
////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////
// PROPERTIES // PROPERTIES
////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////
@ -162,10 +167,13 @@ class User {
public function Authenticate() { public function Authenticate() {
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
if( $this->username == "" || $this->password == "" ) { if( $this->username == "" || $this->password == "" ) {
echo( formatJSEND( "error", "Username or password can not be blank." ) ); exit( formatJSEND( "error", "Username or password can not be blank." ) );
return;
} }
if( ! is_dir( SESSIONS_PATH ) ) { if( ! is_dir( SESSIONS_PATH ) ) {
@ -189,8 +197,7 @@ class User {
chown( SESSIONS_PATH, $server_user ); chown( SESSIONS_PATH, $server_user );
} catch( Exception $e ) { } catch( Exception $e ) {
echo( formatJSEND("error", "Error, incorrect owner of sessions folder. Expecting: $server_user, Recieved: " . $sessions_owner ) ); exit( formatJSEND("error", "Error, incorrect owner of sessions folder. Expecting: $server_user, Recieved: " . $sessions_owner ) );
return;
} }
} }
@ -201,8 +208,7 @@ class User {
chmod( SESSIONS_PATH, 00755 ); chmod( SESSIONS_PATH, 00755 );
} catch( Exception $e ) { } catch( Exception $e ) {
echo( formatJSEND("error", "Error, incorrect permissions on sessions folder. Expecting: 0755, Recieved: " . $sessions_permissions ) ); exit( formatJSEND("error", "Error, incorrect permissions on sessions folder. Expecting: 0755, Recieved: " . $sessions_permissions ) );
return;
} }
} }
@ -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 // Verify Account Exists
////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////

View File

@ -142,3 +142,23 @@ if ($_GET['action']=='verify') {
//$User->Verify(); //$User->Verify();
checkSession(); 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();
}

View File

@ -1,140 +1,176 @@
<?php <?php
/* /*
* Copyright (c) Codiad & Kent Safranski (codiad.com), distributed * Copyright (c) Codiad & Kent Safranski (codiad.com), distributed
* as-is and without warranty under the MIT License. See * as-is and without warranty under the MIT License. See
* [root]/license.txt for more. This information must remain intact. * [root]/license.txt for more. This information must remain intact.
*/ */
require_once('../../common.php'); require_once('../../common.php');
require_once('./class.user.php'); require_once('./class.user.php');
$User = new User(); $User = new User();
////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////
// Verify Session or Key // Verify Session or Key
////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////
checkSession(); checkSession();
switch($_GET['action']){ switch($_GET['action']){
////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////
// List Projects // List Projects
////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////
case 'list': case 'list':
$projects_assigned = false; $projects_assigned = false;
if( ! checkAccess() ){
?> 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> <label><?php i18n("Restricted"); ?></label>
<?php } else { ?> <pre><?php i18n("You can not edit the user list"); ?></pre>
<label><?php i18n("User List"); ?></label> <button onclick="codiad.modal.unload();return false;"><?php i18n("Close"); ?></button>
<div id="user-list"> <?php
<table width="100%"> } else {
<tr>
<th width="150"><?php i18n("Username"); ?></th> $admin = is_admin();
<th width="85"><?php i18n("Password"); ?></th> ?>
<th width="70"><?php i18n("Delete"); ?></th> <label><?php i18n("User List"); ?></label>
</tr> <div id="user-list">
</table> <table width="100%">
<div class="user-wrapper"> <tr>
<table width="100%" style="word-wrap: break-word;word-break: break-all;"> <th width="150"><?php i18n("Username"); ?></th>
<?php <th width="85"><?php i18n("Password"); ?></th>
<?php
// Get projects JSON data
$users = $User->list_users(); if( $admin ) {
foreach( $users as $user => $data ) {
?> ?>
<tr> <th width="70"><?php i18n("Access"); ?></th>
<td width="150"><?php echo($data['username']); ?></td> <?php
<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']){ <th width="70"><?php i18n("Delete"); ?></th>
?> </tr>
<td width="75"><a onclick="codiad.message.error('You Cannot Delete Your Own Account');" class="icon-block bigger-icon"></a></td> </table>
<?php <div class="user-wrapper">
}else{ <table width="100%" style="word-wrap: break-word;word-break: break-all;">
?> <?php
<td width="70"><a onclick="codiad.user.delete('<?php echo($data['username']); ?>');" class="icon-cancel-circled bigger-icon"></a></td>
<?php // Get projects JSON data
} $users = $User->list_users();
?> foreach( $users as $user => $data ) {
</tr> ?>
<?php <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>
</table> <?php
</div>
</div> if( $admin ) {
<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 <td width="75">
} <select onchange="codiad.user.update_access( event, '<?php echo( $data['username'] ); ?>' )">
<?php
break; foreach( User::ACCESS as $role ) {
////////////////////////////////////////////////////////////////////// ?>
// Create New User <option value="<?php echo $role;?>" <?php if( $data["access"] == $role ) { echo 'selected="selected"'; }?>><?php echo i18n( $role );?></option>
////////////////////////////////////////////////////////////////////// <?php
}
case 'create': ?>
</select>
?> </td>
<form> <?php
<label><?php i18n("Username"); ?></label> }
<input type="text" name="username" autofocus="autofocus" autocomplete="off">
<label><?php i18n("Password"); ?></label> if( $_SESSION['user'] == $data['username'] ) {
<input type="password" name="password1">
<label><?php i18n("Confirm Password"); ?></label> ?>
<input type="password" name="password2"> <td width="75"><a onclick="codiad.message.error('You Cannot Delete Your Own Account');" class="icon-block bigger-icon"></a></td>
<button class="btn-left"><?php i18n("Create Account"); ?></button> <?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> <button class="btn-right" onclick="codiad.user.list();return false;"><?php i18n("Cancel"); ?></button>
<form> <form>
<?php <?php
break; break;
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
// Delete User // Delete User
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
case 'delete': case 'delete':
?> ?>
<form> <form>
<input type="hidden" name="username" value="<?php echo($_GET['username']); ?>"> <input type="hidden" name="username" value="<?php echo($_GET['username']); ?>">
<label><?php i18n("Confirm User Deletion"); ?></label> <label><?php i18n("Confirm User Deletion"); ?></label>
<pre><?php i18n("Account:"); ?> <?php echo($_GET['username']); ?></pre> <pre><?php i18n("Account:"); ?> <?php echo($_GET['username']); ?></pre>
<button class="btn-left"><?php i18n("Confirm"); ?></button> <button class="btn-left"><?php i18n("Confirm"); ?></button>
<button class="btn-right" onclick="codiad.user.list();return false;"><?php i18n("Cancel"); ?></button> <button class="btn-right" onclick="codiad.user.list();return false;"><?php i18n("Cancel"); ?></button>
<div class="loading"></div> <div class="loading"></div>
<?php <?php
break; break;
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
// Change Password // Change Password
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
case 'password': case 'password':
if($_GET['username']=='undefined'){ if( $_GET['username'] == 'undefined' ) {
$username = $_SESSION['user'];
}else{ $username = $_SESSION['user'];
$username = $_GET['username']; } else {
} $username = $_GET['username'];
}
?>
<form> ?>
<input type="hidden" name="username" value="<?php echo($username); ?>"> <form>
<label><?php i18n("New Password"); ?></label> <input type="hidden" name="username" value="<?php echo($username); ?>">
<input type="password" name="password1" autofocus="autofocus"> <label><?php i18n("New Password"); ?></label>
<label><?php i18n("Confirm Password"); ?></label> <input type="password" name="password1" autofocus="autofocus">
<input type="password" name="password2"> <label><?php i18n("Confirm Password"); ?></label>
<button class="btn-left"><?php i18n("Change %{username}%&apos;s Password", array("username" => ucfirst($username))) ?></button> <input type="password" name="password2">
<button class="btn-left"><?php i18n("Change %{username}%&apos;s Password", array("username" => ucfirst($username))) ?></button>
<button class="btn-right" onclick="codiad.modal.unload();return false;"><?php i18n("Cancel"); ?></button> <button class="btn-right" onclick="codiad.modal.unload();return false;"><?php i18n("Cancel"); ?></button>
<?php <?php
break; break;
} }
?> ?>

View File

@ -3,249 +3,291 @@
* as-is and without warranty under the MIT License. See * as-is and without warranty under the MIT License. See
* [root]/license.txt for more. This information must remain intact. * [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();
$(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);
}
};
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); })(this, jQuery);