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.
@ -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

View File

@ -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); }

View File

@ -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 );

View File

@ -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 ) {

View File

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

View File

@ -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 ) {

View File

@ -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
//////////////////////////////////////////////////////////////////

View File

@ -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();
}

View File

@ -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}%&apos;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}%&apos;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;
}
}
?>

View File

@ -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);