[php, js, css] change password is highly nice. checkbox fixes

This commit is contained in:
naumov-socolov 2012-02-03 00:44:02 +03:00
parent d53c7d889b
commit 74c83ed412
16 changed files with 694 additions and 699 deletions

View file

@ -14,7 +14,7 @@ class Captcha
protected $color3 = null;
protected $keyword = '';
public $key_len = 7;
protected $chars = 'qw1e2r3t4y5u67o8p9as9d38f6g4h3j2k1l3z5x7c8v3b5n781234567890';
protected $chars = 'qw1e2r3ty5u678p97as9d3o87f6gh3j2k73z5x7c8v3b75n77812356789';
public function __construct()
{

View file

@ -13,6 +13,7 @@ require_once V_ROOT_DIR . 'core/exceptions/ProtectionException.class.php';
require_once V_ROOT_DIR . 'core/utils/Message.class.php';
require_once V_ROOT_DIR . 'core/Request.class.php';
require_once V_ROOT_DIR . 'api/AjaxHandler.php';
require_once V_ROOT_DIR . 'api/MAIN.class.php';
class ChangePassword
@ -26,14 +27,14 @@ class ChangePassword
$key = addslashes(htmlspecialchars($_GET['v']));
$users = Vesta::execute(Vesta::V_LIST_SYS_USERS, 'json');
$cmd = Config::get('sudo_path')." ".Config::get('vesta_functions_path').Vesta::V_LIST_SYS_USERS." 'json'";
exec($cmd, $output, $return);
$users = json_decode(implode('', $output), true);
$email_matched_count = array();
/*if (strcmp($real_key, $key_sha1) != 0) {
return $this->renderError('Invalid keys');
}*/
foreach ($users['data'] as $username => $user) {
foreach ($users as $username => $user) {
if ($user['RKEY'] == trim($key)) {
$email_matched_count[] = array_merge(array('USERNAME' => $username), $user);
}
@ -62,15 +63,19 @@ class ChangePassword
$success = true;
foreach ($users as $user) {
$rs = Vesta::execute(Vesta::V_CHANGE_SYS_USER_PASSWORD, array('USER' => $user['USERNAME'],
'PASSWORD' => $_POST['secret_code']));
if (!$rs) {
$cmd = Config::get('sudo_path')." ".Config::get('vesta_functions_path').Vesta::V_CHANGE_SYS_USER_PASSWORD." ".$user['USERNAME']." ".$_POST['secret_code'];
exec($cmd, $output, $return);
if (!$return) {
$success = false;
}
}
if (!$success) {
return $this->showResetForm('Something went wrong. Please contact support.');
$main = new MAIN();
$about = json_decode($main->aboutExecute(), TRUE);
return $this->showResetForm('Something went wrong. Please contact support: '.$about['data']['company_email']);
}
return $this->showSuccessTpl();
@ -78,6 +83,10 @@ class ChangePassword
public function showSuccessTpl()
{
$main = new MAIN();
$about = json_decode($main->aboutExecute(), TRUE);
$current_year = date("Y");
print <<<HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru">
@ -101,7 +110,7 @@ class ChangePassword
<div class="b-auth-form">
<div class="b-auth-form-wrap">
<img width="72" height="24" alt="" src="/images/vesta-logo-2011-12-14.png" class="vesta-logo">
<span style="color: #5E696B; float: right; margin-top: -48px;">~!:VERSION~!</span>
<span style="color: #5E696B; float: right; margin-top: -48px;">{$about['data']['version_name']}</span>
<div class="b-client-title">
<span class="client-title-wrap">Control Panel<i class="planets">&nbsp;</i></span>
</div>
@ -111,10 +120,10 @@ class ChangePassword
<div class="success-box" id="change-psw-success">Password successfully changed.</div>
</form>
<p class="forgot-pwd">&nbsp;</p>
<p class="forgot-pwd"><a href="/" class="forgot-pwd-url">Back to login?</a></p>
<div class="footnotes cc">
<p class="additional-info">For questions please contact <a href="mailto:info@vestacp.com" class="questions-url">info@vestacp.com</a></p>
<address class="imprint">&copy; 2011 Vesta Control Panel</address>
<p class="additional-info">For questions please contact <a href="mailto:{$about['data']['company_email']}" class="questions-url">{$about['data']['company_email']}</a></p>
<address class="imprint">&copy; {$current_year} Vesta Control Panel</address>
</div>
</div>
</div>
@ -129,9 +138,14 @@ HTML;
public function showResetForm($error_msg = '')
{
if (!empty($error_msg)) {
$error_msg = '<i>'.$error_msg.'</i>';
$error_msg = '<div class="error-box" id="auth-error">'.$error_msg.'</div>';
}
$main = new MAIN();
$about = json_decode($main->aboutExecute(), TRUE);
$current_year = date("Y");
print <<<HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru">
@ -154,8 +168,10 @@ HTML;
<div id="change-psw-block" class="page2">
<div class="b-auth-form">
<div class="b-auth-form-wrap">
<a href="/">
<img width="72" height="24" alt="" src="/images/vesta-logo-2011-12-14.png" class="vesta-logo">
<span style="color: #5E696B; float: right; margin-top: -48px;">~!:VERSION~!</span>
</a>
<span style="color: #5E696B; float: right; margin-top: -48px;">{$about['data']['version_name']}</span>
<div class="b-client-title">
<span class="client-title-wrap">Control Panel<i class="planets">&nbsp;</i></span>
</div>
@ -171,58 +187,24 @@ HTML;
<label for="confirm_password" class="field-label">ONE MORE TIME</label>
<input type="password" tabindex="1" id="confirm_password" class="field-text" name="confirm_secret_code">
</div>
{$error_msg}
<div class="form-row cc last-row">
<input type="submit" tabindex="4" value="Change Password" class="sumbit-btn">
</div>
</form>
<p class="forgot-pwd">&nbsp;</p>
<p class="forgot-pwd"><a href="/" class="forgot-pwd-url">Back to login?</a></p>\
<div class="footnotes cc">
<p class="additional-info">For questions please contact <a href="mailto:info@vestacp.com" class="questions-url">info@vestacp.com</a></p>
<address class="imprint">&copy; 2011 Vesta Control Panel</address>
<p class="additional-info">For questions please contact <a href="mailto:{$about['data']['company_email']}" class="questions-url">{$about['data']['company_email']}</a></p>
<address class="imprint">&copy; {$current_year} Vesta Control Panel</address>
</div>
</div>
</div>
</div>
</body>
</html>
<!--
<center>
vesta password reset form
<hr />
{$error_msg}
<form action="" method="POST">
<table>
<tr>
<td>
<input type="hidden" name="action" value="change" />
<label>Enter secret code:</label>
</td>
<td>
<input type="password" name="secret_code" value="" />
</td>
</tr>
<tr>
<td>
<label>Enter new password:</label>
</td>
<td>
<input type="password" name="confirm_secret_code" value="" />
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" name="Apply" />
</td>
</tr>
</table>
</form>
</center> -->
HTML;
}
public function renderError($message)
@ -232,7 +214,6 @@ HTML;
HTML;
}
}
$changePassword = new ChangePassword();

View file

@ -591,8 +591,8 @@ input::-moz-focus-inner{
}
.checkbox-selector span.ui-checkbox{
float:none;
width:11px;
height:11px;
width:10px;
height:10px;
margin:2px 2px 0 0;
/*background:url(../i/checkbox-selector-2012-01-29.png) no-repeat;*/
background:url(../images/checkbox-selector-2012-01-31.png) no-repeat;
@ -608,12 +608,16 @@ input::-moz-focus-inner{
}
.checkbox-selector span.ui-checkbox-hover{
background-position:0 -20px;
-moz-box-shadow:0 0 5px rgba(82, 168, 236, 0.6);
-webkit-box-shadow:0 0 5px rgba(82, 168, 236, 0.6);
}
.checkbox-selector span.ui-checkbox-state-checked{
background-position:0 -40px;
}
.checkbox-selector span.ui-checkbox-state-checked-hover{
background-position:0 -60px;
-moz-box-shadow:0 0 5px rgba(82, 168, 236, 0.6);
-webkit-box-shadow:0 0 5px rgba(82, 168, 236, 0.6);
}
.checkbox-selector .selector-title:hover{
color:#2ea8bd;
@ -1277,6 +1281,8 @@ input::-moz-focus-inner{
.row-actions-box .check-control:hover{
cursor:pointer;
background-position:0 -89px;
-moz-box-shadow:0 0 5px rgba(82, 168, 236, 0.6);
-webkit-box-shadow:0 0 5px rgba(82, 168, 236, 0.6);
}
.row-actions-box .row-operations{
float:right;
@ -1681,7 +1687,7 @@ input::-moz-focus-inner{
float:left;
width:18px;
height:18px;
margin:6px 0 0;
margin:9px 0 0;
/*background:url(../i/checkbox-1.png) no-repeat;*/
/*background:url(../i/form-checkboxes.png) no-repeat;*/
background:url(../images/checkbox-selector-2012-01-31.png) no-repeat -12px 0;
@ -1691,12 +1697,16 @@ input::-moz-focus-inner{
}
.b-new-entry span.ui-checkbox-hover{
background-position:-12px -20px;
-moz-box-shadow:0 0 8px rgba(82, 168, 236, 0.6);
-webkit-box-shadow:0 0 8px rgba(82, 168, 236, 0.6);
}
.b-new-entry span.ui-checkbox-state-checked{
background-position:-12px -40px;
}
.b-new-entry span.ui-checkbox-state-checked-hover{
background-position:-12px -60px;
-moz-box-shadow:0 0 8px rgba(82, 168, 236, 0.6);
-webkit-box-shadow:0 0 8px rgba(82, 168, 236, 0.6);
}
.b-new-entry .stats-settings{

View file

@ -143,9 +143,8 @@ App.Actions.reset_batch = function()
App.Actions.do_change_password = function()
{
var params = {
email: $('#change-email').val(),
login: $('#change-login').val(),
captcha: $('#captcha').val()
}
@ -261,11 +260,13 @@ App.Actions.new_entry = function() {
var build_method = App.Env.getWorldName() + '_form';
var tpl = App.HTML.Build[build_method]({}, form_id);
var box = $('<div>').html(tpl);
$(box).find('.suspended').addClass('hidden');
App.Ref.CONTENT.prepend($(box).html());
App.Helpers.updateScreen();
}
$('.cust-checkbox').checkBox();
}
// execute authorisation
@ -403,6 +404,7 @@ App.Actions.edit = function(evt)
App.Helpers.disableNotEditable();
App.Helpers.updateScreen();
}
$('.cust-checkbox').checkBox();
}
// do_cancel_form

View file

@ -218,7 +218,6 @@ App.HTML.Build.web_domain_form = function (options, id) {
tpl.set(':DNS_DOMAIN_ALSO', in_edit? 'hidden' : '');
return tpl.finalize();
}

View file

@ -44,20 +44,22 @@ App.Templates.html = {
'<div id="change-psw-block" class="page2">\
<div class="b-auth-form">\
<div class="b-auth-form-wrap">\
<a href="/">\
<img width="72" height="24" alt="" src="~!:LOGO_URL~!" class="vesta-logo">\
</a>\
<span style="color: #5E696B; float: right; margin-top: -48px;">~!:VERSION~!</span>\
<div class="b-client-title">\
<span class="client-title-wrap">~!:PRODUCT_NAME~!<i class="planets">&nbsp;</i></span>\
</div>\
<form id="change_psw-form" method="post" action="#" class="auth">\
<div class="form-row cc">\
<label for="change-email" class="field-label">Email</label>\
<input type="text" tabindex="1" id="change-email" class="field-text">\
<label for="change-login" class="field-label">Login</label>\
<input type="text" tabindex="1" id="change-login" class="field-text">\
</div>\
<div class="form-row cc">\
<label for="captcha" class="field-label">Captcha</label>\
<label class="captcha"><img id="captcha-img" width="127px;" src="~!:CAPTCHA_URL~!" style="cursor: pointer; float: left; margin-top: -7px; padding-left: 20px;" onClick="this.src = \'~!:CAPTCHA_URL_2~!?\'+Math.floor(Math.random() * 9999)"/></label>\
<input type="text" id="captcha" class="field-text" style="margin-left: 11px; width: 132px; margin-bottom: 27px;">\
<input type="text" id="captcha" tabindex=2 class="field-text" style="margin-left: 11px; width: 132px; margin-bottom: 27px;">\
</div>\
<div id="change-psw-success" class="success-box hidden"></div>\
<div id="change-psw-error" class="error-box hidden"></div>\
@ -65,7 +67,7 @@ App.Templates.html = {
<div class="b-remember">\
<span class="remember-me">&nbsp;</span>\
</div>\
<input type="submit" tabindex="4" value="Send confirmation" class="sumbit-btn do_action_do_change_password">\
<input type="submit" tabindex="3" value="Send confirmation" class="sumbit-btn do_action_do_change_password">\
</div>\
</form>\
<p class="forgot-pwd"><a href="#" class="forgot-pwd-url do_action_back_to_login">Back to login?</a></p>\
@ -80,7 +82,9 @@ App.Templates.html = {
login: ['<div id="auth-block" class="page2">\
<div class="b-auth-form">\
<div class="b-auth-form-wrap">\
<a href="/">\
<img width="72" height="24" alt="" src="~!:LOGO_URL~!" class="vesta-logo">\
</a>\
<span style="color: #5E696B; float: right; margin-top: -48px;">~!:VERSION~!</span>\
<div class="b-client-title">\
<span class="client-title-wrap">~!:PRODUCT_NAME~!<i class="planets">&nbsp;</i></span>\

View file

@ -126,18 +126,18 @@ App.Templates.html = {
</div>\
<div class="form-row cc">\
<input type="hidden" value="~!:DATE~!" name="DATE">\
<label for="#" class="field-label">Domain:</label>\
<input type="text" name="DNS_DOMAIN" value="~!:DNS_DOMAIN~!" class="text-field rule-required rule-domain">\
<label for="dns-domain" class="field-label"><span class="mandatory">Domain:</span></label>\
<input type="text" id="dns-domain" name="DNS_DOMAIN" value="~!:DNS_DOMAIN~!" class="text-field rule-required rule-domain">\
</div>\
<div class="form-row cc">\
<label for="#" class="field-label">IP:</label>\
<label for="ip" class="field-label"><span class="mandatory">IP:</span></label>\
<div class="autocomplete-box">\
<input type="text" name="IP" value="~!:IP~!" class="text-field rule-required rule-ip">\
<input type="text" id="ip" name="IP" value="~!:IP~!" class="text-field rule-required rule-ip">\
<i class="arrow">&nbsp;</i>\
</div>\
</div>\
<div class="form-row dns-template-box cc">\
<label for="#" class="field-label">Template:</label>\
<label for="selecttemplate" class="field-label">Template:</label>\
<span class="select" id="selecttemplate">~!:TPL_DEFAULT_VALUE~! t </span>\
<select name="TPL" class="styled tpl-item">\
~!:TPL~!\
@ -149,8 +149,8 @@ App.Templates.html = {
<input type="text" value="~!:TTL~!" name="TTL" class="text-field ttl-field rule-required rule-numeric">\
</div>\
<div class="form-row cc">\
<label for="#" class="field-label">SOA:</label>\
<input type="text" value="~!:SOA~!" name="SOA" class="text-field rule-required rule-ns">\
<label for="soa" class="field-label"><span class="mandatory">SOA:</span></label>\
<input type="text" value="~!:SOA~!" id="soa" name="SOA" class="text-field rule-required rule-ns">\
</div -->\
<div class="form-row suspended cc">\
<label for="#" class="field-label">Suspended:</label>\
@ -584,8 +584,8 @@ App.Templates.html = {
<span class="prop-value">~!:SHELL~!</span>\
</span>\
<span class="prop-box backups-box">\
<span class="prop-title">backups:</span>\
<span class="prop-value">retention ~!:BACKUPS~!</span>\
<span class="prop-title">backup retention:</span>\
<span class="prop-value">~!:BACKUPS~!</span>\
</span>\ </div>\
</div><!-- // .row-details -->\
</div>']

View file

@ -1,3 +1,4 @@
<?
phpinfo();
?>
<?php
echo "<pre>\n";
exec('sudo /usr/local/vesta/bin/v_list_users json', $out);
print_r($out);

View file

@ -44,26 +44,26 @@ class MAIN extends AjaxHandler
return $this->reply(false, null, 'Captcha is invalid ');
}
$users = Vesta::execute(Vesta::V_LIST_SYS_USERS, 'json');
$email_matched_count = array();
$cmd = Config::get('sudo_path')." ".Config::get('vesta_functions_path').Vesta::V_LIST_SYS_USERS." 'json'";
exec($cmd, $output, $return);
if (!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/",$request->getParameter('email'))) {
return $this->reply(false, null, 'Email is invalid');
}
$users = json_decode(implode('', $output), true);
foreach ($users['data'] as $user) {
if ($user['CONTACT'] == trim($request->getParameter('email'))) {
$email_matched_count[] = $user;
$login_matched_count = array();
foreach ($users as $user => $data) {
if ($user == trim($request->getParameter('login'))) {
$login_matched_count[$user] = $data;
}
}
if (empty($email_matched_count)) {
if (empty($login_matched_count)) {
return $this->reply(false, null, 'There is no such user.');
}
foreach ($email_matched_count as $reset_user) {
foreach ($login_matched_count as $reset_user => $data) {
$secret_key = $reset_user['RKEY'];
$secret_key = $data['RKEY'];
$reset_link = 'https://'.$_SERVER['HTTP_HOST'].'/change_password.php?v='.$secret_key;
$mail_body = <<<MAIL
@ -73,7 +73,7 @@ class MAIN extends AjaxHandler
</a>
<div style="font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;font-size:13px;margin:14px">
<h2 style="font-family:'Helvetica Neue', Arial, Helvetica, sans-serif;margin:0 0 16px;font-size:18px;font-weight:normal">
Vesta received a request to reset the password for your account {$reset_user['FNAME']} {$reset_user['LNAME']}?
Vesta received a request to reset the password for your account {$data['FNAME']} {$data['LNAME']}?
</h2>
<p>
If you want to reset your password, click on the link below (or copy and paste the URL into your browser):<br>
@ -96,7 +96,7 @@ MAIL;
$headers = 'MIME-Version: 1.0' . "\n";
$headers .= 'Content-type: text/html; charset=UTF-8' . "\n";
$to = $request->getParameter('email');
$to = $data['CONTACT'];
$subject = 'Reset your Vesta password';
$message = $mail_body;
mail($to, $subject, $message, $headers);

View file

@ -61,14 +61,12 @@ class VestaSession
public function getUserRole()
{
// if (isset($_SESSION['user'])) {
if($_SESSION['user'] == 'vesta'){
return Vesta::ADMIN;
}
else{
return Vesta::USER;
}
// }
print json_encode(array('result' => "NOT_AUTHORISED"));
exit;