Implement authorization: at the moment no roles - all users is admin. Default credential: admin/admin

This commit is contained in:
olevole
2017-12-08 00:35:11 +00:00
parent 567c77b941
commit 77129a216a
21 changed files with 1071 additions and 76 deletions

View File

@@ -21,7 +21,11 @@ class ClonOS
private $_client_ip='';
private $_dialogs=array();
private $_cmd_array=array('jcreate','jstart','jstop','jrestart','jedit','jremove','jexport','jimport','jclone','jrename','madd','sstart','sstop','projremove','bcreate','bstart','bstop','brestart','bremove','bclone','brename','vm_obtain','removesrc','srcup','removebase','world','repo','forms');
private $_user_info=array(
'id'=>0,
'username'=>'guest',
'unregistered'=>true,
);
/*
public $projectId=0;
public $jailId=0;
@@ -124,7 +128,8 @@ class ClonOS
//echo $this->realpath_page;
}else if($_SERVER['REQUEST_URI']){
//$this->realpath_page=$this->realpath_public.'pages/'.trim($_SERVER['REQUEST_URI'],'/').'/';
$this->realpath_page=$this->realpath_public.'pages/'.$this->uri_chunks[0].'/';
if(isset($this->uri_chunks[0]))
$this->realpath_page=$this->realpath_public.'pages/'.$this->uri_chunks[0].'/';
}
if(isset($this->_vars['hash']))
@@ -148,11 +153,35 @@ class ClonOS
if(isset($this->_vars['mode'])) $this->mode=$this->_vars['mode'];
if(isset($this->_vars['form_data'])) $this->form=$this->_vars['form_data'];
$ures=$this->userAutologin();
if($ures!==false)
{
if(isset($ures['id']) && is_numeric($ures['id']) && $ures['id']>0)
{
$this->_user_info=$ures;
$this->_user_info['unregistered']=false;
}else{
$this->_user_info['unregistered']=true;
}
}
if($this->_post && isset($this->mode))
{
if(isset($this->_user_info['error']) && $this->_user_info['error'])
{
if($this->mode!='login')
{
echo json_encode(array('error'=>true,'unregistered_user'=>true));
exit;
}
}
unset($_POST);
switch($this->mode)
{
case 'login':
echo json_encode($this->login());
return;break;
case 'getTasksStatus':
echo json_encode($this->_getTasksStatus($this->form['jsonObj']));
return;break;
@@ -296,6 +325,21 @@ class ClonOS
case 'baseRemove':
echo json_encode($this->baseRemove());
return;break;
case 'usersAdd':
echo json_encode($this->usersAdd());
return;break;
case 'usersEdit':
echo json_encode($this->usersEdit());
return;break;
case 'userRemove':
echo json_encode($this->userRemove());
return;break;
case 'userGetInfo':
echo json_encode($this->userGetInfo());
return;break;
case 'userEditInfo':
echo json_encode($this->userEditInfo());
return;break;
/* case 'saveHelperValues':
echo json_encode($this->saveHelperValues());
@@ -305,6 +349,14 @@ class ClonOS
}
}
function login()
{
$form=$this->_vars['form_data'];
return $this->userRegisterCheck($form);
//array('message'=>'unregistered user','errorCode'=>1)
}
function redis_publish($key,$message)
{
if(empty($key) || empty($message)) return false;
@@ -423,6 +475,8 @@ class ClonOS
$tid=join("','",$ids);
$query="select id,cmd,status,jname from taskd where status<2 and jname in ('{$tid}')";
//echo $query;
$cmd='';
$txt_status='';
$tasks=$this->_db_tasks->select($query);
if(!empty($tasks)) foreach($tasks as $task)
{
@@ -627,8 +681,9 @@ class ClonOS
$ip4_addr=$form['ip4_addr'];
$old_name=$form['oldJail'];
$new_name=$form['jname'];
$username=$this->_user_info['username'];
$cmd="task owner=cbsdwebsys mode=new /usr/local/bin/cbsd jrename old=${old_name} new=${new_name} host_hostname=${host_hostname} ip4_addr=${ip4_addr} restart=1";
$cmd="task owner=${username} mode=new /usr/local/bin/cbsd jrename old=${old_name} new=${new_name} host_hostname=${host_hostname} ip4_addr=${ip4_addr} restart=1";
$res=$this->cbsd_cmd($cmd);
$err='Jail is not renamed!';
@@ -646,8 +701,9 @@ class ClonOS
function jailClone()
{
$form=$this->_vars['form_data'];
$username=$this->_user_info['username'];
$res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd jclone checkstate=0 old='.$form['oldJail'].' new='.$form['jname'].' host_hostname='.$form['host_hostname'].' ip4_addr='.$form['ip4_addr']);
$res=$this->cbsd_cmd('task owner='.$username.' mode=new /usr/local/bin/cbsd jclone checkstate=0 old='.$form['oldJail'].' new='.$form['jname'].' host_hostname='.$form['host_hostname'].' ip4_addr='.$form['ip4_addr']);
$err='Jail is not cloned!';
$taskId=-1;
@@ -739,6 +795,8 @@ class ClonOS
function saveJailHelperValues()
{
$form=$this->form;
$username=$this->_user_info['username'];
if(!isset($this->uri_chunks[1]) || !isset($this->url_hash)) return array('error'=>true,'errorMessage'=>'Bad url!');
$jail_name=$this->uri_chunks[1];
@@ -756,7 +814,7 @@ class ClonOS
}
//cbsd forms module=<helper> jname=jail1 inter=0
$res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd forms module='.$this->url_hash.' jname='.$jail_name.' inter=0');
$res=$this->cbsd_cmd('task owner='.$username.' mode=new /usr/local/bin/cbsd forms module='.$this->url_hash.' jname='.$jail_name.' inter=0');
$err='Helper values is saved!';
$taskId=-1;
@@ -897,8 +955,10 @@ class ClonOS
}
file_put_contents($file_name,$file);
$username=$this->_user_info['username'];
$cbsd_queue_name='/clonos/'.trim($this->_vars['path'],'/').'/';
$res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd jcreate inter=0 jconf='.$file_name);
$res=$this->cbsd_cmd('task owner='.$username.' mode=new /usr/local/bin/cbsd jcreate inter=0 jconf='.$file_name);
//.' cbsd_queue_name='.$cbsd_queue_name);
$err='Jail is not created!';
@@ -1088,41 +1148,46 @@ class ClonOS
function jailStart() //$name
{
$form=$this->_vars['form_data'];
$username=$this->_user_info['username'];
$name=$form['jname'];
$cbsd_queue_name=trim($this->_vars['path'],'/');
$res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd jstart inter=0 jname='.$name);
$res=$this->cbsd_cmd('task owner='.$username.' mode=new /usr/local/bin/cbsd jstart inter=0 jname='.$name);
//.' cbsd_queue_name=/clonos/'.$cbsd_queue_name.'/'); // autoflush=2
return $res;
}
function jailStop() //$name
{
$form=$this->_vars['form_data'];
$username=$this->_user_info['username'];
$name=$form['jname'];
$cbsd_queue_name=trim($this->_vars['path'],'/');
$res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd jstop inter=0 jname='.$name);
$res=$this->cbsd_cmd('task owner='.$username.' mode=new /usr/local/bin/cbsd jstop inter=0 jname='.$name);
//.' cbsd_queue_name=/clonos/'.$cbsd_queue_name.'/'); // autoflush=2
return $res;
}
function jailRestart() //$name
{
$form=$this->_vars['form_data'];
$username=$this->_user_info['username'];
$name=$form['jname'];
$res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd jrestart inter=0 jname='.$name); // autoflush=2
$res=$this->cbsd_cmd('task owner='.$username.' mode=new /usr/local/bin/cbsd jrestart inter=0 jname='.$name); // autoflush=2
return $res;
}
function jailRemove() //$name
{
$form=$this->_vars['form_data'];
$username=$this->_user_info['username'];
$name=$form['jname'];
$res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd jremove inter=0 jname='.$name); // autoflush=2
$res=$this->cbsd_cmd('task owner='.$username.' mode=new /usr/local/bin/cbsd jremove inter=0 jname='.$name); // autoflush=2
return $res;
}
function bhyveClone()
{
$form=$this->_vars['form_data'];
$username=$this->_user_info['username'];
$res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd bclone checkstate=0 old='.$form['oldBhyve'].' new='.$form['vm_name']);
$res=$this->cbsd_cmd('task owner='.$username.' mode=new /usr/local/bin/cbsd bclone checkstate=0 old='.$form['oldBhyve'].' new='.$form['vm_name']);
$err='Virtual Machine is not renamed!';
$taskId=-1;
@@ -1249,8 +1314,9 @@ class ClonOS
$old_name=$form['oldJail'];
$new_name=$form['jname'];
$username=$this->_user_info['username'];
$cmd="task owner=cbsdwebsys mode=new /usr/local/bin/cbsd brename old=${old_name} new=${new_name} restart=1";
$cmd="task owner=${username} mode=new /usr/local/bin/cbsd brename old=${old_name} new=${new_name} restart=1";
$res=$this->cbsd_cmd($cmd);
$err='Virtual Machine is not renamed!';
@@ -1426,8 +1492,9 @@ class ClonOS
}
//echo $file;exit;
file_put_contents($file_name,$file);
$username=$this->_user_info['username'];
$res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd bcreate inter=0 jconf='.$file_name);
$res=$this->cbsd_cmd('task owner='.$username.' mode=new /usr/local/bin/cbsd bcreate inter=0 jconf='.$file_name);
$err='Virtual Machine is not created!';
$taskId=-1;
@@ -1474,6 +1541,7 @@ class ClonOS
function bhyveObtain()
{
$form=$this->_vars['form_data'];
$username=$this->_user_info['username'];
$os_types=$this->config->os_types;
$sel_os=$form['vm_os_profile'];
@@ -1491,7 +1559,7 @@ class ClonOS
{
$key_name=$nres['name'];
}
$cmd="task owner=cbsdwebsys mode=new /usr/local/bin/cbsd vm_obtain jname={$form['vm_name']} vm_size={$form['vm_size']} vm_cpus={$form['vm_cpus']} vm_ram={$form['vm_ram']} vm_os_type={$os_type} mask={$form['mask']} ip4_addr={$form['ip4_addr']} gw={$form['gateway']} authkey={$key_name} pw={$form['vm_password']}";
$cmd="task owner=${username} mode=new /usr/local/bin/cbsd vm_obtain jname={$form['vm_name']} vm_size={$form['vm_size']} vm_cpus={$form['vm_cpus']} vm_ram={$form['vm_ram']} vm_os_type={$os_type} mask={$form['mask']} ip4_addr={$form['ip4_addr']} gw={$form['gateway']} authkey={$key_name} pw={$form['vm_password']}";
$res=$this->cbsd_cmd($cmd);
$err='Virtual Machine is not created!';
@@ -1537,29 +1605,33 @@ class ClonOS
function bhyveStart()
{
$form=$this->form;
$username=$this->_user_info['username'];
$name=$form['jname'];
$res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd bstart inter=0 jname='.$name); // autoflush=2
$res=$this->cbsd_cmd('task owner='.$username.' mode=new /usr/local/bin/cbsd bstart inter=0 jname='.$name); // autoflush=2
return $res;
}
function bhyveStop()
{
$form=$this->form;
$username=$this->_user_info['username'];
$name=$form['jname'];
$res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd bstop inter=0 jname='.$name); // autoflush=2
$res=$this->cbsd_cmd('task owner='.$username.' mode=new /usr/local/bin/cbsd bstop inter=0 jname='.$name); // autoflush=2
return $res;
}
function bhyveRestart()
{
$form=$this->form;
$username=$this->_user_info['username'];
$name=$form['jname'];
$res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd brestart inter=0 jname='.$name); // autoflush=2
$res=$this->cbsd_cmd('task owner='.$username.' mode=new /usr/local/bin/cbsd brestart inter=0 jname='.$name); // autoflush=2
return $res;
}
function bhyveRemove() //$name
{
$form=$this->form;
$username=$this->_user_info['username'];
$name=$form['jname'];
$res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd bremove inter=0 jname='.$name); // autoflush=2
$res=$this->cbsd_cmd('task owner='.$username.' mode=new /usr/local/bin/cbsd bremove inter=0 jname='.$name); // autoflush=2
return $res;
}
@@ -1688,21 +1760,23 @@ class ClonOS
function srcRemove()
{
$form=$this->form;
$username=$this->_user_info['username'];
$ver=$form['jname'];
$ver=str_replace('src','',$ver);
if(empty($ver)) return array('error'=>true,'errorMessage'=>'Version of sources is emtpy!');
$res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd removesrc inter=0 ver='.$ver.' jname=#src'.$ver);
$res=$this->cbsd_cmd('task owner='.$username.' mode=new /usr/local/bin/cbsd removesrc inter=0 ver='.$ver.' jname=#src'.$ver);
return $res;
}
function srcUpdate()
{
$form=$this->form;
$username=$this->_user_info['username'];
$ver=$form['jname'];
//$ver=str_replace('src','',$ver);
$ver=str_replace('src','',$ver);
$stable=(preg_match('#\.\d#',$ver))?0:1;
if(empty($ver)) return array('error'=>true,'errorMessage'=>'Version of sources is emtpy!');
$res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd srcup stable='.$stable.' inter=0 ver='.$ver.' jname=#src'.$ver);
$res=$this->cbsd_cmd('task owner='.$username.' mode=new /usr/local/bin/cbsd srcup stable='.$stable.' inter=0 ver='.$ver.' jname=#src'.$ver);
return $res;
}
function getSrcInfo($id)
@@ -1748,6 +1822,7 @@ class ClonOS
//$id=str_replace('base','',$id);
//base10.3-amd64-0
$form=$this->form;
$username=$this->_user_info['username'];
$id=$form['jname'];
$orig_id=$id;
preg_match('#base([0-9\.]+)-([^-]+)-(\d+)#',$id,$res);
@@ -1755,7 +1830,7 @@ class ClonOS
$arch=$res[2];
$stable=$res[3];
$cmd='task owner=cbsdwebsys mode=new /usr/local/bin/cbsd removebase inter=0 stable='.$stable.' ver='.$ver.' arch='.$arch.' jname=#'.$orig_id;
$cmd='task owner='.$username.' mode=new /usr/local/bin/cbsd removebase inter=0 stable='.$stable.' ver='.$ver.' arch='.$arch.' jname=#'.$orig_id;
$res=$this->cbsd_cmd($cmd);
return $res;
}
@@ -1763,6 +1838,7 @@ class ClonOS
function basesCompile()
{
$form=$this->form;
$username=$this->_user_info['username'];
if(!isset($form['sources']) || !is_numeric($form['sources'])) return array('error'=>true,'errorMessage'=>'Wrong OS type selected!');
$id=$form['sources'];
@@ -1783,7 +1859,7 @@ class ClonOS
$html=$res['html'];
$res=$res['arr'];
$res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd world inter=0 stable='.$res['stable'].' ver='.$ver.' jname=#base'.$bid);
$res=$this->cbsd_cmd('task owner='.$username.' mode=new /usr/local/bin/cbsd world inter=0 stable='.$res['stable'].' ver='.$ver.' jname=#base'.$bid);
//$res['retval']=0;$res['message']=3;
$err='';
@@ -1858,6 +1934,7 @@ class ClonOS
function repoCompile()
{
$form=$this->form;
$username=$this->_user_info['username'];
if(!isset($form['version']) || !is_numeric($form['version'])) return array('error'=>true,'errorMessage'=>'Wrong OS type input!');
$stable_arr=array('release','stable');
@@ -1894,7 +1971,7 @@ class ClonOS
$html=$html_tpl;
}
$res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd repo action=get sources=base inter=0 stable='.$stable_num.' ver='.$ver.' jname=#base'.$bid);
$res=$this->cbsd_cmd('task owner='.$username.' mode=new /usr/local/bin/cbsd repo action=get sources=base inter=0 stable='.$stable_num.' ver='.$ver.' jname=#base'.$bid);
//$res['retval']=0;$res['message']=3;
$err='';
@@ -1978,11 +2055,12 @@ class ClonOS
$form=$this->form;
if($this->uri_chunks[0]!='jailscontainers' || empty($this->uri_chunks[1])) return array('error'=>true,'errorMessage'=>'Bad url!');
$jail_id=$this->uri_chunks[1];
$username=$this->_user_info['username'];
$helpers=array_keys($form);
if(!empty($helpers)) foreach($helpers as $helper)
{
$res=$this->cbsd_cmd('task owner=cbsdwebsys mode=new /usr/local/bin/cbsd forms inter=0 module='.$helper.' jname='.$jail_id);
$res=$this->cbsd_cmd('task owner=${username} mode=new /usr/local/bin/cbsd forms inter=0 module='.$helper.' jname='.$jail_id);
}
return array('error'=>false);
}
@@ -2066,9 +2144,6 @@ class ClonOS
return array('html'=>$res['html']);
}
function useDialogs($arr=array())
{
//print_r($arr);
@@ -2089,6 +2164,17 @@ class ClonOS
}
}
function placeDialogByName($dialog_name=null)
{
if(is_null($dialog_name)) return;
echo PHP_EOL;
$file_name=$this->realpath_public.'dialogs/'.$dialog_name.'.php';
if(file_exists($file_name))
{
include($file_name);
echo PHP_EOL,PHP_EOL;
}
}
@@ -2107,7 +2193,7 @@ class ClonOS
//if(strlen($nodeip)<7) $nodeip=$this->server_name;
$nodeip=$this->server_name;
header('Location: http://'.$nodeip.':6080/vnc_auto.html?host='.$nodeip.'&port=6080');
header('Location: http://'.$nodeip.':6080/vnc_auto.html?host='.$nodeip.'&port=6080?password=cbsd');
exit;
}
@@ -2245,4 +2331,250 @@ class ClonOS
return $html;
}
function usersAdd()
{
$form=$this->form;
$res=$this->userRegister($form);
if($res!==false)
{
if(isset($res['user_exists']) && $res['user_exists'])
{
return array('error'=>true,'errorType'=>'user-exists','errorMessage'=>'User always exists!');
}
return $res;
}
return array('form'=>$form);
}
function usersEdit()
{
$form=$this->form;
if(!isset($form['user_id']) || !is_numeric($form['user_id']) || $form['user_id']<1)
return array('error'=>true,'error_message'=>'incorrect data!');
$db=new Db('clonos');
if($db!==false)
{
$user_id=$form['user_id'];
$username=$form['username'];
$first_name=$form['first_name'];
$last_name=$form['last_name'];
$is_active=0;
if(isset($form['actuser']) && $form['actuser']=='on') $is_active=1;
$pwd_sql='';
if(isset($form['password']))
{
$password=$this->getPasswordHash($form['password']);
$pwd_sql=",password='${password}'";
}
$query="update auth_user set username='${username}'".$pwd_sql.",first_name='${first_name}',last_name='${last_name}',is_active=${is_active} where id=${user_id}";
//echo $query;
$res=$db->update($query);
return array('error'=>false,'res'=>$res);
}else{
return array('error'=>true,'error_message'=>'db connection lost!');
}
}
function getPasswordHash($password)
{
return hash('sha256',hash('sha256',$password).$this->getSalt());
}
private function getSalt()
{
$salt_file='/var/db/clonos/salt';
if(file_exists($salt_file)) return trim(file_get_contents($salt_file));
return 'noSalt!';
}
function userRegister($user_info=array())
{
if(empty($user_info)) return false;
if(isset($user_info['username']) && isset($user_info['password']))
{
$db=new Db('clonos');
if($db!==false)
{
$res=$db->select("select username from auth_user where username='${user_info['username']}'");
if(!empty($res))
{
$res['user_exsts']=true;
return $res;
}
$username=$user_info['username'];
$password=$this->getPasswordHash($user_info['password']);
$first_name=$user_info['first_name'];
$last_name=$user_info['last_name'];
$is_active=0;
if(isset($user_info['actuser']) && $user_info['actuser']=='on') $is_active=1;
$query=$db->query_protect("insert into auth_user
(username,password,first_name,last_name,is_active,date_joined)
values
('${username}','${password}','${first_name}','${last_name}',${is_active},datetime('now','localtime'))");
$res=$db->insert($query);
return array('error'=>false,'res'=>$res);
}
}
}
function userRegisterCheck($user_info=array())
{
/*
[0] => Array
(
[id] => 1
[username] => admin
[password] => 01...87a
[first_name] => Admin
[last_name] => Admin
[last_login] =>
[is_active] => 1
[date_joined] => 2017-12-02 00:09:00
[sess_id] =>
[secure_sess_id] =>
)
*/
if(empty($user_info)) return false;
if(isset($user_info['login']) && isset($user_info['password']))
{
$db=new Db('clonos');
if($db!==false)
{
$pass=$this->getPasswordHash($user_info['password']);
$res=$db->selectAssoc(
"select id,username
from auth_user
where
username='${user_info['login']}' and
password='${pass}' and
is_active=1");
if(empty($res))
{
sleep(3);
return array('errorCode'=>1,'message'=>'user not found!');
}
$res['errorCode']=0;
$id=$res['id'];
$ip=$this->_client_ip;
$memory_hash=md5($id.$res['username'].time());
$secure_memory_hash=md5($memory_hash.$ip);
/*
$query="update auth_user set sess_id='${memory_hash}', secure_sess_id='${secure_memory_hash}', last_login=datetime('now','localtime') where id=${id}";
$db->update($query);
*/
//$query="update auth_list set secure_sess_id='${secure_memory_hash}',auth_time=datetime('now','localtime') where sess_id='${memory_hash}'"; //sess_id='${memory_hash}',
$query="update auth_list set sess_id='${memory_hash}',secure_sess_id='${secure_memory_hash}',auth_time=datetime('now','localtime') where user_id=${id} and user_ip='${ip}'";
$qres=$db->update($query);
//print_r($qres);
if(isset($qres['rowCount']))
{
if($qres['rowCount']==0)
{
$query="insert into auth_list
(user_id,sess_id,secure_sess_id,user_ip,auth_time) values
(${id},'${memory_hash}','${secure_memory_hash}','${ip}',datetime('now','localtime'))";
$qres=$db->insert($query);
}
}
setcookie('mhash',$memory_hash,time()+1209600);
return $res;
}
}
return array('message'=>'unregistered user','errorCode'=>1);
}
function userAutologin()
{
if(isset($_COOKIE['mhash']))
{
$memory_hash=$_COOKIE['mhash'];
$secure_memory_hash=md5($memory_hash.$this->_client_ip);
$db=new Db('clonos');
if($db!==false)
{
$query="select au.id,au.username
from auth_user au, auth_list al
where
al.secure_sess_id='${secure_memory_hash}' and
au.id=al.user_id and
au.is_active=1";
//echo $query;
$res=$db->selectAssoc($query);
//print_r($res);
if(!empty($res))
{
$res['error']=false;
return $res;
}
}
}
return array('error'=>true);
}
function userRemove()
{
$form=$this->form;
$id=$form['user_id'];
if(is_numeric($id) && $id>0)
{
$query="delete from auth_user where id=${id}";
$db=new Db('clonos');
if($db!==false)
{
$res=$db->select($query);
return $res;
}else{
return array('error'=>true,'error_message'=>'DB connection error!');
}
}
}
function userEditInfo()
{
$form=$this->form;
if(!isset($form['user_id']))
{
return array('error'=>true,'error_message'=>'incorrect data!');
}
$user_id=$form['user_id'];
$db=new Db('clonos');
if($db!==false)
{
$res=$db->selectAssoc("select username,first_name,last_name,is_active as actuser from auth_user where id=${user_id}");
return array(
'dialog'=>$form['dialog'],
'vars'=>$res,
'error'=>false,
'tblid'=>$form['tbl_id'],
'user_id'=>$user_id,
);
}else{
return array('error'=>true,'error_message'=>'DB connection error!');
}
}
function userGetInfo()
{
$db=new Db('clonos');
if($db!==false)
{
$res=$db->select("select * from auth_user limit 1");
return $res;
}else{
return array('DB connection error!');
}
}
}

