/* globals LANG, FTP_ACCOUNTS_MAXED, REQUIRED_PASSWORD_STRENGTH, DNS, SERVER_TYPE, CPANEL_USER */
/* globals FTP_SERVER, SFTP_PORT, FTP_PORT */
// UAPI: note that this module has been converted to the UAPI JSON call
/* eslint-disable camelcase */
var OPEN_MODULE;
var PATH_POPUPS = [];
var ADD_VALID = [];
var CHANGE_PASS_VALID = [];
var CHANGE_QUOTA_VALID = [];
var FTP_UAPI_CALL = {};
var TABLE_REQUEST_ACTIVE = false;
var LAST_SEARCH_TXT = "";
var PURE_ACCOUNTS_TABLE_COLUMNS = 4;
var PURE_SPECIAL_ACCOUNTS_TABLE_COLUMNS = 5;
var PRO_ACCOUNTS_TABLE_COLUMNS = 3;
var PRO_SPECIAL_ACCOUNTS_TABLE_COLUMNS = 4;
var FTP_CLIENTS = [
{
id: "coreftp",
name: "CoreFTP",
os: "Windows"
}, {
id: "cyberduck",
name: "Cyberduck",
os: "Mac"
}
];
var changePasswordTpl = Handlebars.compile(DOM.get("change-password-template").text.trim()),
changeQuotaTpl = Handlebars.compile(DOM.get("change-quota-template").text.trim()),
deleteAccountTpl = Handlebars.compile(DOM.get("delete-account-template").text.trim()),
configureClientTpl = Handlebars.compile(DOM.get("configure-client-template").text.trim());
// NOTE: This is needed because IE9 and below do not support
// innerHTML on table, tbody, thead, and tr elements.
// This should be removed when we end support for IE9.
var tbody_placeholder = document.createElement("div");
var requiresInnerHTMLFix;
var tableInnerHTMLTestElement = document.createElement("table");
try {
tableInnerHTMLTestElement.innerHTML = "
";
} catch (e) {
} finally {
requiresInnerHTMLFix = (tableInnerHTMLTestElement.childNodes.length === 0);
}
var insert_html_into_table = function(table_id, html) {
// NOTE: The first block should be removed once we end support for IE9.
var tbody = document.getElementById(table_id);
if (requiresInnerHTMLFix) {
var table = tbody.parentNode;
tbody_placeholder.innerHTML = "
" + html + "
";
table.replaceChild(tbody_placeholder.firstChild.firstChild, table.tBodies[0]);
} else {
tbody.innerHTML = html;
}
};
var generate_table_message = function(table_id, type, message, number_of_cols) {
var html = "
" +
"
" + message + "
" +
"
";
insert_html_into_table(table_id, html);
};
var init_add_validation = function() {
var DOM = YAHOO.util.Dom;
var domain_el = DOM.get("domain");
ADD_VALID["login"] = new CPANEL.validate.validator(LANG.ftp_login);
ADD_VALID["login"].add("login", "min_length(%input%, 1)", LOCALE.maketext("You must enter an [output,acronym,FTP,File Transfer Protocol] username."), null, { unique_id: "username_min_length" });
ADD_VALID["login"].add("login", "max_length(%input%, 64)", LOCALE.maketext("The [output,acronym,FTP,File Transfer Protocol] username cannot exceed [numf,_1] characters.", 64), null, { unique_id: "username_max_length" });
ADD_VALID["login"].add("login", function(login_el) {
var username = login_el.value + "@" + domain_el.value;
return CPANEL.validate.max_length(username, 254);
},
LOCALE.maketext("The full [output,acronym,FTP,File Transfer Protocol] username with its associated domain cannot exceed [numf,_1] characters.", 254),
null,
{ unique_id: "username_full_length" }
);
ADD_VALID["login"].add("login", "ftp_username", LOCALE.maketext("You can only enter letters [asis,(a-z)], numbers [asis,(0-9)], periods, hyphens [asis,(-)], and underscores [asis,(_)]."), null, { unique_id: "username_valid" });
ADD_VALID["login"].add("login", "no_unsafe_periods", LOCALE.maketext("The [output,acronym,FTP,File Transfer Protocol] username cannot start with a period, end with a period, or include two consecutive periods."), null, { unique_id: "username_safe_periods" });
ADD_VALID["login"].attach();
ADD_VALID["domain"] = new CPANEL.validate.validator(LANG.ftp_domain);
ADD_VALID["domain"].add("domain", function() {
ADD_VALID["login"].clear_messages();
ADD_VALID["login"].verify(); // Will show up in the local parts validator
return true; // So this always passes
}, ""
);
ADD_VALID["domain"].attach();
var password_validators = CPANEL.password.setup("password", "password2", "password_strength", REQUIRED_PASSWORD_STRENGTH, "create_strong_password", "why_strong_passwords_link", "why_strong_passwords_text");
ADD_VALID["pass1"] = password_validators[0];
ADD_VALID["pass2"] = password_validators[1];
ADD_VALID["dir"] = new CPANEL.validate.validator(LANG.directory_path);
ADD_VALID["dir"].add("homedir", "dir_path", LANG.validation_directory_paths);
ADD_VALID["dir"].attach();
if (SERVER_TYPE !== "PRO") {
ADD_VALID["quota_number"] = new CPANEL.validate.validator(LANG.quota);
ADD_VALID["quota_number"].add("quota_value", "positive_integer", LANG.email_quota_number, "quota_number");
ADD_VALID["quota_number"].attach();
ADD_VALID["quota_unlimited"] = new CPANEL.validate.validator(LANG.quota);
ADD_VALID["quota_unlimited"].add("quota_unlimited", "anything", "", "quota_unlimited");
ADD_VALID["quota_unlimited"].attach();
}
CPANEL.validate.attach_to_form("ftp_create_submit", ADD_VALID, add_ftp_account);
CPANEL.util.catch_enter(["login", "domain", "password", "password2", "homedir", "quota_value"], "ftp_create_submit");
try {
DOM.get("login").focus();
} catch (e) {
}
};
var suggest_homedir = function(public_html_only) {
if ( public_html_only != 0 ) {
DOM.get("homedir").value = "public_html/" + DOM.get("domain").value + "/" + DOM.get("login").value;
} else {
DOM.get("homedir").value = DOM.get("domain").value + "/" + DOM.get("login").value;
}
ADD_VALID["dir"].verify();
};
var toggle_add_account_quota = function(select_number) {
if (select_number == true) {
YAHOO.util.Dom.get("quota_number").checked = true;
}
if (YAHOO.util.Dom.get("quota_number").checked == true) {
YAHOO.util.Dom.removeClass("quota_value", "dim-text");
ADD_VALID["quota_number"].verify();
ADD_VALID["quota_unlimited"].clear_messages();
} else {
YAHOO.util.Dom.addClass("quota_value", "dim-text");
ADD_VALID["quota_number"].clear_messages();
ADD_VALID["quota_unlimited"].verify();
}
};
var load_accounts_table = function() {
var columns = (SERVER_TYPE === "PURE") ? PURE_ACCOUNTS_TABLE_COLUMNS : PRO_ACCOUNTS_TABLE_COLUMNS;
var callback = {
success: function(o) {
var result = {};
try {
result = YAHOO.lang.JSON.parse(o.responseText);
} catch (e) {
generate_table_message("accounts_div", "danger", CPANEL.icons.error + " " + LOCALE.maketext("JSON parse failed."), columns);
}
if (result.status) {
build_accounts_table(result);
} else {
generate_table_message("accounts_div", "danger", CPANEL.icons.error + " " + LOCALE.maketext("Unknown Error"), columns);
}
TABLE_REQUEST_ACTIVE = false;
},
failure: function(o) {
generate_table_message("accounts_div", "danger", CPANEL.icons.error + " " + LOCALE.maketext("AJAX Error") + ": " + LOCALE.maketext("Please refresh the page and try again."), columns);
TABLE_REQUEST_ACTIVE = false;
}
};
// send the AJAX request
TABLE_REQUEST_ACTIVE = true;
var url = CPANEL.urls.uapi("Ftp", "list_ftp_with_disk", FTP_UAPI_CALL);
YAHOO.util.Connect.asyncRequest("GET", url, callback, "");
close_all_path_popups();
generate_table_message("accounts_div", "info", CPANEL.icons.ajax + " " + LOCALE.maketext("Loading …"), columns);
};
var load_special_accounts_table = function() {
var columns = (SERVER_TYPE === "PURE") ? PURE_SPECIAL_ACCOUNTS_TABLE_COLUMNS : PRO_SPECIAL_ACCOUNTS_TABLE_COLUMNS;
// build the call
var args = {
"include_acct_types": "anonymous|logaccess|main",
"api.sort_column": "serverlogin",
"api.sort_method": "alphabet",
"api.sort_reverse": 0
};
var callback = {
success: function(o) {
try {
var result = YAHOO.lang.JSON.parse(o.responseText);
if (result.status) {
build_special_accounts_table(result);
} else {
generate_table_message("special_accounts_div", "danger", CPANEL.icons.error + " " + LOCALE.maketext("Unknown Error"), columns);
}
} catch (e) {
generate_table_message("special_accounts_div", "danger", CPANEL.icons.error + " " + LOCALE.maketext("JSON parse failed."), columns);
}
},
failure: function(o) {
generate_table_message("special_accounts_div", "danger", CPANEL.icons.error + " " + LOCALE.maketext("AJAX Error") + ": " + LOCALE.maketext("Please refresh the page and try again."), columns);
}
};
// send the AJAX request
var url = CPANEL.urls.uapi("Ftp", "list_ftp_with_disk", args);
YAHOO.util.Connect.asyncRequest("GET", url, callback, "");
generate_table_message("special_accounts_div", "info", CPANEL.icons.ajax + " " + LOCALE.maketext("Loading …"), columns);
};
var build_accounts_table = function(result) {
var html = "";
var row = "";
var i = 0;
var columns = (SERVER_TYPE === "PURE") ? PURE_ACCOUNTS_TABLE_COLUMNS : PRO_ACCOUNTS_TABLE_COLUMNS;
var accounts = result.data;
var accounts_length = accounts.length;
if (accounts_length === 0) {
generate_table_message("accounts_div", "info", LANG.no_accounts_found, columns);
return;
}
for (i = 0; i < accounts_length; i++) {
var zebra = (i % 2) ? "row-even" : "row-odd";
// convert humandiskquota to MB or infinity symbol
/* jshint -W116*/
if (accounts[i].diskquota == 0 || accounts[i].diskquota == "unlimited") {
/* jshint +W116*/
accounts[i].diskquota = 0;
accounts[i].humandiskquota = "∞";
} else {
// convert disk quota to integer
accounts[i].diskquota = parseInt(accounts[i].diskquota, 10);
accounts[i].humandiskquota = accounts[i].diskquota;
}
// convert usage to integer
accounts[i].diskused = parseInt(accounts[i].diskused, 10);
var login = accounts[i].login,
urlLogin = encodeURIComponent(login),
dns = encodeURIComponent(DNS),
tplArgs = {
index: i,
login: login,
home: accounts[i].dir
},
configureClientArgs = {
index: i,
login: accounts[i].serverlogin,
server: FTP_SERVER,
port: FTP_PORT,
token: CPANEL.security_token,
urlLogin: urlLogin,
dns: dns,
clients: FTP_CLIENTS,
params: urlLogin + "|ftp." + dns + "|" + urlLogin
};
if (SERVER_TYPE === "PURE") {
row = '
";
}
// TODO: replace this using YAHOO.lang.substitute
row = row.replace(/\[% i %\]/g, i);
row = row.replace(/\[% login %\]/g, accounts[i].login);
row = row.replace(/\[% serverlogin %\]/g, accounts[i].serverlogin);
row = row.replace(/\[% path %\]/g, format_path(accounts[i].dir));
row = row.replace(/\[% special_path %\]/g, format_path(accounts[i].dir, "delete_account2_" + i, i));
row = row.replace(/\[% diskused %\]/g, accounts[i].diskused);
row = row.replace(/\[% humandiskquota %\]/g, accounts[i].humandiskquota);
row = row.replace(/\[% diskquota %\]/g, accounts[i].diskquota);
row = row.replace(/\[% url.acct %\]/g, encodeURIComponent(accounts[i].login));
row = row.replace(/\[% url.accttype %\]/g, encodeURIComponent(accounts[i].accttype));
row = row.replace(/\[% ftp_port %\]/g, FTP_PORT);
row = row.replace(/\[% sftp_port %\]/g, SFTP_PORT);
row = row.replace(/\[% ftp_server %\]/g, FTP_SERVER);
row = row.replace(/\[% url.dns %\]/g, encodeURIComponent(DNS));
html += row;
}
insert_html_into_table("accounts_div", html);
YAHOO.util.Dom.get("pagination").innerHTML = add_pagination(result.metadata.paginate);
if (SERVER_TYPE === "PURE") {
for (i = 0; i < accounts_length; i++) {
show_usage_bar("usage_bar_" + i, accounts[i].diskused, accounts[i].diskquota);
}
}
};
var add_pagination = function(paginate) {
// turn pagination data into integers just in case
for (var i in paginate) {
if (paginate.hasOwnProperty(i)) {
paginate[i] = parseInt(paginate[i]);
}
}
// do not paginate if there is only one page
if (paginate.total_pages == 1) {
return "";
}
var ellipsis1 = 0;
var ellipsis2 = 0;
var html = '
';
for (var i = 1; i <= paginate.total_pages; i++) {
// bold the current page
if (i == paginate.current_page) {
html += ' ' + i + " ";
} else if (i == 1 || i == paginate.total_pages) { // always show page 1 and the last page
html += ' ' + i + " ";
} else if (i < paginate.current_page - 2) { // show ellipsis for any pages less than 3 away
if (ellipsis1 == 0) {
html += "...";
ellipsis1 = 1;
}
} else if (i > paginate.current_page + 2) { // show ellipsis for any pages more than 3 away
if (ellipsis2 == 0) {
html += "...";
ellipsis2 = 1;
}
} else {
html += ' ' + i + " ";
}
}
html += "
";
html += '
';
if (paginate.current_page != 1) {
var prev_page = paginate.current_page - 1;
html += '← ' + LANG.paginate_prev + " ";
}
if (paginate.current_page != paginate.total_pages) {
var next_page = paginate.current_page + 1;
html += ' ' + LANG.paginate_next + " →";
}
html += "
";
return html;
};
var build_special_accounts_table = function(result) {
var special_panels1 = [];
var special_panels2 = [];
YAHOO.util.Dom.get("list_of_anonymous_account_ids").value = "";
var html = "";
var row = "";
var i = 0;
var columns = (SERVER_TYPE === "PURE") ? PURE_SPECIAL_ACCOUNTS_TABLE_COLUMNS : PRO_SPECIAL_ACCOUNTS_TABLE_COLUMNS;
var accounts = result.data;
for (i = 0; i < accounts.length; i++) {
var zebra = (i % 2) ? "row-even" : "row-odd";
// convert humandiskquota to MB or infinity symbol
/* jshint -W116 */
if (accounts[i].diskquota == 0 || accounts[i].diskquota == "unlimited") {
/* jshint +W116 */
accounts[i].diskquota = 0;
accounts[i].humandiskquota = "∞";
} else {
// convert disk quota to integer
accounts[i].diskquota = parseInt(accounts[i].diskquota, 10);
accounts[i].humandiskquota = accounts[i].diskquota;
}
// convert usage to integer
accounts[i].diskused = parseInt(accounts[i].diskused, 10);
var is_system_account = (accounts[i].serverlogin === CPANEL_USER);
var special_main_description = YAHOO.util.Dom.get("special_main_description").innerHTML.trim();
var special_anon_description = YAHOO.util.Dom.get("special_anon_description").innerHTML.trim();
var special_log_description = YAHOO.util.Dom.get("special_log_description").innerHTML.trim();
var login = accounts[i].login,
urlLogin = encodeURIComponent(login),
dns = encodeURIComponent(DNS),
tplArgs = {
index: "special" + i,
isSpecial: true,
login: login
},
configureClientArgs = {
isSystem: accounts[i].accttype === "main",
index: "special" + i,
login: accounts[i].serverlogin,
server: FTP_SERVER,
port: FTP_PORT,
token: CPANEL.security_token,
urlLogin: urlLogin,
dns: dns,
clients: FTP_CLIENTS,
params: urlLogin + "|ftp." + dns + "|" + urlLogin
};
if (SERVER_TYPE === "PURE") {
row = '
';
if (accounts[i].accttype === "main") {
row += '
';
}
if (accounts[i].accttype === "anonymous") {
row += '
';
YAHOO.util.Dom.get("list_of_anonymous_account_ids").value += "special" + i + "|";
}
if (accounts[i].accttype === "logaccess") {
row += '