From 3c81394a3ee646e918e16915a51c41fbfa0450d8 Mon Sep 17 00:00:00 2001 From: naumov-socolov Date: Tue, 17 Jan 2012 00:57:07 +0300 Subject: [PATCH] Pre release --- test/test_actions.sh | 48 +- web/css/main.css | 8 +- web/images/checkbox-selector.png | Bin 3000 -> 1156 bytes web/images/checkboxes.png | Bin 0 -> 5926 bytes web/images/chekbox-selector.png | Bin 1422 -> 3000 bytes web/images/fav.ico | Bin 1179 -> 3599 bytes web/images/form-checkboxes.png | Bin 0 -> 1188 bytes web/images/section-status-sprite-7.png | Bin 0 -> 993 bytes web/index.html | 45 +- web/js/__init__.js | 6 +- web/js/_settings.js | 11 +- web/js/actions.js | 2 +- web/js/html.js | 29 +- web/js/lib/custom-form-elements.js | 5 +- web/js/pages.js | 3 +- web/js/templates.js | 34 +- web/js/templates_admin.js | 1151 ++++++++++++++++++++++++ web/js/user_templates.js | 1151 ++++++++++++++++++++++++ web/vesta/api/DB.class.php | 7 +- web/vesta/api/DNS.class.php | 2 +- web/vesta/api/MAIN.class.php | 32 +- web/vesta/api/USER.class.php | 46 +- web/vesta/core/Vesta.class.php | 6 +- web/vesta/core/VestaSession.class.php | 16 +- web/vesta/upload.php | 8 +- 25 files changed, 2486 insertions(+), 124 deletions(-) create mode 100644 web/images/checkboxes.png create mode 100644 web/images/form-checkboxes.png create mode 100644 web/images/section-status-sprite-7.png create mode 100644 web/js/templates_admin.js create mode 100644 web/js/user_templates.js diff --git a/test/test_actions.sh b/test/test_actions.sh index 1e4396bdc..c57df4fb6 100755 --- a/test/test_actions.sh +++ b/test/test_actions.sh @@ -6,14 +6,14 @@ V_BIN="$VESTA/bin" V_TEST="$VESTA/test" # Define functions -tmp_user() { +random() { MATRIX='0123456789' - LENGTH=4 + LENGTH=$1 while [ ${n:=1} -le $LENGTH ]; do rand="$rand${MATRIX:$(($RANDOM%${#MATRIX})):1}" let n+=1 done - echo "tmp_$rand" + echo "$rand" } echo_result() { @@ -25,8 +25,8 @@ echo_result() { echo -n 'FAILED' echo -n ']' echo -ne '\r\n' - echo "$4" - echo "RETURN VALUE $2" + echo ">>> $4" + echo ">>> RETURN VALUE $2" cat $3 else echo -n ' OK ' @@ -36,54 +36,63 @@ echo_result() { } # Create random username -user=$(tmp_user) +user="tmp_$(random 4)" while [ ! -z "$(grep "^$user:" /etc/passwd)" ]; do - user=$(tmp_user) + user="tmp_$(random 4)" done # Create random tmpfile tmpfile=$(mktemp -p /tmp ) + # Add new user cmd="v_add_user $user $user $user@vestacp.com default Super Test" $cmd > $tmpfile 2>> $tmpfile echo_result "Adding new user $user" "$?" "$tmpfile" "$cmd" + # Change system shell cmd="v_change_user_shell $user bash" $cmd > $tmpfile 2>> $tmpfile echo_result "Changing system shell to /bin/bash" "$?" "$tmpfile" "$cmd" + # Change name servers cmd="v_change_user_ns $user ns0.com ns1.com ns2.com ns3.com" $cmd > $tmpfile 2>> $tmpfile echo_result "Changing nameservers" "$?" "$tmpfile" "$cmd" + # Add cron job cmd="v_add_cron_job $user 1 1 1 1 1 echo" $cmd > $tmpfile 2>> $tmpfile echo_result "Adding cron job" "$?" "$tmpfile" "$cmd" + # Suspend cron job cmd="v_suspend_cron_job $user 1" $cmd > $tmpfile 2>> $tmpfile echo_result "Suspending cron job" "$?" "$tmpfile" "$cmd" + # Unsuspend cron job cmd="v_unsuspend_cron_job $user 1" $cmd > $tmpfile 2>> $tmpfile echo_result "Unsuspending cron job" "$?" "$tmpfile" "$cmd" + # Delete cron job cmd="v_delete_cron_job $user 1" $cmd > $tmpfile 2>> $tmpfile echo_result "Deleting cron job" "$?" "$tmpfile" "$cmd" + # Add cron job cmd="v_add_cron_job $user 1 1 1 1 1 echo 1" $cmd > $tmpfile 2>> $tmpfile echo_result "Adding cron job" "$?" "$tmpfile" "$cmd" + # Add cron job cmd="v_add_cron_job $user 1 1 1 1 1 echo 1" $cmd > $tmpfile 2>> $tmpfile @@ -94,9 +103,28 @@ else fi echo_result "Dublicate cron job check" "$retval" "$tmpfile" "$cmd" -# Check ip -#cat /proc/net/dev|cut -f 1 -d :|tail -n1 -#v_add_sys_ip 192.168.11.11 255.255.255.255 venet0 ekho + +# List network interfaces +cmd="v_list_sys_interfaces plain" +interface=$($cmd 2> $tmpfile | head -n 1) +if [ -z "$interface" ]; then + echo_result "Listing network interfaces" "1" "$tmpfile" "$cmd" +else + echo_result "Listing network interfaces" "0" "$tmpfile" "$cmd" +fi + + +# Add new ip address +cmd="v_add_sys_ip 198.18.0.123 255.255.255.255 $interface $user" +$cmd > $tmpfile 2>> $tmpfile +echo_result "Adding ip 198.18.0.123" "$?" "$tmpfile" "$cmd" + + +# Delete ip address +cmd="v_delete_sys_ip 198.18.0.123" +$cmd > $tmpfile 2>> $tmpfile +echo_result "Deleting ip 198.18.0.123" "$?" "$tmpfile" "$cmd" + # Delete new user cmd="v_delete_user $user" diff --git a/web/css/main.css b/web/css/main.css index 6f4f59435..1d209ea43 100644 --- a/web/css/main.css +++ b/web/css/main.css @@ -1584,10 +1584,14 @@ input::-moz-focus-inner{ background-color:#FFFFCB; } .b-new-entry select.styled{ - top:10px; + top:0; } .b-new-entry option{ - font:14px arial,sans-serif; + padding:5px 5px 5px 8px; + font-family:Arial, Helvetica, sans-serif; + font-size:14px; + font-weight:bold; + color:#555; } .b-new-entry .form-options-group{} diff --git a/web/images/checkbox-selector.png b/web/images/checkbox-selector.png index f2005fbf504213f1cfe7f851fc3aa45be540e810..698ac83bfa284df0994656c1072b263445dc9c38 100644 GIT binary patch literal 1156 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 diff --git a/web/images/fav.ico b/web/images/fav.ico index 7c26ae9dff9279abe5f7fffd2a833f99a72c018f..a1ef01996c2d643f3eab6a6601139100c0a9016b 100644 GIT binary patch delta 3580 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 C>b#2p diff --git a/web/images/form-checkboxes.png b/web/images/form-checkboxes.png new file mode 100644 index 0000000000000000000000000000000000000000..fadce3ead7bc58bf2e2c240c6c8676c34608cdcf GIT binary patch literal 1188 zcmaJ=TWAwm7#^E;iDDFd5v32qsC_b-OPZz`lh!1YYSe^m5^U89PG?S=v7I^N%&AH9 z;K~YupzJnUDg}jQA?(7&2Q`W}`s72PAUOL3`%$&=7-}it2 zfBrddP^1f`U@yvw1|Whm>;Ys{75hLE zi1N^(3h)zzja1TIs4KRMm!RqrEsQIt>X=Os{`Q-BCXIfi9uhND@|$$EJ=$1@DMI4B&=kbC*0(6JZ` z?*dc?A)Tk`Y&Pr4x?RxdqgkKNXK8Sp6C<4FkcPyZQ!_VI6$D^PhN2?{YNVwo_P{|D zps>?#DX99AtY$8j2^Wmci8{@?7%QbJFc$kcR8^PICQ5?uet#%zriXMuCxHnE4GCXd z?*=QB&W8;kB50%`9H>??k%0)B8K{%tl!xq8G#O^i1#~RNM>P|PngpUkfWmy2qR4!t zHN>_CBOcBdWLP%Bwz3=-@(Cf%9SlX9-7QtF0Hr|{XsF7SzjIq^a;-*CbsSj$hH@Cl z9R^g%g@k#fwikCzy+y8E+e>pzE{)C5*0uicnyW{+cdX@7)8fri+XD^vx`CV8^V>6s ze~5HqS2{93KYz7yJ9T}2W@g6k_fJnx*VWbGkL7Z?p`oEtsm#sIH8wUDi^YkFiSF)h zo6R;hHdZJUN~MzBZXX#L866$1udjDF98FD4!^6W^@KoESJeFug$#@EHYYk%U#V3;( zSBMJ1bZ+X!J@2Zc%*uvDc<$EZr^ly@N6#?~VS6xp`iU@HT77)CzGLh2JLu_nN9pX@ zSAVa)dgWyL;MCr~T6f+JKK$j)=Qct19qSxirqP=xvupCR1J^#4XUFkiIj|S>`P)=`;2`hZrRun z0~-_V&QdXSLkOlyER|5j(iKJ!LSjS;=QK$f2sha8J$>Kze(v3~N_lN@;no5GV6n8W zR{@yWWA=slS@!+uI2HPWGdE5sn@kT!-T&+6hTww#?uAMpwRv(T+KY17_#N_1zHHcFT2pchgoJ zZuK5qiB%@xVQRtH+wvnd*0`ar%IqX8aBv8rn;LgkRMV`$0tqop^C)Gb41yVv7v<$_ zHhTw3NJIjX1W`(fSyh%)gy86KEL-Sw)T&+_W`~|0x{RcLFR_aYVL5n_XOIDM=Nmg%Demgmpr;##5~H2qjUE1h7y` z!-nfSq#q5@rm2?vh+4jlOS;A}KJU7YigI!;zibrcq9Ti;A?6J^r(}#`UQ|#fyDW{l zIOUs~U@%0us VJy_sA)0Zxzf|60z5Av<2e*hy+JLdoZ literal 0 HcmV?d00001 diff --git a/web/index.html b/web/index.html index febb71277..92b4a2f3e 100644 --- a/web/index.html +++ b/web/index.html @@ -82,7 +82,6 @@
User -  
0 users @@ -98,7 +97,6 @@
Web -  
0 web domains @@ -108,12 +106,24 @@ +
  • +
    +
    +
    + DNS +
    +
    + 0 dns domain(s) +
    +
    +
    + +
  • Mail -  
    0 mail domain(s) @@ -127,7 +137,6 @@
    DB -  
    0 databases @@ -137,44 +146,28 @@
  • -
  • +
  • - DNS -   + Cron
    - 0 dns domain(s) -
    -
    -
    - -
  • -
  • -
    -
    -
    - IP -   -
    -
    - 0 ip address(es) + 0 cron job(s) 0 suspended
  • -
  • +
  • - Cron -   + IP
    - 0 cron job(s) + 0 ip address(es) 0 suspended
    diff --git a/web/js/__init__.js b/web/js/__init__.js index a475c716c..0926352f8 100644 --- a/web/js/__init__.js +++ b/web/js/__init__.js @@ -11,9 +11,9 @@ $('document').ready(function() { App.Utils.detectBrowser(); App.Ref.init(); - App.Env.world = 'USER'; + //App.Env.world = 'USER'; // Disabled cookie tab restoring. Enable if needed - /*if ('undefined' != typeof App.Tmp.loadTAB) { + if ('undefined' != typeof App.Tmp.loadTAB) { App.Env.world = App.Tmp.loadTAB; } @@ -25,7 +25,7 @@ $('document').ready(function() { else { App.Env.world = App.Constants.TABS[0]; } - }*/ + } App.Pages.init(); App.Core.listen(); diff --git a/web/js/_settings.js b/web/js/_settings.js index 47e07e5c5..2c34671ac 100644 --- a/web/js/_settings.js +++ b/web/js/_settings.js @@ -59,11 +59,12 @@ App.Messages.get = function(key, plural) { } // Imutable -App.Settings.Imutable = {}; -App.Settings.Imutable.USER = ['LOGIN_NAME']; -App.Settings.Imutable.DB = ['DB', 'TYPE', 'USER']; -App.Settings.Imutable.DNS = ['DNS_DOMAIN']; -App.Settings.Imutable.IP = ['INTERFACE']; +App.Settings.Imutable = {}; +App.Settings.Imutable.USER = ['LOGIN_NAME']; +App.Settings.Imutable.WEB_DOMAIN = ['DOMAIN']; +App.Settings.Imutable.DB = ['DB', 'TYPE', 'USER', 'CHARSET', 'HOST']; +App.Settings.Imutable.DNS = ['DNS_DOMAIN']; +App.Settings.Imutable.IP = ['IP_ADDRESS', 'NETMASK', 'INTERFACE']; // Empty diff --git a/web/js/actions.js b/web/js/actions.js index 6c1867e73..dd5bbe4c7 100644 --- a/web/js/actions.js +++ b/web/js/actions.js @@ -87,7 +87,7 @@ App.Actions.update_cs_value = function(evt) if (App.Tmp[App.Env.world + '_selected_records'] > 0) { var confirm_message_key = App.Tmp[App.Env.world + '_selected_records'] == 1 ? 1 + ' record' : App.Tmp[App.Env.world + '_selected_records'] + ' records'; - var confirmed = confirm('This action will ' + val.toLowerCase() + ' ' + confirm_message_key + '. Do you want to proceede?'); + var confirmed = confirm('This action will ' + val.toLowerCase() + ' ' + confirm_message_key + '. Do you want to proceed?'); if (confirmed) { fb.log('mass_' + val); var func_name = val.toLowerCase(); diff --git a/web/js/html.js b/web/js/html.js index 496060408..f8c5d94d0 100644 --- a/web/js/html.js +++ b/web/js/html.js @@ -110,7 +110,7 @@ App.HTML.Build.user_form = function (options, id) { ns[ns.length++] = App.Templates.get('PLUS_ONE_NS', 'user').finalize(); tpl.set(':NS', ns.done()); } else { -// tpl.set(':NS', ''); + tpl.set(':NS', ''); } tpl = App.HTML.setTplKeys(tpl, options, true); tpl = App.HTML.Build.user_selects(tpl, options); @@ -664,27 +664,14 @@ App.HTML.Build.db_selects = function (tpl, options) { }); tpl.set(':TYPE_OPTIONS', acc.done()); - acc = []; - var items = App.Env.initialParams.DB.HOST; - $.each(items, function (val) { - var tpl = App.Templates.get('select_option', 'general'); - tpl.set(':VALUE', val); - tpl.set(':TEXT', items[val]); - tpl.set(':SELECTED', val == options.HOST ? 'selected="selected"' : ''); - acc[acc.length++] = tpl.finalize(); - }); - tpl.set(':HOST_OPTIONS', acc.done()); + var obj = App.Env.initialParams.DB.HOST; + var opts = App.HTML.Build.options(obj, options.HOST); + tpl.set(':HOST_OPTIONS', opts); - acc = []; - var items = App.Env.initialParams.DB.ENCODING; - $.each(items, function (val) { - var tpl = App.Templates.get('select_option', 'general'); - tpl.set(':VALUE', val); - tpl.set(':TEXT', items[val]); - tpl.set(':SELECTED', val == options.ENCODING ? 'selected="selected"' : ''); - acc[acc.length++] = tpl.finalize(); - }); - tpl.set(':ENCODING_OPTIONS', acc.done()); + + var obj = App.Env.initialParams.DB.CHARSET; + var opts = App.HTML.Build.options(obj, options.CHARSET); + tpl.set(':CHARSET_OPTIONS', opts); return tpl; } diff --git a/web/js/lib/custom-form-elements.js b/web/js/lib/custom-form-elements.js index a68126b19..95ec2b4f3 100644 --- a/web/js/lib/custom-form-elements.js +++ b/web/js/lib/custom-form-elements.js @@ -25,7 +25,7 @@ Visit http://ryanfait.com/ for more information. var checkboxHeight = "25"; var radioHeight = "25"; -var selectWidth = "210"; +var selectWidth = "230"; /* No need to change anything after this */ @@ -47,6 +47,9 @@ var Custom = { if ($(inputs[a]).attr('class').indexOf('do_action_toggle_batch_selector') != -1) { span[a].className += ' do_action_toggle_batch_selector'; // save toggle functionality } + if ($(inputs[a]).attr('class').indexOf('do_action_toggle_ssl_support') != -1) { + span[a].className += ' do_action_toggle_ssl_support'; // save toggle functionality + } if(inputs[a].checked == true) { diff --git a/web/js/pages.js b/web/js/pages.js index 381059d2f..1343e4496 100644 --- a/web/js/pages.js +++ b/web/js/pages.js @@ -70,7 +70,8 @@ App.Pages.USER.new_entry = function(evt) $(box).find('.suspended').addClass('hidden'); App.Ref.CONTENT.prepend($(box).html()); App.Helpers.updateScreen(); - $('#'+form_id).find('.ns-entry, .additional-ns-add').addClass('hidden'); + $('#'+form_id).find('.ns-entry, .additional-ns-add').addClass('hidden').find('.rule-required').removeClass('rule-required'); + $('#'+form_id).find('.shell-entry').addClass('hidden'); } App.Pages.WEB_DOMAIN.new_entry = function(evt) diff --git a/web/js/templates.js b/web/js/templates.js index f48e17389..c9a964ad5 100644 --- a/web/js/templates.js +++ b/web/js/templates.js @@ -144,14 +144,14 @@ App.Templates.html = { \ View template settings\
    \ -
    \ + \
    \ \ \ @@ -241,7 +241,7 @@ App.Templates.html = { \ \
    \ -
    \ + \
    '] }, ip: { @@ -403,12 +403,12 @@ App.Templates.html = { ~!:PACKAGE_OPTIONS~!\ \ \ - \ + \ \
    \ \ \ @@ -860,14 +860,14 @@ App.Templates.html = { Generate\
    \ \ - \ - \ + \ +
    \ + \ + \ +
    \
    \ \ \ @@ -912,10 +912,10 @@ App.Templates.html = {
    \
    \ \ - \ + \ + Character Set:\ + ~!:CHARSET~!\ + \ \
    \
    \ diff --git a/web/js/templates_admin.js b/web/js/templates_admin.js new file mode 100644 index 000000000..5a7f9a8a9 --- /dev/null +++ b/web/js/templates_admin.js @@ -0,0 +1,1151 @@ +App.Templates.html = { + help: { + DNS_form: ['

    Some Things You Just Can\'t Explain

    \ + A farmer was sitting in the neighborhood bar getting drunk. A man came in and asked the farmer, "Hey, why are you sitting here on this beautiful day, getting drunk?" The farmer shook his head and replied, "Some things you just can\'t explain."\ + "So what happened that\'s so horrible?" the man asked as he sat down next to the farmer.\ + "Well," the farmer said, "today I was sitting by my cow, milking her. Just as I got the bucket full, she lifted her left leg and kicked over the bucket."\ + "Okay," said the man, "but that\'s not so bad." "Some things you just can\'t explain," the farmer replied. "So what happened then?" the man asked. The farmer said, "I took her left leg and tied it to the post on the left."\ + "And then?"\ + "Well, I sat back down and continued to milk her. Just as I got the bucket full, she took her right leg and kicked over the bucket."\ + The man laughed and said, "Again?" The farmer replied, "Some things you just can\'t explain." "So, what did you do then?" the man asked.\ + "I took her right leg this time and tied it to the post on the right."\ + "And then?"\ + "Well, I sat back down and began milking her again. Just as I got the bucket full, the stupid cow knocked over the bucket with her tail."\ + "Hmmm," the man said and nodded his head. "Some things you just can\'t explain," the farmer said.\ + "So, what did you do?" the man asked.\ + "Well," the farmer said, "I didn\'t have anymore rope, so I took off my belt and tied her tail to the rafter. In that moment, my pants fell down and my wife walked in ... Some things you just can\'t explain."'] + }, + general: { + over_bar: [''], + loading: ['
    \ +
    \ +
    '], + popup: ['\ + '], + inner_popup: ['
    \ +
    \ + ×\ +
    ~!:POPUP_TITLE~!
    \ +
    \ + ~!:CONTENT~!\ +
    \ +
    \ +
    '], + select_option: [''], + error_elm: ['
    ~!:ERROR~!
    '], + SUSPENDED_TPL_NOT_SUSPENDED : ['enabled'], + SUSPENDED_TPL_SUSPENDED : ['suspended'] + }, + popup: { + error: ['

    Important: An Error Has Occured.


        Something went wrong and some of your actions can be not saved in system. Mostly, it happens when you have network connection errors.
    ,    However, please notify us about the situation. It would be helpfull if you will write us approximate time the error occured and last actions you were performing. You send your petition on this email: BLABLA,

    Sorry for inconvinience. (We recommend you to reload the page)
    '], + change_psw: [ + '
    \ +
    \ +
    \ + \ + ~!:VERSION~!\ +
    \ + ~!:PRODUCT_NAME~! \ +
    \ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + \ + \ +
    \ + \ + \ +
    \ +
    \ +  \ +
    \ + \ +
    \ +
    \ +

    \ +
    \ +

    For questions please contact ~!:EMAIL~!

    \ +
    © ~!:YEAR~! Vesta Control Panel
    \ +
    \ +
    \ +
    \ +
    ' + ], + login: ['
    \ +
    \ +
    \ + \ + ~!:VERSION~!\ +
    \ + ~!:PRODUCT_NAME~! \ +
    \ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + \ +
    \ + \ +
    \ +
    \ + \ + \ +
    \ + \ +
    \ +
    \ +

    forgot password?

    \ +
    \ +

    For questions please contact ~!:EMAIL~!

    \ +
    © ~!:YEAR~! Vesta Control Panel
    \ +
    \ +
    \ +
    \ +
    '] + }, + dates: { + 'lock_plan_date' : [''], + 'save_forecasted_date' : [''] + }, + dns: { + FORM: [ + '
    \ + \ + \ +
    ~!:title~!
    \ + \ +
    \ + \ + \ + \ +
    \ +
    \ + \ +
    \ + \ +  \ +
    \ +
    \ +
    \ + \ + ~!:TPL_DEFAULT_VALUE~!\ + \ + View template settings\ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + Cancel\ + Delete\ +
    \ +
    ' + ], + ENTRIES_WRAPPER: ['
    ~!:content~!
    '], + ENTRY: ['
    \ + \ + \ +
    \ +
    \ +
    \ + ~!:SUSPENDED_TPL~!\ +
    \ +
    \ +
    \ +
    ~!:DATE~!
    \ +
    \ +
    \ +
    \ +
    \ + ~!:DNS_DOMAIN~!\ +
    \ +
    Show records
    \ +
    \ +
    \ +
    \ + ~!:IP~!\ + \ + template:\ + \ + ~!:TPL~!\ + \ +
    \ +
    \ +
    \ + \ + ttl:\ + ~!:TTL~!\ + \ + \ + soa:\ + ~!:SOA~!\ + \ +
    \ +
    \ +
    '], + SUBFORM: ['
    \ +
    \ +
    Hide records
    \ +
    \ +
    \ +
    \ + \ + ~!:SUBRECORDS~!\ +
    \ + \ + Cancel\ + \ +
    \ +
    '], + SUBENTRY: ['
    \ + \ +
    \ + \ +
    \ + \ +
    in
    \ +
    \ +
    \ +
    \ + \ + \ + \ +
    \ +
    \ + \ + \ +
    \ +
    \ +
    '] + }, + ip: { + FORM: ['\ +
    \ + \ + \ +
    ~!:title~!
    \ + \ +
    \ + \ + \ +
    \ +
    \ + \ +
    \ + \ +
    \ +
    \ +
    \ + \ + \ + \ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + \ + \ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + Cancel\ + Delete\ +
    \ +
    \ + '], + DOT: ['.'], + ENTRY: ['\ +
    \ + \ + \ +
    \ +
    \ +
    \ + ~!:SUSPENDED_TPL~!\ +
    \ +
    \ +
    \ +
    ~!:DATE~!
    \ +
    \ +
    \ +
    \ +
    \ + ~!:IP_ADDRESS~!\ +
    \ + \ + netmask:\ + ~!:NETMASK~!\ + \ + \ + interface:\ + ~!:INTERFACE~!\ + \ + \ + name:\ + ~!:NAME~!\ + \ +
    \ +
    \ + \ + owner:\ + ~!:OWNER~!\ + \ + \ + status:\ + ~!:STATUS~!\ + \ +
    \ +
    \ + \ + sys users:\ + ~!:U_SYS_USERS~!\ + \ + \ + web domains:\ + ~!:U_WEB_DOMAINS~!\ + \ +
    \ +
    \ +
    \ + '], + ENTRIES_WRAPPER: ['
    ~!:content~!
    '], + SUSPENDED_TPL_ENABLED : ['enabled\ + delete'], + SUSPENDED_TPL_DISABLED : ['suspended'] + }, + + + user: { + WEB_TPL_MINIMIZED: ['~!:WEB_TPL_MINI~!\ + \ + ~!:MORE_NUMBER~! more\ + '], + WEB_TPL: ['~!:NAME~!'], + NS_MINIMIZED: ['~!:NS_MINI~!\ + \ + ~!:MORE_NUMBER~! more\ + '], + NS_RECORD: ['~!:NAME~!'], + NS_INPUT: ['
    \ + \ + \ + \ +
    '], + PLUS_ONE_NS: [''], + ENTRIES_WRAPPER: ['
    ~!:content~!
    '], + FORM: ['
    \ + \ + \ +
    ~!:title~!
    \ + \ +
    \ + \ + \ +
    \ +
    \ + \ + \ + Generate\ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + \ +
    \ + \ +
    \ + \ + \ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + \ +
    \ + ~!:NS~!\ +
    \ + \ + \ +
    \ +
    \ + \ + Cancel\ + Delete\ +
    \ +
    '], + ENTRY: ['
    \ + \ + \ +
    \ +
    \ +
    \ + ~!:SUSPENDED_TPL~!\ +
    \ +
    \ +
    \ +
    ~!:DATE~!
    \ +
    \ +
    \ +
    \ +
    \ +
    \ + \ + ~!:LOGIN_NAME~!\ + \ + \ + \ + package:\ + ~!:PACKAGE~!\ + \ +
    \ +
    \ + \ + \ + \ + \ + name:\ + ~!:FULLNAME~!\ + \ + \ + email:\ + \ + ~!:CONTACT~!\ + (reports ~!:REPORTS_ENABLED~!)\ + \ + \ +
    \ +
    \ + \ + \ +
    \ +
    stats
    \ + \ +
    \ + disk usage:\ +
    \ +
    \ +
    \ + ~!:U_DISK_PERCENTAGE~!% (~!:U_DISK~! ~!:DISK_QUOTA_MEASURE~!)\ + \ + ~!:OVER_BAR~!\ +
    \ +
    \ +
    ~!:DISK_QUOTA~! ~!:DISK_QUOTA_MEASURE_2~!
    \ +
    \ +
    \ +
    \ + \ +
    \ + bandwidth:\ +
    \ +
    \ +
    \ + ~!:U_BANDWIDTH_PERCENTAGE~!% (~!:U_BANDWIDTH~! ~!:BANDWIDTH_MEASURE~!)\ + \ + ~!:OVER_BAR_2~!\ +
    \ +
    \ +
    ~!:BANDWIDTH~! ~!:BANDWIDTH_MEASURE_2~!
    \ +
    \ +
    \ +
    \ +
    \ + \ + web ssl:\ + ~!:U_WEB_SSL~! (~!:WEB_SSL~!)\ + \ + \ + web alias:\ + ~!:WEB_ALIASES~! per domain\ + \ + \ + web templates:\ + \ + ~!:WEB_TPL~!\ + \ + \ + \ + databases:\ + ~!:U_DATABASES~! (~!:DATABASES~!)\ + \ + \ + shell:\ + ~!:SHELL~!\ + \ + \ + backups:\ + retention ~!:BACKUPS~!\ + \ +
    \ +
    \ + \ + mailboxes:\ + ~!:U_MAIL_BOXES~! (~!:MAIL_BOXES~!)\ + \ + \ + mail forwarders:\ + ~!:U_MAIL_FORWARDERS~! (~!:MAIL_FORWARDERS~!)\ + \ + \ + mail domains:\ + ~!:U_MAIL_DOMAINS~! (~!:MAIL_DOMAINS~!)\ + \ + \ + web domains:\ + ~!:U_WEB_DOMAINS~! (~!:WEB_DOMAINS~!)\ + \ + \ + dns domains:\ + ~!:U_DNS_DOMAINS~! (~!:DNS_DOMAINS~!)\ + \ + \ + ns list:\ + \ + ~!:NS~!\ + \ +
    \ +
    \ +
    '] + }, + web_domain: { + FORM: ['
    \ + \ + \ +
    ~!:title~!
    \ + \ +
    \ + \ + \ +
    \ +
    \ + \ +
    \ + \ +
    \ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + \ +
    \ + \ +
    \ + \ + \ +
    \ + \ +
    \ + \ + Cancel\ + Delete\ +
    \ +
    '], + ENTRIES_WRAPPER: ['
    ~!:content~!
    '], + ENTRY: ['
    \ + \ + \ +
    \ +
    \ +
    \ + ~!:SUSPENDED_TPL~!\ +
    \ +
    \ +
    \ +
    ~!:DATE~!
    \ +
    \ +
    \ +
    \ + ~!:DOMAIN~!\ + Alias:\ + ~!:ALIAS~!\ +
    \ +
    \ +
    \ + ~!:IP~!\ + \ + template:\ + ~!:TPL~!\ + \ +
    \ +
    \ +
    stats
    \ + \ +
    \ + disk usage:\ +
    \ +
    \ +
    \ + ~!:U_DISK_PERCENTAGE~!% (~!:U_DISK~! ~!:DISK_QUOTA_MEASURE~!)\ + \ + ~!:OVER_BAR~!\ +
    \ +
    \ +
    ~!:DISK_QUOTA~! ~!:DISK_QUOTA_MEASURE_2~!
    \ +
    \ +
    \ +
    \ + \ +
    \ + bandwidth:\ +
    \ +
    \ +
    \ + ~!:U_BANDWIDTH_PERCENTAGE~!% (~!:U_BANDWIDTH~! ~!:BANDWIDTH_MEASURE~!)\ + \ + ~!:OVER_BAR_2~!\ +
    \ +
    \ +
    ~!:BANDWIDTH~! ~!:BANDWIDTH_MEASURE_2~!
    \ +
    \ +
    \ +
    \ +
    \ + \ + php:\ + ~!:PHP~!\ + \ + \ + cgi:\ + ~!:CGI~!\ + \ + \ + elog:\ + ~!:ELOG~!\ + \ + \ + stats:\ + ~!:STAT~!\ + \ + ~!:STATS_AUTH~!\ + \ + \ +
    \ +
    \ + \ + ssl:\ + ~!:SSL~!\ + \ + \ + nginx:\ + ~!:NGINX~!\ + extension list\ + \ +
    \ +
    \ +
    '] + }, + db: { + USER_ITEMS_WRAPPER: ['
    ~!:CONTENT~!
    '], + USER_ITEM: ['\ + ~!:NAME~!\ + \ + change password'], + DIVIDER: ['
    \ + \ + \ + ~!:TYPE~!\ + \ + \ +
    '], + ENTRIES_WRAPPER: ['
    ~!:content~!
    '], + FORM: ['
    \ + \ + \ +
    ~!:title~!
    \ + \ +
    \ + \ + \ +
    \ +
    \ + \ + \ +
    \ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + \ + Generate\ +
    \ +
    \ + \ +
    \ + \ + \ +
    \ +
    \ + \ + Cancel\ + Delete\ +
    \ +
    '], + ENTRY: ['
    \ + \ + \ +
    \ +
    \ +
    \ + ~!:SUSPENDED_TPL~!\ +
    \ +
    \ +
    \ +
    \ + \ + ~!:OWNER~!\ + \ +
    \ +
    ~!:DATE~!
    \ +
    \ +
    \ +
    \ +
    \ + ~!:DB~!\ +
    \ +
    \ + \ +
    \ + backup\ + \ +
    \ +
    \ +
    \ + ~!:U_DISK~! Mb\ +
    \ + \ +
    \ +
    \ +
    ~!:DISK~! ~!:DISK_MEASURE~!
    \ +
    \ +
    \ +
    \ +
    \ +
    '] + }, + cron: { + FORM: ['
    \ + \ + \ +
    ~!:title~!
    \ + \ +
    \ + Schedule Time:\ +
    \ + \ +
    \ + \ +
    \ +
    \ +
    \ + \ +
    \ + \ +
    \ +
    \ +
    \ + \ +
    \ + \ +
    \ +
    \ +
    \ + \ +
    \ + \ +
    \ +
    \ +
    \ + \ +
    \ + \ +
    \ +
    \ +
    \ +
    \ + \ + \ +
    \ + \ +
    \ + \ + \ +
    \ +
    \ + \ + Cancel\ + Delete\ +
    \ +
    '], + ENTRIES_WRAPPER: ['
    ~!:content~!
    '], + ENTRY: ['
    \ + \ + \ +
    \ +
    \ +
    \ + ~!:SUSPENDED_TPL~!\ +
    \ +
    \ +
    \ +
    ~!:DATE~!
    \ +
    \ +
    \ +
    \ + \ + min\ + ~!:MIN~!\ + \ + \ + hour\ + ~!:HOUR~!\ + \ + \ + day of Month\ + ~!:DAY~!\ + \ + \ + Month\ + ~!:MONTH~!\ + \ + \ + day of Week\ + ~!:WDAY~!\ + \ +
    \ +
    \ + ~!:CMD~!\ +
    \ + \ +
    \ +
    '] + }, + backup: { + WRAPPER: ['
    ~!:CONTENT~!
    '], + ENTRY: ['
    \ + \ +
    \ +
    \ +
    \ + \ + owner:\ + ~!:OWNER~!\ + \ +
    \ +
    \ +
    \ +
    \ + \ + \ + ~!:CREATED_AT~!\ + ~!:CREATED_AT_TIME~!\ + \ + ~!:CREATED_AT_WDAY~!\ + \ + \ + Generation time:\ + ~!:GENERATION_TIME~!\ + \ +
    \ +
    \ + \ + ~!:SIZE~!\ + \ + download\ +
    \ + \ +
    \ +
    '] + }, + stats: { + WRAPPER: ['
    ~!:CONTENT~!
    '], + ENTRY: ['
    \ +

    ~!:HEADER~!

    \ +
    \ + \ +
    \ +
    '], + SUBMENU: ['today\ + week\ + month\ + year
    '] + } +} + + +// Internals +var Tpl = App.Templates; +var Templator = function() +{ + var init = function() { + fb.info('Templator work'); + Templator.splitThemAll(); + Templator.freezeTplIndexes(); + }; + + /** + * Split the tpl strings into arrays + */ + Templator.splitThemAll = function() + { + fb.info('splitting tpls'); + $.each(App.Templates.html, function(o) { + var tpls = App.Templates.html[o]; + $.each(tpls, function(t) { + tpls[t] = tpls[t][0].split('~!'); + }); + }); + }, + + /** + * Iterates tpls + */ + Templator.freezeTplIndexes = function() + { + fb.info('freezing tpl keys'); + $.each(App.Templates.html, Templator.cacheTplIndexes); + }, + + /** + * Grab the tpl group key and process it + */ + Templator.cacheTplIndexes = function(key) + { + var tpls = App.Templates.html[key]; + $.each(tpls, function(o) { + var tpl = tpls[o]; + Templator.catchIndex(key, o, tpl); + }); + }, + + /** + * Set the indexes + */ + Templator.catchIndex = function(key, ref_key, tpl) + { + 'undefined' == typeof App.Templates._indexes[key] ? App.Templates._indexes[key] = {} : false; + 'undefined' == typeof App.Templates._indexes[key][ref_key] ? App.Templates._indexes[key][ref_key] = {} : false; + $(tpl).each(function(index, o) { + if(':' == o.charAt(0)){ + App.Templates._indexes[key][ref_key][o.toString()] = index; + } + }); + } + + /** + * Get concrete templates + */ + init(); + return Templator; +}; +Templator.getTemplate = function(ns, key) +{ + return [ + App.Templates._indexes[ns][key], + App.Templates.html[ns][key].slice(0) + ]; +} +// init templator +Tpl.Templator = Templator(); +Tpl.get = function(key, group) +{ + return Tpl.Templator.getTemplate(group, key); +} diff --git a/web/js/user_templates.js b/web/js/user_templates.js new file mode 100644 index 000000000..beefbc05d --- /dev/null +++ b/web/js/user_templates.js @@ -0,0 +1,1151 @@ +alert('User templates loaded'); +App.Templates.html = { + help: { + DNS_form: ['

    Some Things You Just Can\'t Explain

    \ + A farmer was sitting in the neighborhood bar getting drunk. A man came in and asked the farmer, "Hey, why are you sitting here on this beautiful day, getting drunk?" The farmer shook his head and replied, "Some things you just can\'t explain."\ + "So what happened that\'s so horrible?" the man asked as he sat down next to the farmer.\ + "Well," the farmer said, "today I was sitting by my cow, milking her. Just as I got the bucket full, she lifted her left leg and kicked over the bucket."\ + "Okay," said the man, "but that\'s not so bad." "Some things you just can\'t explain," the farmer replied. "So what happened then?" the man asked. The farmer said, "I took her left leg and tied it to the post on the left."\ + "And then?"\ + "Well, I sat back down and continued to milk her. Just as I got the bucket full, she took her right leg and kicked over the bucket."\ + The man laughed and said, "Again?" The farmer replied, "Some things you just can\'t explain." "So, what did you do then?" the man asked.\ + "I took her right leg this time and tied it to the post on the right."\ + "And then?"\ + "Well, I sat back down and began milking her again. Just as I got the bucket full, the stupid cow knocked over the bucket with her tail."\ + "Hmmm," the man said and nodded his head. "Some things you just can\'t explain," the farmer said.\ + "So, what did you do?" the man asked.\ + "Well," the farmer said, "I didn\'t have anymore rope, so I took off my belt and tied her tail to the rafter. In that moment, my pants fell down and my wife walked in ... Some things you just can\'t explain."'] + }, + general: { + logged_as: ['
    You (~!:YOU_ARE~!) are viewing ~!:USER~! interface. Exit it to return to your own.
    '], + over_bar: [''], + loading: ['
    \ +
    \ +
    '], + popup: ['\ + '], + inner_popup: ['
    \ +
    \ + ×\ +
    ~!:POPUP_TITLE~!
    \ +
    \ + ~!:CONTENT~!\ +
    \ +
    \ +
    '], + select_option: [''], + error_elm: ['
    ~!:ERROR~!
    '], + SUSPENDED_TPL_NOT_SUSPENDED : ['enabled'], + SUSPENDED_TPL_SUSPENDED : ['suspended'] + }, + popup: { + error: ['

    Important: An Error Has Occured.


        Something went wrong and some of your actions can be not saved in system. Mostly, it happens when you have network connection errors.
    ,    However, please notify us about the situation. It would be helpfull if you will write us approximate time the error occured and last actions you were performing. You send your petition on this email: BLABLA,

    Sorry for inconvinience. (We recommend you to reload the page)
    '], + change_psw: [ + '
    \ +
    \ +
    \ + \ + ~!:VERSION~!\ +
    \ + ~!:PRODUCT_NAME~! \ +
    \ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + \ + \ +
    \ + \ + \ +
    \ +
    \ +  \ +
    \ + \ +
    \ +
    \ +

    \ +
    \ +

    For questions please contact ~!:EMAIL~!

    \ +
    © ~!:YEAR~! Vesta Control Panel
    \ +
    \ +
    \ +
    \ +
    ' + ], + login: ['
    \ +
    \ +
    \ + \ + ~!:VERSION~!\ +
    \ + ~!:PRODUCT_NAME~! \ +
    \ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + \ +
    \ + \ +
    \ +
    \ + \ + \ +
    \ + \ +
    \ +
    \ +

    forgot password?

    \ +
    \ +

    For questions please contact ~!:EMAIL~!

    \ +
    © ~!:YEAR~! Vesta Control Panel
    \ +
    \ +
    \ +
    \ +
    '] + }, + dates: { + 'lock_plan_date' : [''], + 'save_forecasted_date' : [''] + }, + dns: { + FORM: [ + '
    \ + \ + \ +
    ~!:title~!
    \ + \ +
    \ + \ + \ + \ +
    \ +
    \ + \ +
    \ + \ +  \ +
    \ +
    \ +
    \ + \ + ~!:TPL_DEFAULT_VALUE~!\ + \ + View template settings\ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + Cancel\ + Delete\ +
    \ +
    ' + ], + ENTRIES_WRAPPER: ['
    ~!:content~!
    '], + ENTRY: ['
    \ + \ + \ +
    \ +
    \ +
    \ + ~!:SUSPENDED_TPL~!\ +
    \ +
    \ +
    \ +
    ~!:DATE~!
    \ +
    \ +
    \ +
    \ +
    \ + ~!:DNS_DOMAIN~!\ +
    \ +
    Show records
    \ +
    \ +
    \ +
    \ + ~!:IP~!\ + \ + template:\ + \ + ~!:TPL~!\ + \ +
    \ +
    \ +
    \ + \ + ttl:\ + ~!:TTL~!\ + \ + \ + soa:\ + ~!:SOA~!\ + \ +
    \ +
    \ +
    '], + SUBFORM: ['
    \ +
    \ +
    Hide records
    \ +
    \ +
    \ +
    \ + \ + ~!:SUBRECORDS~!\ +
    \ + \ + Cancel\ + \ +
    \ +
    '], + SUBENTRY: ['
    \ + \ +
    \ + \ +
    \ + \ +
    in
    \ +
    \ +
    \ +
    \ + \ + \ + \ +
    \ +
    \ + \ + \ +
    \ +
    \ +
    '] + }, + ip: { + FORM: ['\ +
    \ + \ + \ +
    ~!:title~!
    \ + \ +
    \ + \ + \ +
    \ +
    \ + \ +
    \ + \ +
    \ +
    \ +
    \ + \ + \ + \ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + \ + \ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + Cancel\ + Delete\ +
    \ +
    \ + '], + DOT: ['.'], + ENTRY: ['\ +
    \ + \ + \ +
    \ +
    \ +
    \ + ~!:SUSPENDED_TPL~!\ +
    \ +
    \ +
    \ +
    ~!:DATE~!
    \ +
    \ +
    \ +
    \ +
    \ + ~!:IP_ADDRESS~!\ +
    \ + \ + netmask:\ + ~!:NETMASK~!\ + \ + \ + interface:\ + ~!:INTERFACE~!\ + \ + \ + name:\ + ~!:NAME~!\ + \ +
    \ +
    \ + \ + owner:\ + ~!:OWNER~!\ + \ + \ + status:\ + ~!:STATUS~!\ + \ +
    \ +
    \ + \ + sys users:\ + ~!:U_SYS_USERS~!\ + \ + \ + web domains:\ + ~!:U_WEB_DOMAINS~!\ + \ +
    \ +
    \ +
    \ + '], + ENTRIES_WRAPPER: ['
    ~!:content~!
    '], + SUSPENDED_TPL_ENABLED : ['enabled\ + delete'], + SUSPENDED_TPL_DISABLED : ['suspended'] + }, + + + user: { + WEB_TPL_MINIMIZED: ['~!:WEB_TPL_MINI~!\ + \ + ~!:MORE_NUMBER~! more\ + '], + WEB_TPL: ['~!:NAME~!'], + NS_MINIMIZED: ['~!:NS_MINI~!\ + \ + ~!:MORE_NUMBER~! more\ + '], + NS_RECORD: ['~!:NAME~!'], + NS_INPUT: ['
    \ + \ + \ + \ +
    '], + PLUS_ONE_NS: [''], + ENTRIES_WRAPPER: ['
    ~!:content~!
    '], + FORM: ['
    \ + \ + \ +
    ~!:title~!
    \ + \ +
    \ + \ + \ +
    \ +
    \ + \ + \ + Generate\ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + \ +
    \ + \ +
    \ + \ + \ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + \ +
    \ + ~!:NS~!\ +
    \ + \ + \ +
    \ +
    \ + \ + Cancel\ + Delete\ +
    \ +
    '], + ENTRY: ['
    \ + \ + \ +
    \ +
    \ +
    \ + ~!:SUSPENDED_TPL~!\ +
    \ +
    \ +
    \ +
    ~!:DATE~!
    \ +
    \ +
    \ +
    \ +
    \ +
    \ + \ + ~!:LOGIN_NAME~!\ + \ + \ + \ + package:\ + ~!:PACKAGE~!\ + \ +
    \ +
    \ + \ + name:\ + ~!:FULLNAME~!\ + \ + \ + email:\ + \ + ~!:CONTACT~!\ + (reports ~!:REPORTS_ENABLED~!)\ + \ + \ +
    \ +
    \ + \ + \ +
    \ +
    stats
    \ + \ +
    \ + disk usage:\ +
    \ +
    \ +
    \ + ~!:U_DISK_PERCENTAGE~!% (~!:U_DISK~! ~!:DISK_QUOTA_MEASURE~!)\ + \ + ~!:OVER_BAR~!\ +
    \ +
    \ +
    ~!:DISK_QUOTA~! ~!:DISK_QUOTA_MEASURE_2~!
    \ +
    \ +
    \ +
    \ + \ +
    \ + bandwidth:\ +
    \ +
    \ +
    \ + ~!:U_BANDWIDTH_PERCENTAGE~!% (~!:U_BANDWIDTH~! ~!:BANDWIDTH_MEASURE~!)\ + \ + ~!:OVER_BAR_2~!\ +
    \ +
    \ +
    ~!:BANDWIDTH~! ~!:BANDWIDTH_MEASURE_2~!
    \ +
    \ +
    \ + \ +
    \ +
    \ + \ + web ssl:\ + ~!:U_WEB_SSL~! (~!:WEB_SSL~!)\ + \ + \ + web alias:\ + ~!:WEB_ALIASES~! per domain\ + \ + \ + web templates:\ + \ + ~!:WEB_TPL~!\ + \ + \ + \ + databases:\ + ~!:U_DATABASES~! (~!:DATABASES~!)\ + \ + \ + shell:\ + ~!:SHELL~!\ + \ + \ + backups:\ + retention ~!:BACKUPS~!\ + \ +
    \ +
    \ + \ + mailboxes:\ + ~!:U_MAIL_BOXES~! (~!:MAIL_BOXES~!)\ + \ + \ + mail forwarders:\ + ~!:U_MAIL_FORWARDERS~! (~!:MAIL_FORWARDERS~!)\ + \ + \ + mail domains:\ + ~!:U_MAIL_DOMAINS~! (~!:MAIL_DOMAINS~!)\ + \ + \ + web domains:\ + ~!:U_WEB_DOMAINS~! (~!:WEB_DOMAINS~!)\ + \ + \ + dns domains:\ + ~!:U_DNS_DOMAINS~! (~!:DNS_DOMAINS~!)\ + \ + \ + ns list:\ + \ + ~!:NS~!\ + \ +
    \ +
    \ +
    '] + }, + web_domain: { + FORM: ['
    \ + \ + \ +
    ~!:title~!
    \ + \ +
    \ + \ + \ +
    \ +
    \ + \ +
    \ + \ +
    \ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + \ +
    \ + \ +
    \ + \ + \ +
    \ + \ +
    \ + \ + Cancel\ + Delete\ +
    \ +
    '], + ENTRIES_WRAPPER: ['
    ~!:content~!
    '], + ENTRY: ['
    \ + \ + \ +
    \ +
    \ +
    \ + ~!:SUSPENDED_TPL~!\ +
    \ +
    \ +
    \ +
    ~!:DATE~!
    \ +
    \ +
    \ +
    \ + ~!:DOMAIN~!\ + Alias:\ + ~!:ALIAS~!\ +
    \ +
    \ +
    \ + ~!:IP~!\ + \ + template:\ + ~!:TPL~!\ + \ +
    \ +
    \ +
    stats
    \ + \ +
    \ + disk usage:\ +
    \ +
    \ +
    \ + ~!:U_DISK_PERCENTAGE~!% (~!:U_DISK~! ~!:DISK_QUOTA_MEASURE~!)\ + \ + ~!:OVER_BAR~!\ +
    \ +
    \ +
    ~!:DISK_QUOTA~! ~!:DISK_QUOTA_MEASURE_2~!
    \ +
    \ +
    \ +
    \ + \ +
    \ + bandwidth:\ +
    \ +
    \ +
    \ + ~!:U_BANDWIDTH_PERCENTAGE~!% (~!:U_BANDWIDTH~! ~!:BANDWIDTH_MEASURE~!)\ + \ + ~!:OVER_BAR_2~!\ +
    \ +
    \ +
    ~!:BANDWIDTH~! ~!:BANDWIDTH_MEASURE_2~!
    \ +
    \ +
    \ +
    \ +
    \ + \ + php:\ + ~!:PHP~!\ + \ + \ + cgi:\ + ~!:CGI~!\ + \ + \ + elog:\ + ~!:ELOG~!\ + \ + \ + stats:\ + ~!:STAT~!\ + \ + ~!:STATS_AUTH~!\ + \ + \ +
    \ +
    \ + \ + ssl:\ + ~!:SSL~!\ + \ + \ + nginx:\ + ~!:NGINX~!\ + extension list\ + \ +
    \ +
    \ +
    '] + }, + db: { + USER_ITEMS_WRAPPER: ['
    ~!:CONTENT~!
    '], + USER_ITEM: ['\ + ~!:NAME~!\ + \ + change password'], + DIVIDER: ['
    \ + \ + \ + ~!:TYPE~!\ + \ + \ +
    '], + ENTRIES_WRAPPER: ['
    ~!:content~!
    '], + FORM: ['
    \ + \ + \ +
    ~!:title~!
    \ + \ +
    \ + \ + \ +
    \ +
    \ + \ + \ +
    \ +
    \ +
    \ + \ + \ +
    \ +
    \ + \ + \ + Generate\ +
    \ +
    \ + \ +
    \ + \ + \ +
    \ +
    \ + \ + Cancel\ + Delete\ +
    \ +
    '], + ENTRY: ['
    \ + \ + \ +
    \ +
    \ +
    \ + ~!:SUSPENDED_TPL~!\ +
    \ +
    \ +
    \ +
    \ + \ + ~!:OWNER~!\ + \ +
    \ +
    ~!:DATE~!
    \ +
    \ +
    \ +
    \ +
    \ + ~!:DB~!\ +
    \ +
    \ + \ +
    \ + backup\ + \ +
    \ +
    \ +
    \ + ~!:U_DISK~! Mb\ +
    \ + \ +
    \ +
    \ +
    ~!:DISK~! ~!:DISK_MEASURE~!
    \ +
    \ +
    \ +
    \ +
    \ +
    '] + }, + cron: { + FORM: ['
    \ + \ + \ +
    ~!:title~!
    \ + \ +
    \ + Schedule Time:\ +
    \ + \ +
    \ + \ +
    \ +
    \ +
    \ + \ +
    \ + \ +
    \ +
    \ +
    \ + \ +
    \ + \ +
    \ +
    \ +
    \ + \ +
    \ + \ +
    \ +
    \ +
    \ + \ +
    \ + \ +
    \ +
    \ +
    \ +
    \ + \ + \ +
    \ + \ +
    \ + \ + \ +
    \ +
    \ + \ + Cancel\ + Delete\ +
    \ +
    '], + ENTRIES_WRAPPER: ['
    ~!:content~!
    '], + ENTRY: ['
    \ + \ + \ +
    \ +
    \ +
    \ + ~!:SUSPENDED_TPL~!\ +
    \ +
    \ +
    \ +
    ~!:DATE~!
    \ +
    \ +
    \ +
    \ + \ + min\ + ~!:MIN~!\ + \ + \ + hour\ + ~!:HOUR~!\ + \ + \ + day of Month\ + ~!:DAY~!\ + \ + \ + Month\ + ~!:MONTH~!\ + \ + \ + day of Week\ + ~!:WDAY~!\ + \ +
    \ +
    \ + ~!:CMD~!\ +
    \ + \ +
    \ +
    '] + }, + backup: { + WRAPPER: ['
    ~!:CONTENT~!
    '], + ENTRY: ['
    \ + \ +
    \ +
    \ +
    \ + \ + owner:\ + ~!:OWNER~!\ + \ +
    \ +
    \ +
    \ +
    \ + \ + \ + ~!:CREATED_AT~!\ + ~!:CREATED_AT_TIME~!\ + \ + ~!:CREATED_AT_WDAY~!\ + \ + \ + Generation time:\ + ~!:GENERATION_TIME~!\ + \ +
    \ +
    \ + \ + ~!:SIZE~!\ + \ + download\ +
    \ + \ +
    \ +
    '] + }, + stats: { + WRAPPER: ['
    ~!:CONTENT~!
    '], + ENTRY: ['
    \ +

    ~!:HEADER~!

    \ +
    \ + \ +
    \ +
    '], + SUBMENU: ['today\ + week\ + month\ + year
    '] + } +} + + +// Internals +var Tpl = App.Templates; +var Templator = function() +{ + var init = function() { + fb.info('Templator work'); + Templator.splitThemAll(); + Templator.freezeTplIndexes(); + }; + + /** + * Split the tpl strings into arrays + */ + Templator.splitThemAll = function() + { + fb.info('splitting tpls'); + $.each(App.Templates.html, function(o) { + var tpls = App.Templates.html[o]; + $.each(tpls, function(t) { + tpls[t] = tpls[t][0].split('~!'); + }); + }); + }, + + /** + * Iterates tpls + */ + Templator.freezeTplIndexes = function() + { + fb.info('freezing tpl keys'); + $.each(App.Templates.html, Templator.cacheTplIndexes); + }, + + /** + * Grab the tpl group key and process it + */ + Templator.cacheTplIndexes = function(key) + { + var tpls = App.Templates.html[key]; + $.each(tpls, function(o) { + var tpl = tpls[o]; + Templator.catchIndex(key, o, tpl); + }); + }, + + /** + * Set the indexes + */ + Templator.catchIndex = function(key, ref_key, tpl) + { + 'undefined' == typeof App.Templates._indexes[key] ? App.Templates._indexes[key] = {} : false; + 'undefined' == typeof App.Templates._indexes[key][ref_key] ? App.Templates._indexes[key][ref_key] = {} : false; + $(tpl).each(function(index, o) { + if(':' == o.charAt(0)){ + App.Templates._indexes[key][ref_key][o.toString()] = index; + } + }); + } + + /** + * Get concrete templates + */ + init(); + return Templator; +}; +Templator.getTemplate = function(ns, key) +{ + return [ + App.Templates._indexes[ns][key], + App.Templates.html[ns][key].slice(0) + ]; +} +// init templator +Tpl.Templator = Templator(); +Tpl.get = function(key, group) +{ + return Tpl.Templator.getTemplate(group, key); +} diff --git a/web/vesta/api/DB.class.php b/web/vesta/api/DB.class.php index 9c7967f17..142c44b26 100644 --- a/web/vesta/api/DB.class.php +++ b/web/vesta/api/DB.class.php @@ -38,8 +38,7 @@ class DB extends AjaxHandler 'TYPE' => $record['TYPE'], 'U_DISK' => $record['U_DISK'], 'DISK' => 2024, - 'ENCODING' => "utf-8",//$record['ENCODING'], - // 'ENCODING' => $record['ENCODING'], + 'CHARSET' => strtolower($record['CHARSET']), 'SUSPEND' => $record['SUSPEND'], 'DATE' => date(Config::get('ui_date_format', strtotime($record['DATE']))) ); @@ -68,8 +67,8 @@ class DB extends AjaxHandler 'DB_USER' => $_s['USER'], 'DB_PASSWORD' => $_s['PASSWORD'], 'TYPE' => $_s['TYPE'], - 'HOST' => '' - // 'ENCODING' => $_s['ENCODING'] + 'HOST' => $_s['HOST'], + 'CHARSET' => $_s['CHARSET'] ); $result = Vesta::execute(Vesta::V_ADD_DB_BASE, $params); diff --git a/web/vesta/api/DNS.class.php b/web/vesta/api/DNS.class.php index f8f205cc9..85bf3d548 100644 --- a/web/vesta/api/DNS.class.php +++ b/web/vesta/api/DNS.class.php @@ -102,7 +102,7 @@ class DNS extends AjaxHandler 'TPL' => $_s['TPL'], 'EXP' => $_s['EXP'], 'SOA' => $_s['SOA'], - 'TTL' => $_s['TTL'], + 'TTL' => $_s['TTL'] ); $result = Vesta::execute(Vesta::V_ADD_DNS_DOMAIN, $params); diff --git a/web/vesta/api/MAIN.class.php b/web/vesta/api/MAIN.class.php index f069c1d15..aafb25b31 100644 --- a/web/vesta/api/MAIN.class.php +++ b/web/vesta/api/MAIN.class.php @@ -370,13 +370,14 @@ MAIL; public function getDbParams($data = array()) { $db_types = $this->getDBTypes(); + $db_hosts = $this->getDBHosts(); + $result = Vesta::execute(Vesta::V_LIST_DNS_TEMPLATES, null, self::JSON); return array( - 'TYPE' => $db_types, - 'HOST' => array('vestacp.com' => 'vestacp.com', 'askcow.org' => 'askcow.org'), - 'ENCODING' => array( - - 'utf8' => 'utf8', 'latin1' => 'latin1', 'cp1251' => 'cp1251', - + 'TYPE' => $db_types, + 'HOST' => $db_hosts, + 'CHARSET' => array( + 'utf8' => 'utf8', 'latin1' => 'latin1', 'cp1251' => 'cp1251' +/* '' => '', 'big5' => 'Big5 — Traditional Chinese ', @@ -415,13 +416,30 @@ MAIL; 'geostd8' => 'geostd8 — GEOSTD8 Georgian', 'cp932' => 'cp932 — SJIS for Windows Japanese', 'eucjpms' => 'eucjpms — UJIS for Windows Japanese' +*/ ) ); } public function getDBTypes() { - return array('mysql' => 'mysql', 'postgre' => 'postgre'); + return array('mysql' => 'MySQL', 'pgsql' => 'PostgreSQL'); + } + + public function getDBHosts() + { + + return array('localhost' => 'localhost'); + foreach($this->getDBTypes() as $type => $type_name){ + $result = Vesta::execute(Vesta::V_LIST_DB_HOSTS, $type, self::JSON); + foreach ($result['data'] as $host_name => $host_data) { + if (Utils::getCheckboxBooleanValue($host_data['ACTIVE'])) { + $hosts[$host_name] = $type_name .' – '. $host_name; + } + } + } + + return $hosts; } /** diff --git a/web/vesta/api/USER.class.php b/web/vesta/api/USER.class.php index 5b101bfb7..bd5529ffd 100644 --- a/web/vesta/api/USER.class.php +++ b/web/vesta/api/USER.class.php @@ -51,6 +51,7 @@ class USER extends AjaxHandler "SUSPEND" => $details['SUSPENDED'], "CONTACT" => $details['CONTACT'], "REPORTS" => $details['REPORTS'], + "REPORTS_ENABLED" => $details['REPORTS'], "IP_OWNED" => $details['IP_OWNED'], "U_DIR_DISK" => $details['U_DIR_DISK'], "U_DISK" => $details['U_DISK'], @@ -132,33 +133,42 @@ class USER extends AjaxHandler */ public function addExecute(Request $request) { - $spell = $request->getParameter('spell'); + $_s = $request->getParameter('spell'); $user = $this->getLoggedUser(); $params = array( - 'USER' => $spell['LOGIN_NAME'], - 'PASSWORD' => $spell['PASSWORD'], - 'EMAIL' => $spell['CONTACT'], - 'PACKAGE' => $spell['PACKAGE'], - 'FNAME' => $spell['FNAME'], - 'LNAME' => $spell['LNAME'] + 'USER' => $_s['LOGIN_NAME'], + 'PASSWORD' => $_s['PASSWORD'], + 'EMAIL' => $_s['CONTACT'], + 'PACKAGE' => $_s['PACKAGE'], + 'FNAME' => $_s['FNAME'], + 'LNAME' => $_s['LNAME'] ); $result = Vesta::execute(Vesta::V_ADD_SYS_USER, $params); // Reports - $enable_reports = Utils::getCheckboxBooleanValue($spell['REPORTS_ENABLED']); - $reports_result = $this->setUserReports($spell['LOGIN_NAME'], $spell['REPORTS_ENABLED']); + // $enable_reports = Utils::getCheckboxBooleanValue($spell['REPORTS_ENABLED']); + // $reports_result = $this->setUserReports($spell['LOGIN_NAME'], $spell['REPORTS_ENABLED']); // Set SHELL - $this->setShell($spell['LOGIN_NAME'], $spell['SHELL']); + // $this->setShell($_s['LOGIN_NAME'], $_s['SHELL']); if (!$result['status']) { $this->errors[] = array($result['error_code'] => $result['error_message']); } + if(@Utils::getCheckboxBooleanValue($_s['REPORTS_ENABLED'])){ + $result = Vesta::execute(Vesta::V_ADD_SYS_USER_REPORTS, array('USER' => $_USER)); + if (!$result['status']) { + $this->status = FALSE; + $this->errors['REPORTS'] = array($result['error_code'] => $result['error_message']); + } + } + + if ($_s['SUSPEND'] == 'on') { if($result['status']){ $result = array(); - $result = Vesta::execute(Vesta::V_SUSPEND_SYS_USER, array('USER' => $user['uid'], 'USER' => $spell['LOGIN_NAME'])); + $result = Vesta::execute(Vesta::V_SUSPEND_SYS_USER, array('USER' => $user['uid'], 'USER' => $_s['LOGIN_NAME'])); if (!$result['status']) { $this->status = FALSE; $this->errors['SUSPEND'] = array($result['error_code'] => $result['error_message']); @@ -249,6 +259,20 @@ class USER extends AjaxHandler } } + if ($_old['REPORTS_ENABLED'] != $_new['REPORTS_ENABLED']) { + $result = array(); + if(@Utils::getCheckboxBooleanValue($_new['REPORTS_ENABLED'])){ + $result = Vesta::execute(Vesta::V_ADD_SYS_USER_REPORTS, array('USER' => $_USER)); + } + else{ + $result = Vesta::execute(Vesta::V_ADD_SYS_USER_REPORTS, array('USER' => $_USER)); + } + if (!$result['status']) { + $this->status = FALSE; + $this->errors['REPORTS'] = array($result['error_code'] => $result['error_message']); + } + } + // Set SHELL $this->setShell($_USER, $_new['SHELL']); diff --git a/web/vesta/core/Vesta.class.php b/web/vesta/core/Vesta.class.php index 6e4f19580..b5402c1d9 100644 --- a/web/vesta/core/Vesta.class.php +++ b/web/vesta/core/Vesta.class.php @@ -29,6 +29,7 @@ class Vesta const V_LIST_SYS_USER = 'v_list_user'; const V_LIST_USER_PACKAGES = 'v_list_user_packages'; const V_ADD_SYS_USER = 'v_add_user'; + const V_ADD_SYS_USER_REPORTS = 'v_add_user_reports'; const V_CHANGE_SYS_USER_CONTACT = 'v_change_user_contact'; const V_CHANGE_SYS_USER_NS = 'v_change_user_ns'; const V_CHANGE_SYS_USER_PACKAGE = 'v_change_user_package'; @@ -39,6 +40,7 @@ class Vesta const V_SUSPEND_SYS_USER = 'v_suspend_user'; const V_UNSUSPEND_SYS_USER = 'v_unsuspend_user'; const V_DEL_SYS_USER = 'v_delete_user'; + const V_DEL_SYS_USER_REPORTS = 'v_delete_user_reports'; // WEB_DOMAIN const V_LIST_WEB_DOMAINS = 'v_list_web_domains'; const V_LIST_WEB_DOMAINS_ALIAS = 'v_list_web_domains_alias'; @@ -122,14 +124,14 @@ class Vesta // CRON const V_LIST_CRON_JOBS = 'v_list_cron_jobs'; const V_ADD_CRON_JOB = 'v_add_cron_job'; - const V_ADD_SYS_USER_REPORTS = 'v_add_user_reports'; + // const V_ADD_SYS_USER_REPORTS = 'v_add_user_reports'; const V_CHANGE_CRON_JOB = 'v_change_cron_job'; const V_SUSPEND_CRON_JOB = 'v_suspend_cron_job'; const V_SUSPEND_CRON_JOBS = 'v_suspend_cron_jobs'; const V_UNSUSPEND_CRON_JOB = 'v_unsuspend_cron_job'; const V_UNSUSPEND_CRON_JOBS = 'v_unsuspend_cron_jobs'; const V_DEL_CRON_JOB = 'v_delete_cron_job'; - const V_DEL_SYS_USER_REPORTS = 'v_delete_user_reports'; + // const V_DEL_SYS_USER_REPORTS = 'v_delete_user_reports'; // STATS const V_LIST_SYS_RRD = 'v_list_sys_rrd json'; const V_UPDATE_SYS_RRD = 'v_update_sys_rrd'; diff --git a/web/vesta/core/VestaSession.class.php b/web/vesta/core/VestaSession.class.php index 9c49fd482..91efd436c 100644 --- a/web/vesta/core/VestaSession.class.php +++ b/web/vesta/core/VestaSession.class.php @@ -76,20 +76,20 @@ class VestaSession public function loginAs($login) { - // TODO checkrights for login as - // if(Vesta::hasRights(self::getUserRole();, 'login_as')){ - - if(!$_SESSION['real_user']) - $_SESSION['real_user'] = $_SESSION['user']; + // TODO checkrights for login as + if(Vesta::hasRights(self::getUserRole(), 'login_as')){ + if(!$_SESSION['real_user']){ + $_SESSION['real_user'] = $_SESSION['user']; + } + } - $_SESSION['user'] = $login; - - // } + $_SESSION['user'] = $login; } public function logoutAs() { $_SESSION['user'] = $_SESSION['real_user']; + $_SESSION['real_user'] = false; } } ?> diff --git a/web/vesta/upload.php b/web/vesta/upload.php index ecbd148ee..e573b2bd9 100644 --- a/web/vesta/upload.php +++ b/web/vesta/upload.php @@ -18,7 +18,7 @@ switch ($_GET['action']) { handleUpload(); } else { - show_form(); + show_form(); } break; } @@ -59,8 +59,8 @@ function handleUpload() function show_form() { $type = $_GET['type']; - if (!in_array($type, array('key', 'cert'))) { - exit; + if (!in_array($type, array('key', 'cert', 'ca'))) { + exit; } print << \ No newline at end of file +?>