View File

@@ -7,8 +7,19 @@ class Config
'ru'=>'Russian',
);
public $os_types_names=array(
'netbsd'=>'NetBSD',
'dflybsd'=>'DragonflyBSD',
'linux'=>'Linux',
'other'=>'Other',
'freebsd'=>'FreeBSD',
'openbsd'=>'OpenBSD',
'windows'=>'Windows',
);
public $other_titles=array(
'settings'=>'CBSD Settings',
'users'=>'CBSD Users',
);
/* Меню проекта */
@@ -43,6 +54,12 @@ class Config
'icon'=>'icon-buffer',
),
*/
'vm_packages'=>array(
'name'=>'VM Packages',
'title'=>'Manage VM Packages group',
'icon'=>'icon-cubes',
),
'vpnet'=>array(
'name'=>'Virtual Private Network',
'title'=>'Manage for virtual private networks',
@@ -149,6 +166,31 @@ class Config
),
)
);
function __construct()
{
$array=array();
$array1=array();
$res=ClonOS::cbsd_cmd('get_bhyve_profiles');
if($res['retval']==0)
{
$res=json_decode($res['message'],true);
if(!empty($res))foreach($res as $item)
{
$os_name=$this->os_types_names[$item['type']];
if(isset($array[$os_name]))
{
$array[$os_name]['items'][]=$item;
}else{
$array[$os_name]=array('os'=>$os_name,'items'=>array($item));
}
}
if(!empty($array))foreach($array as $item) $array1[]=$item;
unset($array);
$this->os_types=$array1;
}
}
function os_types_create($obtain='new')
{
$obtain=($obtain=='obtain');
@@ -161,6 +203,7 @@ class Config
$items=$os['items'];
foreach($items as $num2=>$item)
{
if(!isset($item['obtain'])) $item['obtain']=false;
if(!$obtain || $item['obtain'])
$html_tmp.=' <option value="'.$num1.'.'.$num2.'">'.$item['name'].'</option>'.PHP_EOL;
if($item['obtain']) $obtain_count++;

0
php/cron.php Normal file
View File

View File

@@ -179,4 +179,10 @@ class Db
}
return false;
}
function query_protect($query)
{
// Добавить сюда защиту запроса от инъекций и других ошибок.
return $query;
}
}

View File

@@ -44,7 +44,9 @@ class Menu
$this->html='<ul class="menu">'.PHP_EOL;
//$qstr=trim($_SERVER['REQUEST_URI'],'/');
$qstr=trim($parent->uri_chunks[0],'/');
$qstr='';
if(isset($parent->uri_chunks[0]))
$qstr=trim($parent->uri_chunks[0],'/');
$this->path=$qstr; //$_MENU_PATH
if(!empty($menu_config))foreach($menu_config as $key=>$val)
{

View File

@@ -796,16 +796,24 @@ form.win legend {
padding:0 10px;
}
form.win input[type="text"]:required,
form.win input[type="email"]:required,
form.win input[type="password"]:required {
background-color:#fef7f7;
border:1px solid #d7a0a0;
}
form.win input[type="text"]:valid,
form.win input[type="email"]:valid,
form.win input[type="password"]:valid {
border:1px solid green;
background-color:Honeydew;
}
form.win input[type="email"]:invalid,
form.win input[type="password"]:invalid {
background-color:#fef7f7;
border:1px solid #d7a0a0;
}
input[type=checkbox]:checked + label,
input[type=radio]:checked + label {
color:#337ab7;
@@ -816,6 +824,11 @@ input.inline + label {
form.helper fieldset label {
color:black !important;
}
form.win fieldset.full {
width:calc(100% - 42px);
padding:0 20px;
margin:0;
}
.cbsd-str {
@@ -1016,14 +1029,14 @@ span.top-button::before {
/* PROGRESS LOADER START */
.spinner {
display:none;
width: 60px;
height: 60px;
width:60px;
height:60px;
background-color:#337ab7;
position:absolute;
top:50%;
left:50%;
-webkit-animation: sk-rotateplane 1.2s infinite ease-in-out;
animation: sk-rotateplane 1.2s infinite ease-in-out;
-webkit-animation:sk-rotateplane 1.2s infinite ease-in-out;
animation:sk-rotateplane 1.2s infinite ease-in-out;
}
@-webkit-keyframes sk-rotateplane {
@@ -1093,8 +1106,8 @@ form.helper h1 {
font-family:Times;
}
form.helper .form-field {
padding: 2px 0;
white-space: nowrap;
padding:2px 0;
white-space:nowrap;
}
form.helper .form-field:first-child {
margin-top:18px;
@@ -1109,7 +1122,7 @@ form.helper fieldset .form-field {
margin-left:-10px;
}
form.helper .buttons {
padding: 10px 18px;
padding:10px 18px;
background:#f0f0f0;
border-top:1px solid silver;
}
@@ -1155,6 +1168,16 @@ form.helper select {
padding:2px;
width:300px;
}
form.helper.simple h1 {
margin-bottom:20px !important;
}
form.helper.simple .form-field{
margin:0 0 4px 0;
}
form.helper.simple .caption {
display:block;
margin-left:20px;
}
input[type=range].vHorizon {
-webkit-appearance:none;
@@ -1223,32 +1246,32 @@ input[type=range]::-moz-range-track {
text-align:center;
}
.uploader .browser label {
background-color: #337ab7;
padding: 5px 15px;
color: white;
padding: 6px 0px;
font-weight: bold;
cursor: pointer;
position: relative;
overflow: hidden;
display: block;
width: 300px;
margin: 10px auto 0px auto;
box-shadow: 2px 2px 2px #888888;
background-color:#337ab7;
padding:5px 15px;
color:white;
padding:6px 0px;
font-weight:bold;
cursor:pointer;
position:relative;
overflow:hidden;
display:block;
width:300px;
margin:10px auto 0px auto;
box-shadow:2px 2px 2px #888888;
}
.uploader div.browser input {
position: absolute;
top: 0;
right: 0;
margin: 0;
border: solid transparent;
border-width: 0 0 100px 200px;
opacity: .0;
filter: alpha(opacity= 0);
-o-transform: translate(250px,-50px) scale(1);
-moz-transform: translate(-300px,0) scale(4);
direction: ltr;
cursor: pointer;
position:absolute;
top:0;
right:0;
margin:0;
border:solid transparent;
border-width:0 0 100px 200px;
opacity:.0;
filter:alpha(opacity= 0);
-o-transform:translate(250px,-50px) scale(1);
-moz-transform:translate(-300px,0) scale(4);
direction:ltr;
cursor:pointer;
}
.uploader-progress {
width:100%;
@@ -1283,7 +1306,7 @@ input[type=range]::-moz-range-track {
left:30%;
right:30%;
overflow:auto;
z-index:15;
z-index:1500;
border:3px double red;
background-color:antiquewhite;
}
@@ -1294,4 +1317,97 @@ input[type=range]::-moz-range-track {
}
#debug div {
padding:20px;
}
div.login-area {
position:fixed;
top:0;
left:0;
right:0;
bottom:0;
background-color:rgba(0,0,0,0.9);
z-index:1001;
}
dialog#login {
display:block;
position:absolute;
top:calc(50% - 190px);
margin-left:calc(50% - 159px);
}
dialog .login-header {
height:60px;
background-color:#e0e0e0;
text-transform:uppercase;
text-align:center;
line-height:60px;
font-weight:bolder;
font-size:200%;
color:#347ab7;
font-family:"times new roman";
border-bottom:1px solid silver;
text-shadow:2px 2px 4px rgba(0,0,0,0.3);
}
dialog#login .window-content {
min-height:150px;
padding:30px;
}
dialog#login input[type="text"],
dialog#login input[type="password"] {
width:250px;
}
.ccopy {
color:white;
text-align:center;
position:relative;
top:85%;
font:12px/18px Tahoma, Verdana, Arial;
}
.login-wait {
position:absolute;
width:100%;
height:100%;
background-color:rgba(255,255,255,0.9);
z-index:1;
}
.login-error-nouser {
color:red;
position:absolute;
width:100%;
height:100%;
background-color:rgba(255,250,250,0.9);
line-height:310px;
text-align:center;
font-weight:bolder;
z-index:1;
}
@keyframes fadeOut {
0% {opacity:1;}
100% {opacity:0;display:none;}
}
.fadeOut {
animation-name:fadeOut;
animation-duration:.5s;
}
@keyframes fadeIn {
0% {opacity:0;}
100% {opacity:1;}
}
.fadeIn {
animation-name:fadeIn;
animation-duration:.5s;
}
.loadersmall {
border:5px solid #f3f3f3;
-webkit-animation:spin 1s linear infinite;
animation:spin 1s linear infinite;
border-top:5px solid #555;
border-radius:50%;
width:50px;
height:50px;
margin:calc(50% - 25px) auto;
}

View File

@@ -0,0 +1,20 @@
<dialog id="login" class="window-box">
<div class="login-wait hide"><div class="loadersmall"></div></div>
<div class="login-error-nouser hide"><?php echo $this->translate('<span class="icon-attention" style="font-size:large;"></span> Error! User not found!'); ?></div>
<div class="login-header"><span class="icon-expeditedssl"></span><?php echo $this->translate('Login');?></div>
<form class="win" method="post" id="loginData" onsubmit="return false;">
<div class="window-content">
<p>
<span class="field-name"><?php echo $this->translate('Login');?>:</span>
<input type="text" name="login" value="" autofocus />
</p>
<p>
<span class="field-name"><?php echo $this->translate('Password');?>:</span>
<input type="password" name="password" value="" />
</p>
</div>
</form>
<div class="buttons">
<input type="button" value="<?php echo $this->translate('Go to the system');?>" class="button ok-but" />
</div>
</dialog>

View File

@@ -0,0 +1,57 @@
<script type="text/javascript">
err_messages.add({
'username':'<?php echo $this->translate("CHANGE THIS TEXT!!! Can not be empty. Name must begin with a letter / a-z / and not have any special symbols: -,.=%");?>',
'first_name':'<?php echo $this->translate("TYPE THIS TEXT!!!");?>',
'last_name':'<?php echo $this->translate("TYPE THIS TEXT!!!");?>',
});
</script>
<dialog id="users-new" class="window-box new">
<h1>
<span class="new"><?php echo $this->translate('Add new user');?></span>
<span class="edit"><?php echo $this->translate('Edit user info');?></span>
</h1>
<h2><?php echo $this->translate('User Settings');?></h2>
<form class="win" method="post" id="userSettings" onsubmit="return false;">
<div class="window-content">
<p>
<span class="field-name"><?php echo $this->translate('User name');?>:</span>
<input type="text" name="username" value="" pattern="[^0-9]{1}[a-zA-Z0-9]{2,}" required="required" class="edit-enable" />
</p>
<p class="new">
<span class="field-name"><?php echo $this->translate('User password');?>:</span>
<input type="password" name="password" value="" placeholder="3-20 symbols" pattern=".{3,20}" maxlength="20" class="edit-disable"></input>
</p>
<p class="new">
<span class="field-name"><?php echo $this->translate('User password (again)');?>:</span>
<input type="password" name="password1" value="" placeholder="3-20 symbols" pattern=".{3,20}" maxlength="20" class="edit-disable"></input>
</p>
<fieldset class="edit full">
<legend><input type="checkbox" id="letsedit-1" class="letsedit" /><label for="letsedit-1"> <?php echo $this->translate('Change the password');?>:</label></legend>
<p>
<span class="field-name"><?php echo $this->translate('User password');?>:</span>
<input type="password" name="password" value="" placeholder="3-20 symbols" pattern=".{3,20}" maxlength="20" disabled></input>
</p>
<p>
<span class="field-name"><?php echo $this->translate('User password (again)');?>:</span>
<input type="password" name="password1" value="" placeholder="3-20 symbols" pattern=".{3,20}" maxlength="20" disabled></input>
</p>
</fieldset>
<p>
<span class="field-name"><?php echo $this->translate('First name');?>:</span>
<input type="text" name="first_name" value="" pattern="[^0-9]{1}[a-zA-Z0-9]{2,}" required="required" class="edit-enable" />
</p>
<p>
<span class="field-name"><?php echo $this->translate('Last name');?>:</span>
<input type="text" name="last_name" value="" pattern="[^0-9]{1}[a-zA-Z0-9]{2,}" required="required" class="edit-enable" />
</p>
<p>
<input type="checkbox" name="actuser" id="actuser" /><label for="actuser"> <?php echo $this->translate('Activate user');?></label>
</p>
</div>
</form>
<div class="buttons">
<input type="button" value="<?php echo $this->translate('Add');?>" class="new button ok-but" />
<input type="button" value="<?php echo $this->translate('Save');?>" class="edit button ok-but" />
<input type="button" value="<?php echo $this->translate('Cancel');?>" class="button red cancel-but" />
</div>
</dialog>

View File

@@ -4,5 +4,5 @@
<span class="dialog-close"></span>
</span>
</div>
<iframe src="about:blank" id="vnc-iframe" border="0" width="1024" height="800"></iframe>
<iframe src="about:blank" id="vnc-iframe" border="0" width="1026" height="802"></iframe>
</dialog>

View File

@@ -9,7 +9,7 @@ $_REALPATH=realpath('../');
$uri=trim($_SERVER['REQUEST_URI'],'/');
include($_REALPATH.'/php/clonos.php');
$clonos=new ClonOS($_REALPATH,$uri);
//echo json_encode($clonos->config->os_types);exit;
if(isset($_GET['upload']))
{
include('upload.php');
@@ -38,6 +38,14 @@ if(empty($uri))
}
error_reporting(E_ALL);
$user_info=$clonos->userAutologin();
if(!$user_info['error'])
{
$user_info_txt="user_id='${user_info['id']}';user_login='${user_info['username']}';";
}else{
$user_info['username']='guest';
}
?>
<!DOCTYPE html>
<head>
@@ -59,9 +67,10 @@ error_reporting(E_ALL);
<script type="text/javascript">
_server_name='<?php echo $clonos->server_name; ?>';_first_start=true;
err_messages={add:function(arr){for(n in arr){err_messages[n]=arr[n];}}};
<?php if(isset($user_info_txt)) echo $user_info_txt; ?>
</script>
</head>
<body class="gadget1">
<body class="gadget1 login">
<main><div class="main"><div id="content">
<?php
@@ -85,6 +94,7 @@ echo $clonos->menu->html;
<ul>
<li class="mhome"><a href="/">Home</a></li>
<li><a href="/settings/"><?php echo $clonos->translate('Settings'); ?></a></li>
<li><a href="/users/"><?php echo $clonos->translate('Users'); ?></a></li>
<!--
<li><a href="/profile/"><?php echo $clonos->translate('Profile'); ?></a></li>
<li><a href="/support/"><?php echo $clonos->translate('Support'); ?></a></li>
@@ -101,10 +111,18 @@ if(isset($_languages))foreach($_languages as $lng=>$lngname)
?>
</select>
</a></li>
<li><a onclick="clonos.logout();" class="link" id="user-login"><?php echo $user_info['username']; ?></a></li>
</ul>
</div></header>
<div class="login-area<?php if(!$user_info['error']) echo ' hide'; ?>"><?php echo $clonos->placeDialogByName('system-login'); ?>
<div class="ccopy">ClonOS — is a powerfull system for&hellip;</div>
<div class="ccopy">Jails, Virtualization, WebDeveloping, etc&hellip;</div>
</div>
<div class="spinner"></div>
<div class="online icon-online" id="net-stat" onclick="ws_debug();"></div>
</body>
</html>
</html>
<?php //print_r($clonos->userGetInfo()); ?>
<?php //print_r($_SERVER); ?>

View File

@@ -73,6 +73,7 @@ var clonos={
$(window).on('hashchange',$.proxy(this.onHashChange,this));
$('#lng-sel').on('change',$.proxy(this.setLang,this)); //function(){document.cookie="lang="+$(this).val()+";path=/;";location.reload();});
$('#content').on('click',$.proxy(this.bodyClick,this));
$('#login').on('click',$.proxy(this.loginAction,this));
$('.closer').on('click',$.proxy(this.closerClick,this));
$(window).on('keypress',$.proxy(this.dialogCloseByKey,this))
.on('resize',$.proxy(this.onResize,this));
@@ -276,6 +277,22 @@ var clonos={
if(window.showModal=='function') return;
if(event.keyCode==27) this.dialogClose();
if(event.keyCode==13) this.checkInputComplete(target);
},
checkInputComplete:function(target)
{
if(target.nodeName=='INPUT')
{
if(target.name=='password')
{
var par=$(target).closest('#loginData');
if(par.length==1)
{
this.loginGo();
}
}
}
},
dialogSubmit:function(id)
{
@@ -362,7 +379,8 @@ var clonos={
this.tmp_jail_info[jid]={};
this.tmp_jail_info[jid]['runasap']=$('#astart-id:checked').length>0?1:0;
var posts=$('form#jailSettings').serializeArray();
if(mode=='edit') posts.push({'name':'jname','value':jid});
if(mode=='edit')
posts.push({'name':'jname','value':jid});
var jmode=(mode=='edit'?'jailEdit':'jailAdd');
this.loadData(jmode,$.proxy(this.onJailAdd,this),posts);
}
@@ -470,6 +488,23 @@ var clonos={
var posts=$('form#helpersAddSettings').serializeArray();
this.loadData('helpersAdd',$.proxy(this.onHelpersAdd,this),posts);
}
if(id=='users-new')
{
var pass1=$('form#userSettings input[name="password"]').val();
var pass2=$('form#userSettings input[name="password1"]').val();
if(pass1!=pass2)
{
var inp=$('form#userSettings input[name="password"]').get(0);
inp.setCustomValidity(this.translate('Passwords must match!'));
inp.reportValidity();
return;
}
var fmode=(mode=='edit')?'usersEdit':'usersAdd';
var posts=$('form#userSettings').serializeArray();
if(mode=='edit') posts.push({'name':'user_id','value':this.lastEditedUser});
this.loadData(fmode,$.proxy(this.onUsersAdd,this),posts);
}
}
},
@@ -496,9 +531,11 @@ var clonos={
},
onJailAdd:function(data)
{
/*
try{
var data=JSON.parse(data);
}catch(e){this.debug(e.message,data);return;}
*/
if(typeof data!='undefined' && !data.error)
{
@@ -588,9 +625,11 @@ var clonos={
},
onHelpersAdd:function(data)
{
/*
try{
var data=JSON.parse(data);
}catch(e){this.debug(e.message,data);return;}
*/
this.dialogClose();
@@ -598,9 +637,11 @@ var clonos={
},
onAuthkeyAdd:function(data)
{
/*
try{
var data=JSON.parse(data);
}catch(e){this.debug(e.message,data);return;}
*/
if(typeof data!='undefined' && !data.error)
{
@@ -631,9 +672,11 @@ var clonos={
},
onVpnetAdd:function(data)
{
/*
try{
var data=JSON.parse(data);
}catch(e){this.debug(e.message,data);return;}
*/
if(typeof data!='undefined' && !data.error)
{
@@ -738,9 +781,12 @@ var clonos={
},
onUpdateBhyveISO:function(data)
{
/*
try{
var data=JSON.parse(data);
}catch(e){this.debug(e.message,data);return;}
*/
if(typeof data.iso_list!='undefined')
{
$('dialog #bhyveSettings select[name="vm_iso_image"]').html(data.iso_list);
@@ -752,13 +798,53 @@ var clonos={
},
onGetFreeJname:function(data)
{
/*
try{
var data=JSON.parse(data);
}catch(e){this.debug(e.message,data);return;}
*/
$('dialog#jail-settings input[name="jname"]').val(data.freejname);
$('dialog#jail-settings input[name="host_hostname"]').val(data.freejname+'.my.domain');
},
onUsersAdd:function(data)
{
/*
try{
var data=JSON.parse(data);
}catch(e){this.debug(e.message,data);return;}
*/
if(typeof data.error!='undefined')
{
if(data.error)
{
if(data.errorType=='user-exists')
{
var inp=$('form#userSettings input[name="username"]').get(0);
inp.setCustomValidity(this.translate('This name is already exists!'));
inp.reportValidity();
return;
}
}else{
if(typeof data.res!='undefined')
{
var res=data.res;
if(res.error)
{
alert('SQL error: ' + res.info[2]);
return;
}
}
this.dialogClose();
this.wssReload();
this.dataReload();
}
}
},
loadData:function(mode,return_func,arr,spinner)
{
if(spinner!==false) $('.spinner').show();
@@ -772,9 +858,32 @@ var clonos={
posts['form_data'][arr[n]['name']]=arr[n]['value'];
}
$.post(path,posts,
$.proxy(function(data){return_func(data);$('.spinner').hide();},this)
$.proxy(function(data){this.onLoadDataAuthorize(return_func,data);$('.spinner').hide();},this) //return_func(data)
);
},
onLoadDataAuthorize:function(return_func,data)
{
try{
var data=JSON.parse(data);
}catch(e){this.debug(e.message,data);return;}
if(typeof data['unregistered_user']!='undefined')
{
this.loginFadeIn();
return;
}
if(typeof data.error!='undefined')
{
if(data.error && typeof(data.error_message)!='undefined')
{
this.notify(data.error_message,'error');
return;
}
}
return_func(data);
},
/* loadData1:function()
{
@@ -799,9 +908,14 @@ var clonos={
}, */
onLoadData:function(data)
{
try{
var data=JSON.parse(data);
}catch(e){this.debug(e.message,data);return;}
/*
if(typeof data!='object')
{
try{
var data=JSON.parse(data);
}catch(e){this.debug(e.message,data);return;}
}
*/
if(data.error)
{
@@ -1120,9 +1234,11 @@ var clonos={
update:function(data)
{
/*
try{
var data=JSON.parse(data);
}catch(e){this.debug(e.message,data);return;}
*/
/* if(typeof data['mod_ops']!='undefined')
{
@@ -1345,9 +1461,11 @@ var clonos={
},
onAuthkeyRemove:function(data)
{
/*
try{
var data=JSON.parse(data);
}catch(e){this.debug(e.message,data);return;}
*/
if(typeof data.error!='undefined')
{
@@ -1370,9 +1488,11 @@ var clonos={
},
onVpnetRemove:function(data)
{
/*
try{
var data=JSON.parse(data);
}catch(e){this.debug(e.message,data);return;}
*/
if(typeof data.error!='undefined')
{
@@ -1395,9 +1515,11 @@ var clonos={
},
onMediaRemove:function(data)
{
/*
try{
var data=JSON.parse(data);
}catch(e){this.debug(e.message,data);return;}
*/
if(typeof data.error!='undefined')
{
@@ -1451,6 +1573,34 @@ var clonos={
$('tr#'+id+' .jstatus').html(this.translate(this.commands[op]['stat'][1]));
}
},
userRemove:function(id)
{
var c=confirm(this.translate('You want to delete selected CBSD user! Are you sure?'));
if(!c) return;
var posts=[{'name':'user_id','value':id}];
this.loadData('userRemove',$.proxy(this.onUserRemove,this),posts,false);
},
onUserRemove:function(data)
{
/*
try{
var data=JSON.parse(data);
}catch(e){this.debug(e.message,data);return;}
*/
if(typeof data.error!='undefined')
{
if(data.error)
{
this.notify(data.error_message,'error');
return;
}
}
this.wssReload();
this.dataReload();
},
logOpen:function(id)
@@ -1462,9 +1612,11 @@ var clonos={
},
onLogLoad:function(data)
{
/*
try{
var data=JSON.parse(data);
}catch(e){this.debug(e.message,data);return;}
*/
if(typeof data.error!='undefined')
{
@@ -1484,9 +1636,11 @@ var clonos={
},
onLogFlush:function(data)
{
/*
try{
var data=JSON.parse(data);
}catch(e){this.debug(e.message,data);return;}
*/
if(typeof data.error!='undefined')
{
@@ -1539,6 +1693,16 @@ var clonos={
return;
}
}
if(cl=='letsedit')
{
var chkd=$(target).prop('checked');
var efs=$(target).closest('fieldset');
var inps=$('input[type="password"]',efs);
for(var n=0;n<inps.length;n++)
$(inps[n]).prop('disabled',!chkd);
}
return;
}
var elid=$(target).attr('id');
@@ -1607,6 +1771,11 @@ var clonos={
this.srcRemove(trid);
return;
}
if(tblid=='userslist')
{
this.userRemove(trid);
return;
}
this.jailRemove(trid,opt);
return;break;
case 'icon-arrows-cw':
@@ -1629,6 +1798,15 @@ var clonos={
return;break;
case 'btn-openlog':
this.logOpen(trid);
return;break;
case 'icon-edit':
switch(tblid)
{
case 'userslist':
this.userEdit(trid,tblid);
return;
}
return;break;
}
@@ -1791,6 +1969,79 @@ var clonos={
*/
},
loginAction:function(event)
{
var target=event.target;
var cl=$(target).attr('class');
if(typeof cl=='undefined') return;
var res=cl.match(new RegExp(/ok-but/));
if(res==null) return;
this.loginGo();
},
loginGo:function()
{
$('.login-wait').show();
this.loadData('login',$.proxy(this.onLogin,this),
[{'name':'login','value':$('#loginData input[name="login"]').val()},
{'name':'password','value':$('#loginData input[name="password"]').val()}]
);
$('#loginData input[name="password"]').val('');
},
onLogin:function(data)
{
$('.login-wait').hide();
/*
try{
var data=JSON.parse(data);
}catch(e){this.debug(e.message,data);return;}
*/
if(typeof data.errorCode!=='undefined')
{
if(data.errorCode==1)
{
$('.login-error-nouser').show();
setTimeout(function(){$('.login-error-nouser').hide();},3000);
return;
}
if(data.errorCode==0)
{
$('.login-area').fadeOut(200);
$('#user-login').html(data.username);
this.dataReload();
}
}
//this.loginFadeOut();
},
loginFadeOut:function()
{
setTimeout(function(){$('.login-area').fadeOut(200);},2000);
//$('.login-area').removeClass('fadeIn').addClass('fadeOut');
//setTimeout(function() { $('.login-area').hide(); }, 400);
},
loginFadeIn:function()
{
$('#login').show();
$('.login-wait').hide();
$('.login-area').fadeIn(200);
$('#login').find('input[type=text]').filter(':visible:first').focus();
//$('#loginData').find('input[name="login"]').filter(':visible:first').focus();
//$('.login-area').show();
//$('.login-area').removeClass('fadeOut').addClass('fadeIn');
},
logout:function()
{
document.cookie='mhash=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;'
$('#user-login').html('guest');
this.loginFadeIn();
},
ddmenu_interval:null,
cnt_mode:'new',
DDMenuShow:function(id,td,tr,event)
@@ -1938,9 +2189,11 @@ var clonos={
},
onDDMenuLoad:function(data)
{
/*
try{
var data=JSON.parse(data);
}catch(e){this.debug(e.message,data);return;}
*/
if(typeof data.error!='undefined')
{
@@ -1972,10 +2225,35 @@ var clonos={
},
userEdit:function(user_id,tblid)
{
var mode='userEditInfo';
var posts=[{'name':'tbl_id','value':tblid},{'name':'dialog','value':'users-new'},{'name':'user_id','value':user_id}];
this.loadData(mode,$.proxy(this.onUserEdit,this),posts);
},
onUserEdit:function(data)
{
/*
try{
var data=JSON.parse(data);
}catch(e){this.debug(e.message,data);return;}
*/
var dialog=data.dialog;
$('dialog#'+dialog+' fieldset.edit input[type="password"]').prop('disabled',true);
this.fillDialogVars(dialog,data.vars);
this.lastEditedUser=data.user_id;
this.dialogShow1(dialog,'edit');
},
dataReload:function()
{
this.loadData('getJsonPage',$.proxy(this.onLoadData,this));
},
wssReload:function()
{
this.wssend({'cmd':'reload','path':location.pathname},'system');
},
fillFormVars:function(form,data)
{
@@ -2023,6 +2301,7 @@ var clonos={
$(inp).prop('checked',$(inp).val()==v);
break;
case 'checkbox':
if(typeof v=='undefined') break;
$(inp).prop('checked',v==1);
break;
case 'range':
@@ -2072,9 +2351,11 @@ var clonos={
},
onSaveHelperValues:function(data)
{
/*
try{
var data=JSON.parse(data);
}catch(e){this.debug(e.message,data);return;}
*/
if(typeof data.error!='undefined' && data.error)
{
@@ -2111,9 +2392,11 @@ var clonos={
},
onDeleteHelperGroup:function(data)
{
/*
try{
var data=JSON.parse(data);
}catch(e){this.debug(e.message,data);return;}
*/
if(!data) return;
if(typeof data.error!='undefined')
@@ -2175,9 +2458,11 @@ var clonos={
},
onAddHelperGroup:function(data)
{
/*
try{
var data=JSON.parse(data);
}catch(e){this.debug(e.message,data);return;}
*/
if(!data) return;
if(typeof data.error!='undefined')
@@ -2320,7 +2605,6 @@ var clonos={
{
txt.client_id=this.client_id;
txt=JSON.stringify(txt);
return;
}
var msg=JSON.stringify({'author':author,'body':txt});
this.socket.send(msg);
@@ -2657,6 +2941,7 @@ return;
//window.setTimeout($.proxy(this.deleteItemsOk,this,id),2000);
setTimeout($.proxy(clonos.delete_file,this,id),3000);
clonos.dataReload();
clonos.wssReload();
},
onUploadError: function(id, message){
clonos.add_log('Failed to Upload file #p-' + id + ': ' + message);

View File

@@ -16,6 +16,8 @@ $lang=array(
'Virtual machine control panel'=>'Virtual machine control panel',
'Nodes'=>'Nodes',
'Nodes control panel'=>'Nodes control panel',
'VM Packages'=>'VM Packages',
'Manage for virtual machine packages'=>'Manage for virtual machine packages',
'Virtual Private Network'=>'Virtual Private Network',
'Manage for virtual private networks'=>'Manage for virtual private networks',
'Authkeys'=>'Authkeys',
@@ -125,5 +127,8 @@ $lang=array(
'@clone_warning@'=>'<strong>ATTENTION!</strong> Cloning of the running container can lead to data inconsistency in clones (eg environment with active database). Stop the container for safe cloning or continue, if you are confident in the security operation!',
'edit_title'=>'Edit',
'delete_title'=>'Delete',
//''=>'',
);

View File

@@ -16,6 +16,8 @@ $lang=array(
'Virtual machine control panel'=>'Панель управления нодами',
'Nodes'=>'Сервера',
'Nodes control panel'=>'Панель управления нодами',
'VM Packages'=>'Шаблоны виртуальных машин',
'Manage for virtual machine packages'=>'Управление профилями виртуальных машин',
'Virtual Private Network'=>'Виртуальные сети',
'Manage for virtual private networks'=>'Панель управления подсетями',
'Authkeys'=>'Ключи авторизации',
@@ -139,5 +141,12 @@ $lang=array(
'No installed helpers'=>'Нет установленных хелперов',
'edit_title'=>'Редактировать',
'delete_title'=>'Удалить',
'Users'=>'Пользователи',
'CBSD Users'=>'Учётные записи пользователей CBSD',
//''=>'',
);

View File

@@ -1,7 +1,7 @@
<?php
$res_array=array(
'num-nodes'=>0,
'online-nodes'=>0,
'num-nodes'=>1,
'online-nodes'=>1,
'offline-nodes'=>0,
'num-jails'=>0,
'num-cores'=>0,
@@ -23,7 +23,11 @@ if(!empty($nodes))foreach($nodes as $node)
$nodenames[]=$node['nodename'];
}
$res_array['num-nodes']=count($nodes);
// extra+1: мы предполагаем, что сервер с WEB интерфейсом
// также играет роль ноды - ее можно использовать полноценно со
// всеми ресурсами
$res_array['num-nodes']=count($nodes)+1;
if(!empty($nodenames))foreach($nodenames as $name)
{

View File

@@ -4,4 +4,4 @@
$form=new Forms('cbsd-settings');
$res=$form->generate();
echo $res['html'];
echo $res['html'];

View File

@@ -1,7 +1,9 @@
<?php
$username=$this->_user_info['username'];
$db=new Db('base','cbsdtaskd');
$res=$db->select("SELECT id,st_time,end_time,cmd,status,errcode,logfile FROM taskd WHERE owner='cbsdwebsys' ORDER BY id DESC");
$res=$db->select("SELECT id,st_time,end_time,cmd,status,errcode,logfile FROM taskd WHERE owner='${username}' ORDER BY id DESC");
$html='';
if($res!==false)

View File

@@ -0,0 +1,56 @@
<?php
/*
id INTEGER PRIMARY KEY AUTOINCREMENT,
username VARCHAR(150) UNIQUE NOT NULL,
password VARCHAR(128) UNIQUE NOT NULL,
first_name VARCHAR(32),
last_name VARCHAR(32),
last_login TIMESTAMP DATE,
is_active BOOLEAN DEFAULT 'true' NULL,
date_joined TIMESTAMP DATE DEFAULT (datetime('now','localtime'))
);
*/
$html='';
$db=new Db('clonos');
if($db!==false)
{
$res=$db->select("select id,username,first_name,last_name,date_joined,last_login,is_active from auth_user order by date_joined desc");
}
$nth=0;
$hres=$this->getTableChunk('users','tbody');
$html_tpl=$hres[1];
if(!empty($res))foreach($res as $r)
{
$html_tpl1=$html_tpl;
$vars=array(
'id'=>$r['id'],
'login'=>$r['username'],
'first_name'=>$r['first_name'],
'last_name'=>$r['last_name'],
'date_joined'=>$r['date_joined'],
'last_login'=>$r['last_login'],
'is_active'=>($r['is_active']==1)?'icon-ok':'',
'edit_title'=>$this->translate('edit_title'),
'delete_title'=>$this->translate('delete_title'),
);
foreach($vars as $var=>$val)
$html_tpl1=str_replace('#'.$var.'#',$val,$html_tpl1);
$html.=$html_tpl1;
}
$html=str_replace(array("\n","\r","\t"),'',$html);
echo json_encode(array(
'tbody'=>$html,
'error'=>false,
'func'=>'fillTable',
'id'=>'userslist',
//'tasks'=>$tasks,
//'template'=>$html_tpl_1,
//'protected'=>$protected,
));

View File

View File

@@ -0,0 +1,23 @@
<?php
$clonos->useDialogs(array(
'users-new',
));
?>
<h1>Пользователи CBSD</h1>
<p><span class="top-button icon-plus id:users-new">Добавить пользователя</span></p>
<table class="tsimple" id="userslist" width="100%">
<thead>
<tr>
<th class="txtleft">Логин</th>
<th class="txtleft">Имя</th>
<th class="txtleft">Фамилия</th>
<th class="txtleft">Дата регистрации</th>
<th class="txtleft">Последний вход</th>
<th class="txtcenter">Активный пользователь</th>
<th class="txtcenter wd-100">Действия</th>
</tr>
</thead>
<tbody></tbody>
</table>

View File

@@ -0,0 +1,14 @@
<tbody>
<tr class="#nth-num# helper" id="#id#">
<td class="txtleft vmiddle">#login#</td>
<td class="txtleft name vmiddle">#first_name#</td>
<td class="txtleft name vmiddle">#last_name#</td>
<td class="txtleft name vmiddle small date">#date_joined#</td>
<td class="txtleft name vmiddle small date">#last_login#</td>
<td class="txtcenter active vmiddle"><span class="#is_active#"></span></td>
<td class="ops vmiddle" width="5">
<span class="icon-edit" title="#edit_title#"></span>
<span class="icon-cancel" title="#delete_title#"></span>
</td>
</tr>
</tbody>

View File

@@ -84,3 +84,6 @@ cd_vnc_wait="1";
bhyve_vnc_resolution="1024x768";
bhyve_vnc_tcp_bind="#bhyve_vnc_tcp_bind#";
vnc_password="";