Viewing File: /usr/local/cpanel/whostmgr/docroot/templates/listaccts.tmpl
[%-
# Column headers and searchtype "friendly names"
SET column_headers = {
'suspended' => locale.maketext('Suspended'),
'domain' => locale.maketext('Domain'),
'ip' => locale.maketext('IP Address'),
'user' => locale.maketext('Username'),
'email' => locale.maketext('Contact Email'),
'startdate' => locale.maketext('Setup Date'),
'partition' => locale.maketext('Partition'),
'limit' => locale.maketext('Quota'),
'used' => locale.maketext('Disk Used'),
'plan' => locale.maketext('Package'),
'package' => locale.maketext('Package'),
'theme' => locale.maketext('Theme'),
'owner' => locale.maketext('Reseller/Owner'),
'domain_and_user' => locale.maketext('Username or Domain'),
'upgrade_opportunities' => locale.maketext('Upgrade Opportunities'),
};
SET column_order = ['ip','user','email','startdate','partition','limit','used','plan','theme','owner','suspended'];
IF data.display_upgrade_opportunities;
column_order.push('upgrade_opportunities');
END;
SET filter_friendly_name = {
'suspended' => locale.maketext('Suspended'),
'upgrade_opportunity' => locale.maketext("Upgrade[output,nbsp]Opportunity"),
};
SET upgrade_opportunity_filter_title = {
'bw_limit' => locale.maketext('Filter by bandwidth limit opportunity met.'),
'disk_usage' => locale.maketext('Filter by disk usage opportunity met.'),
};
SET upgrade_opportunity_icon = {
'bw_limit' => 'fas fa-tachometer-alt',
'disk_usage' => 'fas fa-chart-pie',
'default' => 'fas fa-chart-line',
};
SET bandwidth_exceeded_text = locale.maketext("Bandwidth Limit Exceeded");
-%]
[%# This configures how many accounts should be displayed before the bottom search box is shown %]
[% BOTTOM_SEARCH_THRESHOLD = 10 %]
[% NUMBER_OF_COLUMNS = column_order.size + 3; # control + domain + cpanel %]
[% MAX_LEADING_PAGES = 5 %]
[% MAX_TRAILING_PAGES = 5 %]
[%
SET headerText = locale.maketext("List Accounts");
SET hasFilter = data.filtertype && data.filtertype != 'none';
IF data.search.length();
headerText = locale.maketext("List accounts where “[_1]” matches “[_2]”.",column_headers.item(data.searchtype),"${data.search}");
IF hasFilter;
headerText = locale.maketext("List accounts where “[_1]” matches “[_2]” and filtered by “[_3]”.",column_headers.item(data.searchtype),"${data.search}",filter_friendly_name.item(data.filtertype));
END;
ELSE;
IF hasFilter;
headerText = locale.maketext("List accounts filtered by “[_1]”.", filter_friendly_name.item(data.filtertype));
END;
END;
-%]
[% MACRO search(data, locale, postfix) BLOCK %]
<div class="[% postfix %]-group group">
<a name="search[% postfix %]"></a>
<div id="search-[% postfix %]">
<form class="form-horizontal" action="../scripts4/listaccts" autocomplete="off">
<div class="form-group">
<label for="searchtxt[% postfix %]" class="col-xs-2 control-label">[% locale.maketext("Search For:") %]</label>
<div class="col-xs-10">
<input id="searchtxt[% postfix %]" type="text" name="search" value="[% data.search.defined ? data.search : '\.net$' %]" />
<input type="submit" class="btn btn-primary" value="[% locale.maketext("Find") %]" />
</div>
</div>
<div class="form-group">
<label for="searchtype" class="col-xs-2 control-label">[% locale.maketext("Search By:") %]</label>
<div class="col-xs-10">
<label class="radio-inline" title="[% locale.maketext("Defaults to searching domain and user name.") %]"><input type="radio" name="searchtype" [% (! data.searchtype || data.searchtype == 'domain_and_user') ? 'checked="checked"' : '' %] value="domain_and_user" /><span>[% locale.maketext("Username/Domain") %]</span></label>
<label class="radio-inline" title="[% locale.maketext("Search by domain name.") %]"><input type="radio" name="searchtype" [% data.searchtype == 'domain' ? 'checked="checked"' : '' %] value="domain" /><span>[% column_headers.domain %]</span></label>
<label class="radio-inline" title="[% locale.maketext("Search by user name.") %]"><input type="radio" name="searchtype" [% data.searchtype == 'user' ? 'checked="checked"' : '' %] value="user" /><span>[% column_headers.user %]</span></label>
<label class="radio-inline" title="[% locale.maketext("Search by owner name.") %]"><input type="radio" name="searchtype" [% data.searchtype == 'owner' ? 'checked="checked"' : '' %] value="owner" /><span>[% column_headers.owner %]</span></label>
<label class="radio-inline" title="[% locale.maketext("Search by assigned package.") %]"><input type="radio" name="searchtype" [% data.searchtype == 'package' ? 'checked="checked"' : '' %] value="package" /><span>[% column_headers.plan %]</span></label>
<label class="radio-inline" title="[% locale.maketext("Search by assigned IP address.") %]"><input type="radio" name="searchtype" [% data.searchtype == 'ip' ? 'checked="checked"' : '' %] value="ip" /><span>[% locale.maketext("IP[output,nbsp]Address") %]</span></label>
</div>
</div>
<div class="form-group">
<label for="filtertype" class="col-xs-2 control-label">[% locale.maketext("Filter By:") %]</label>
<div class="col-xs-10">
<label class="radio-inline" title="[% locale.maketext("No filter.") %]"><input type="radio" name="filtertype" [% (! data.filtertype || data.filtertype == 'none') ? 'checked="checked"' : '' %] value="none" onchange="optionsChange(this)" /><span>[% locale.maketext("None") %]</span></label>
<label class="radio-inline" title="[% locale.maketext("Filter by suspended status.") %]"><input type="radio" name="filtertype" [% data.filtertype == 'suspended' ? 'checked="checked"' : '' %] value="suspended" onchange="optionsChange(this)" /><span>[% filter_friendly_name.suspended %]</span></label>
[% IF data.display_upgrade_opportunities %]
<label class="radio-inline" title="[% locale.maketext("Filter by upgrade opportunity.") %]"><input type="radio" name="filtertype" [% data.filtertype == 'upgrade_opportunity' ? 'checked="checked"' : '' %] value="upgrade_opportunity" onchange="optionsChange(this)" id="upgrade_opportunity_input_[% postfix %]" /><span>[% filter_friendly_name.upgrade_opportunity %]</span></label>
[% END %]
</div>
</div>
[% IF data.display_upgrade_opportunities %]
<div class="form-group[% data.filtertype == 'upgrade_opportunity' ? '' : ' hidden' %]" id="upgrade_opportunity_input_[% postfix %]_options">
<div class="col-xs-10 col-xs-offset-2">
[%- FOREACH opportunity IN settings.upgrade_opportunities_name.opportunity.keys.sort %]
<label class="checkbox-inline" title="[% upgrade_opportunity_filter_title.$opportunity %]">
<input type="checkbox" name="filteropt" [% ( !data.filteropt.size || data.filteropt.$opportunity ) ? 'checked="checked"' : '' %] value="[% opportunity %]" />
<i class="[% upgrade_opportunity_icon.$opportunity || upgrade_opportunity_icon.default %]" aria-hidden="true"></i>
<span>[% settings.upgrade_opportunities_name.opportunity.$opportunity.html %]</span>
</label>
[% END %]
</div>
</div>
[% END %]
<div class="form-group">
<div class="col-xs-10 col-xs-offset-2">
<button type="submit" class="btn btn-primary">[% locale.maketext("Apply Filter") %]</button>
</div>
</div>
[% IF settings.has_search_filter_sort %]
<div class="form-group">
<div class="col-xs-10 col-xs-offset-2">
<input type="button" onclick="window.location.href='listaccts';" value="[% locale.maketext("Reset") %]" class="btn btn-default">
</div>
</div>
[% END %]
<input type="hidden" name="acctp" value="[% data.acctsperpage %]" />
</form>
</div>
</div>
[% END %]
[% USE CPDate -%]
[% USE Encoder -%]
[% USE Whostmgr -%]
[% USE VarCache -%]
[% WRAPPER 'master_templates/master.tmpl'
app_key = 'list_accounts'
theme = 'bootstrap'
include_legacy_stylesheets = 1
header = headerText
stylesheets = [
'/yui/datatable/assets/skins/sam/datatable.css',
'/templates/accounts/listaccts.min.css'
]
-%]
[%-
SET display_license_excess_warning = !varcache.dnsonly && Whostmgr.server_exceeds_max_users();
SET child_workload_accts = {};
FOREACH acct IN data.child_workload_accts;
child_workload_accts.$acct => 1;
END;
varcache.set('change_image', MagicRevision('/change.gif'));
varcache.set('close_image', MagicRevision('/cjt/images/close-btn.png'));
varcache.set('error_image', MagicRevision('/cjt/images/icons/error.png'));
varcache.set('warning_image', MagicRevision('/cjt/images/icons/warning.png'));
-%]
[% IF display_license_excess_warning -%]
[% PROCESS 'menu/_license_excess.tmpl' -%]
[% END -%]
[% PROCESS '_ajaxapp_header.tmpl' -%]
[% pagecontrols = BLOCK %]
<div class="pgitem">[% locale.maketext("Page:") %] </div>
[%-
varcache.set(
'query_addition',
"&search=" _ data.search.cpanel_uri_encode_str() _
"&searchtype=" _ data.searchtype.cpanel_uri_encode_str() _
"&filtertype=" _ data.filtertype.cpanel_uri_encode_str() _
"&acctp=" _ data.acctsperpage _
"&sortrev=" _ data.sortrev.cpanel_uri_encode_str() _
"&sortorder=" _ data.sortorder.cpanel_uri_encode_str()
);
FOREACH opt IN data.filteropt.keys.sort;
varcache.set(
'query_addition',
varcache.query_addition _
"&filteropt=" _ opt.cpanel_uri_encode_str()
);
END;
-%]
[% first_leading_page = (((data.page - 1 - MAX_LEADING_PAGES) >= 0) ? (data.page - 1 - MAX_LEADING_PAGES) : 0) %]
[% last_trailing_page = (((data.page - 1 + MAX_TRAILING_PAGES) < data.pagecount - 1) ? (data.page - 1 + MAX_TRAILING_PAGES) : data.pagecount - 1) %]
[% IF data.page == 1 || data.page == 'all' %]
<div class="pgsel-disabled pgaction">
<span>[% locale.maketext("First") %]</span>
</div>
[% ELSE %]
<div class="pgsel pgaction">
<a href="listaccts?skip=1[% varcache.query_addition %]">[% locale.maketext("First") %]</a>
</div>
[% END %]
[% FOR pg IN data.pagelist %]
[% IF (loop.index >= first_leading_page) && (loop.index <= last_trailing_page) || (loop.index == 0) || (loop.index == (data.pagecount - 1)) %]
[% IF data.page == 'all'%]
<div class="pgsel-disabled pgaction">
<span>[% pg.pagenum %]</span>
</div>
[% ELSE %]
<div class="[% IF pg.selected %]pgselected[% END %] pgsel">
<a href="listaccts?skip=[% pg.pagenum %][% varcache.query_addition %]">[% pg.pagenum %]</a>
</div>
[% END%]
[% ELSIF (loop.index == first_leading_page - 1) || (loop.index == last_trailing_page + 1) %]
<div class="pgelipse">
<span>…</span>
</div>
[% ELSE %]
[% NEXT %]
[% END %]
[% END %]
[% IF data.page == data.pagecount || data.page == 'all'%]
<div class="pgsel-disabled pgaction">
<span>[% locale.maketext("Last") %]</span>
</div>
[% ELSE %]
<div class="pgsel pgaction">
<a href="listaccts?skip=[% data.pagecount %][% varcache.query_addition %]" title="[% locale.maketext("Navigate to page [numf,_1].", "${data.pagecount}") %]">[% locale.maketext("Last") %]</a>
</div>
[% END %]
[% IF data.page == 'all' %]
<div class="pgsel pgaction">
<a href="listaccts?skip=1[% varcache.query_addition %]" title="[% locale.maketext("View the accounts in sets of [numf,_1].", "${data.acctsperpage}") %]">[% locale.maketext("Paged") %]</a>
</div>
[% END %]
<div class="[% IF data.allselected %]pgselected[% END %] pgsel pgaction" >
<a href="listaccts?viewall=1[% varcache.query_addition %]" title="[% locale.maketext("View all the accounts matching the current filter.") %]">[% locale.maketext("All") %]</a>
</div>
[% IF settings.has_search_filter_sort %]
<div class="pgsel pgaction">
<a href="listaccts?viewall=1&acctp=[%data.acctsperpage%]" title="[% locale.maketext("View all the accounts after removing the current filter.") %]">[% locale.maketext("All (Forget Search [output,amp] Sort)") %]</a>
</div>
[% END %]
<div id="page-size-selector">
<form action="../scripts4/listaccts">
<input type="hidden" name="skip" value="1" />
<input type="hidden" name="search" value="[% data.search %]" />
<input type="hidden" name="searchtype" value="[% data.searchtype %]" />
<input type="hidden" name="filtertype" value="[% data.filtertype %]" />
<input type="hidden" name="sortrev" value="[% data.sortrev %]" />
<input type="hidden" name="sortorder" value="[% data.sortorder %]" />
<label class="de-emphasized-label" title="[% locale.maketext("Accounts displayed per page.") %]" [% IF data.page == 'all' %]class="disabled"[% END %]>[% locale.maketext("Per[output,nbsp]Page:") %]</label>
<input size="4" maxsize="4" type="text" name="acctp" value="[% data.acctsperpage %]" [% IF data.page == 'all' %]disabled="disabled"[% END %] />
</form>
</div>
<div class="pgitem"></div>
[% END %]
<div class="yui-skin-sam">
[%# Build the transfer message %]
[%
SET transferMessage = "";
SET transferPath = "${cp_security_token}/scripts2/tweaksettings?find=account_login_access";
%]
[% IF ! settings.transferheader -%]
[% IF Whostmgr.hasroot() -%]
[% transferMessage = locale.maketext("Root access to users’ cPanel accounts has been disabled in [output,url,_1,Tweak Settings].", transferPath) %]
[%- ELSE -%]
[% transferMessage = locale.maketext("Reseller access to users’ cPanel accounts has been disabled in Tweak Settings.") %]
[%- END %]
[% ELSIF settings.transferheader == 2 && Whostmgr.hasroot() -%]
[% transferMessage = locale.maketext('A grey [asis,cPanel] icon indicates that the server administrator disabled access to users’ [asis,cPanel] accounts in [output,url,_1,_2].', transferPath, locale.maketext('Tweak Settings')) %]
[% ELSIF settings.transferheader == 2 -%]
[% transferMessage = locale.maketext('A grey [asis,cPanel] icon indicates that the server administrator disabled access to users’ [asis,cPanel] accounts.') %]
[%- END %]
[% IF transferMessage %]
<i>[% transferMessage %]</i>
[% END %]
[% SET show_createacct = (acl.all || acl.item("create-acct")) && (!Whostmgr.get_max_users() || Whostmgr.get_users_count() < Whostmgr.get_max_users()) %]
[% IF show_createacct %]
<!-- Quick link to account creation page -->
<p><a href="[% cp_security_token %]/scripts5/wwwacctform" class="btn btn-primary" id="create_account_link_top">[% locale.maketext("Create a New Account") %]</a></p>
[% END %]
<div class="search-and-status">
[% search(data, locale, 'top') %]
<section class="php-eol-status hide" id="phpVersionsListAccountsRow" data-testid="phpVersionsListAccountsRow">
<div class="php-eol-status__card">
<h3 class="php-eol-status__heading">
[% Whostmgr.find_file_and_insert('/icons/php.svg') %]
<span data-testid="phpVersionsListAccountsLabel">[% locale.maketext("[asis,PHP] Status") %]</span>
</h3>
<hr class="php-eol-status__divider--top" />
<div data-testid="phpVersionsListAccountsValue">
<p>
<i class="fas fa-exclamation-circle text-danger" aria-hidden="true"></i>
<span id="phpVersionsStatusText"></span>
</p>
<p class="php-eol-status__description text-muted small">[% locale.maketext("Outdated “[_1]” versions no longer receive security updates. Use “[_2]” to stay protected.", "PHP", "PHP ELS") %]</p>
<hr class="php-eol-status__divider--bottom" />
<a id="phpElsSecureLink" class="php-eol-status__link" href="[% cp_security_token _ '/scripts7/multiphp-manager' %]" target="_blank" rel="noopener noreferrer">
[% locale.maketext("Secure sites with “[_1]”[comment,link label]", "PHP ELS") %]
</a>
</div>
</div>
</section>
</div>
<div class="pager-section pager-section-top group">
[% pagecontrols %]
[% IF data.totaltime %][% totaltime = data.totaltime %][% ELSE %][%totaltime = 1%][% END %]
<div class="stats">
[% IF settings.has_search_filter_sort %]
[% IF data.domaincount == 0 %]
[% locale.maketext("No matching records.") %]
[% ELSIF data.showcount == data.domaincount %]
[% locale.maketext("Showing all matching records.") %]
[% ELSE %]
[% locale.maketext("Showing [numf,_1] of [numf,_2] matching records.","${data.showcount}","${data.domaincount}") %]
[% END %]
[% ELSE %]
[% IF data.domaincount == 0 %]
[% locale.maketext("No records available.") %]
[% ELSIF data.showcount == data.domaincount %]
[% locale.maketext("Showing all [numf,_1] records.", "${data.domaincount}") %]
[% ELSE %]
[% locale.maketext("Showing [numf,_1] of [numf,_2] records.","${data.showcount}","${data.domaincount}") %]
[% END %]
[% END %]
<span style="background-color: #f4c6cb;">[% locale.maketext("Suspended accounts are highlighted in red.") %]</span>
</div>
</div>
<div id="acctlistblk">
<table id="listaccts" class="sortable">
<tr class="tblheader0">
<th nonsortable="true"> </th>
<th class="yui-dt-sortable [% IF data.sortorder == 'domain'; data.sortrev ? 'yui-dt-desc' : 'yui-dt-asc'; END %]" nonsortable="true"><div class="yui-dt-liner"><a href="[% data.sorturls.domain %]">[% column_headers.domain.replace('\s', ' ') %]</a></div></th>
[% IF settings.transferheader %]
<th nonsortable="true"><div class="yui-dt-liner">[% locale.maketext("cPanel") %]</div></th>
[% END %]
[% FOREACH column IN column_order %]
<th nowrap class="yui-dt-sortable [% IF column == data.sortorder; data.sortrev ? 'yui-dt-desc' : 'yui-dt-asc'; END %]" nonsortable="true">
<div class="yui-dt-liner">
<a href="[% data.sorturls.$column %]">
[% column_headers.$column.replace(' ', ' ') %]
[% IF ( column == 'limit' || column == 'used' ) %]
<img
class="quota_sensitive"
src='[% varcache.warning_image %]'
alt='[% varcache.warning_string %]'
title='[% locale.maketext("Warning: Quotas are currently disabled.") %]'
style="display:none;"
/>
[% END %]
</a>
</div>
</th>
[% END %]
</tr>
[%-
varcache.set( 'cpanel_disable_image', MagicRevision('/images/cpanel-disabled.png') );
varcache.set( 'cpanel_image', MagicRevision('/images/cpanel.png') );
varcache.set( 'plus_image', MagicRevision('/plus.gif') );
varcache.set('account_impersonation_disabled_string', locale.maketext("[asis,cPanel] account impersonation is disabled."));
varcache.set('missing_string', locale.maketext("Missing"));
varcache.set('warning_string', locale.maketext("Warning!"));
varcache.set('unknown_string', locale.maketext("Unknown"));
varcache.set('unlimited_string', locale.maketext("unlimited"));
varcache.set('quota_disabled_string', locale.maketext("Disabled"));
varcache.set('NA_string', locale.maketext("N/A"));
-%]
[% IF data.showcount == 0 %]
<tr>
<td colspan="[% NUMBER_OF_COLUMNS %]" class="final">
<p>
[% IF settings.has_search_filter_sort %]
[% locale.maketext("There are no matching accounts on your system.") %]
[% ELSE %]
[% locale.maketext("There are no accounts on your system.") %]
[% END %]
[% IF show_createacct %]
<!-- Quick link to account creation page -->
<a href="[% cp_security_token %]/scripts5/wwwacctform" id="create_account_link_in_table">[% locale.maketext("Create a New Account") %]</a>
[% END %]
</p>
</td>
</tr>
[% END %]
[% FOR acct IN data.accts; varcache.set('acct',acct); %]
[% SET username = acct.user %]
[% IF child_workload_accts.exists($username) %]
<tr class="child-account-row">
[%# Control Column -%]
<td class="control-col"></td>
[%# Domain Column -%]
<td>[% varcache.acct.domain.html()
%] </td>
<td class="child-account-msg" colspan="[% NUMBER_OF_COLUMNS - 2 %]">
[% locale.maketext('User Editing Locked:') %] [% locale.maketext('You must edit this account on the parent node.') %]
</td>
</tr>
[% ELSE %]
<tr onclick="clickrow(this)" email="[% varcache.acct.email.html() %]" user="[% varcache.acct.user.html() %]" domain="[% varcache.acct.domain.html() %]" suspended="[% varcache.acct.is_suspended %]" suspension_locked="[% varcache.acct.suspension_locked.html() %]" suspension_date="[% varcache.acct.suspension_date == 1 ? bandwidth_exceeded_text : CPDate.iso_format(varcache.acct.suspension_date).replace('\s',' ') %]" suspension_reason="[% varcache.acct.suspension_reason.html() %]" class="[% (loop.index % 2) ? 'tdshade1' : 'tdshade2' %][% IF varcache.acct.is_suspended %] suspended[% END -%][% IF child_workload_accts.$acct.user %]disabled[% END -%]">
[%# Control Column -%]
<td class="control-col" onclick="toggleRowEditor(this, false, 'password[% varcache.acct.user.html() %]'); Bubble_Click = true;" title="[% locale.maketext("Open the actions panel for this account.") %]"><img border="0" src="[% varcache.plus_image %]"></td>
[%# Domain Column -%]
<td><a href="http://[% varcache.acct.domain.html() %]" class="domain-link" target="_blank" title="[% locale.maketext("Browse to the site hosted at: [_1]", varcache.acct.domain.html()) %]">[% varcache.acct.domain.html() %] </a></td>
[%# cPanel Account Impersonation Column -%]
[% IF settings.transferheader %]
[%- IF varcache.acct.can_login -%]
<td>
<form method='POST' ACTION='/xfercpanel' target="_blank">
<input type='hidden' name='token' value="[% cp_security_token %]">
<input type='hidden' name='user' value="[% varcache.acct.user.uri() %]">
<input type="image" src="[% varcache.cpanel_image %]" border="0">
</form>
</td>
[%- ELSE -%]
<td><img src="[% varcache.cpanel_disable_image %]" border="0" title="[% varcache.account_impersonation_disabled_string %]"></td>
[%- END -%]
[% END %]
[%# IP Address Column -%]
<td class="nowrap">
[% IF varcache.acct.ip %]
<a href="http://[% varcache.acct.ip.uri() %]/~[% varcache.acct.user.uri() %]/" target="_blank" title="[% locale.maketext("View the files hosted at this domain.") %]">[% varcache.acct.ip.html() %]</a>
[% ELSE %]
<img src='[% varcache.error_image %]' alt='[% varcache.warning_string %]' title='[% locale.maketext("Warning: No IP address set for this account.") %]'> <span>[% varcache.missing_string %]</span>
[% END %]
</td>
[%# Username Column -%]
<td>
[% varcache.acct.user.html() %]
</td>
[%# Email Address Column -%]
<td>
[% IF varcache.acct.email %]
<a href="mailto:[% varcache.acct.email.uri() %]" title="[% locale.maketext("Send an email to “[_1]”.", varcache.acct.email.html()) %]">[% varcache.acct.email.html() %]</a>
[% END %]
</td>
[%# Account Start Date Column -%]
<td class="nowrap">
[% IF varcache.acct.startdate %]
[% CPDate.iso_format(varcache.acct.startdate) %]
[% ELSE %]
<span>[% varcache.unknown_string %]</span>
[% END %]
</td>
[%# Partition Column -%]
<td class="[% IF acl.item('rearrange-accts') %]editor[% END %]">
[% varcache.acct.partition.html() %]
</td>
[%# Number Column -%]
<td class="number">
<span class="quota_sensitive" style="display:none;">[% varcache.quota_disabled_string %]</span>
<span class="quota_insensitive">
[% IF varcache.acct.disklimit %]
[% varcache.acct.disklimit div 1024 %] MB
[% ELSE %]
[% varcache.unlimited_string %]
[% END %]
</span>
</td>
[%# Diskspace Used Column - this is returned in MB. -%]
<td class="number">
<span class="quota_sensitive" style="display:none;">[% varcache.NA_string %]</span>
<span class="quota_insensitive">[% varcache.acct.diskused_mb %] MB</span>
</td>
[%# Plan Column -%]
<td>
[% IF varcache.acct.plan %]
[% IF Whostmgr.checkacl('edit-pkg') %]
<a href="../scripts/editpkg2?pkg=[% varcache.acct.plan.html %]" target="_blank" title="[% locale.maketext('View the “[_1]” package settings.', varcache.acct.plan.html) %]">[% varcache.acct.plan.html %]</a>
[% ELSE %]
[% varcache.acct.plan.html %]
[% END %]
[% ELSE %]
<img src='[% varcache.error_image %]' alt='[% varcache.warning_string %]' title='[% locale.maketext("Warning: No plan set for this account.") %]'><span>[% varcache.unknown_string %]</span>
[% END %]
</td>
[%# Theme Column -%]
<td>
[% IF varcache.acct.theme %]
[% varcache.acct.theme.html %]
[% ELSE %]
<img src='[% varcache.error_image %]' alt='[% varcache.warning_string %]' title='[% locale.maketext("Warning: No theme set for this account.") %]'><span>[% varcache.unknown_string %]</span>
[% END %]</td>
[%# Reseller Column -%]
<td>
[% varcache.acct.owner.html() %]
</td>
[%# Suspended state Column %]
<td>
[% IF varcache.acct.startdate -%]
[%- IF varcache.acct.suspension_date == 1 # TODO: There should be a better way to know when a user is bandwidth-suspended in order to display something sensible here. -%]
[%- bandwidth_exceeded_text -%]
[%- ELSE -%]
[%- CPDate.iso_format(varcache.acct.suspension_date).replace('\s',' ') -%]
[%- END -%]
[%- ELSE -%]
<span>[% varcache.unknown_string -%]</span>
[%- END %]
</td>
[% IF data.display_upgrade_opportunities %]
[%-# Upgrade Opportunities Column -%]
<td class="upgrade-opportunities">
<ul class="upgrade-opportunity">
[%
# varcache does not implement TT hash virtual methods
FOREACH opportunity IN acct.upgrade_opportunities.keys.sort;
FOREACH message IN acct.upgrade_opportunities.$opportunity;
-%]
<li><i class="[% upgrade_opportunity_icon.$opportunity || upgrade_opportunity_icon.default %]" aria-hidden="true"></i> [% message.html %]</li>
[%-
END;
END;
%]
</ul>
</td>
[% END %]
[% END %]
</tr>
[% END %]
</table>
</div>
</div>
<div class="pager-section pager-section-bottom group">
[% pagecontrols %]
<div class="controls controls-bottom" style="float:right;"><a href="../scripts/fetchcsv" target="_blank">[% locale.maketext("Download all records to a [output,acronym,CSV,Comma Separated Values] file.") %]</a></div>
</div>
[% IF data.showcount > BOTTOM_SEARCH_THRESHOLD %]
[% search(data, locale, 'bottom') %]
[% END %]
[% IF show_createacct %]
<!-- Quick link to account creation page -->
<p><a href="[% cp_security_token %]/scripts5/wwwacctform" class="btn btn-primary" id="create_account_link_bottom">[% locale.maketext("Create a New Account") %]</a></p>
[% END %]
[% END %]
[% PROCESS '_loadjs.tmpl' src='/js/sorttable.js' %]
<script type="text/javascript">
var hasoutevent = {};
var DOM = YAHOO.util.Dom;
function initializeCellSubmit() {
// This function initializes the handers to makes the entire
// surface of the sortable header cells for the table clickable
// to initiate the sorting.
var Event = YAHOO.util.Event;
var tr = DOM.getElementsByClassName("tblheader0");
if(tr) {
var sortableColumns = DOM.getElementsByClassName("yui-dt-sortable", "th", tr[0]);
if(sortableColumns) {
var cellClick = function(evt) {
var as = DOM.getElementsBy(function() {return true;}, "a", evt.target);
if(as.length) {
window.location = as[0].href;
}
}
for(var i = 0, l = sortableColumns.length; i < l; i++) {
Event.addListener(sortableColumns[i], "click", cellClick);
}
}
}
}
function toggleRowEditor(el, noCollapse, focusEl, inForm) {
// This function toggles the row editor from open to closed
var Dom = YAHOO.util.Dom;
// Get the parent row and then the first column
var exptd = null;
if(!inForm) {
exptd = DOM.getAncestorByTagName(el, 'tr').cells[0];
}
else {
var row = DOM.getAncestorByTagName(el, 'tr');
if(row)
exptd = DOM.getPreviousSibling(row).cells[0];
}
// Find the image tag in that cell
var img;
for ( var i = 0, l = exptd.childNodes.length; i < l; i++ ) {
if (exptd.childNodes[i].tagName == "IMG") {
img = exptd.childNodes[i];
break;
}
}
// Toggle the output
if (img.src.indexOf("plus.gif") > 0) {
img.src='[% MagicRevision('/minus.gif') %]';
expandRow(exptd.parentNode);
}
else {
if (!noCollapse) {
img.src='[% MagicRevision('/plus.gif') %]';
collapseRow(exptd.parentNode);
}
}
if(focusEl) {
setElementFocus(focusEl);
}
}
function collapseRow(ownerRow) {
var tBodyEl = ownerRow.parentNode;
var nextSib = ownerRow.nextSibling;
var div = nextSib.childNodes[0];
if (nextSib.getAttribute('dynarow') == 1) {
CPANEL.animate.slide_up(nextSib, function() { tBodyEl.removeChild(nextSib); } );
}
}
var USER_TRANSFERRED_MESSAGE_RE = new RegExp('^[% data.user_transferred_message %]$');
function expandRow(ownerRow) {
var Dom = YAHOO.util.Dom;
var domainLinkEl = ownerRow.querySelector('a.domain-link');
var domainIsOverflowing = domainLinkEl.scrollWidth > domainLinkEl.offsetWidth;
var user = ownerRow.getAttribute('user');
var email = ownerRow.getAttribute('email');
var domain = ownerRow.getAttribute('domain');
var is_suspended = ownerRow.getAttribute('suspended');
var suspension_locked = ownerRow.getAttribute('suspension_locked');
var suspended_reason = ownerRow.getAttribute('suspension_reason');
var suspended_date = ownerRow.getAttribute('suspension_date');
var tBodyEl = ownerRow.parentNode;
var nextSib = ownerRow.nextSibling;
var newtr = document.createElement('tr');
var newtd = document.createElement('td');
newtr.setAttribute('dynarow', 1);
newtr.className = ownerRow.className.replace(/\bclicked\b/,"").replace(/\s+/,' ').trim();
newtd.setAttribute('colspan', ownerRow.cells.length);
newtd.className = "editor-cell";
if (newtd.colSpan) {
newtd.colSpan = ownerRow.cells.length;
}
var command_template =
"<a class='editor-closer' id='close" + user + "' title='[% locale.maketext("Close the editor panel.") %]' onclick='toggleRowEditor(this,null,null,true); return false;'><img src='[% varcache.close_image %]' alt='[% locale.maketext("Close") %]'></a>" +
(domainIsOverflowing ? "<div class='wordbreak full-domain'><label>[% locale.maketext('Full Domain:') %]</label> " + domain + "</div>" : "") +
"<div class='editor-container group'>";
[% IF acl.passwd -%]
command_template += "<div class='sub-form password-form'>" +
" <form method='POST' ACTION='../scripts/passwd'>" +
" <input type='text' style='display:none'>" +
" <input type='password' autocomplete='off' style='display:none'>" +
" <label for='password" + user + "'>[% locale.maketext("Change Password:") %]</label>" +
" <input id='password" + user + "' type='password' autocomplete='off' name='password'>" +
" <input type='hidden' name='user' value='" + user + "'>" +
" <input type='hidden' name=passwordtoken value='[% data.passwordtoken %]'>" +
" <input class='btn btn-primary' type='submit' value='[% locale.maketext("Change") %]'>" +
" <div class='enablemysql-loader-container' id='enablemysql_loader-" + user + "' style='clear:both'> " +
"<div>" +
"<img src='[% MagicRevision( '/images/report-spinner.gif') %]' class='enablemysql-loading' id='enablemysql-loading-" + user + "'/>" +
"[% locale.maketext("Determining MySQL password status …") %]" +
"</div>" +
" </div> " +
[% IF acl.item('digest-auth') -%]
" <div class='enabledigestauth-loader-container' id='enabledigestauth_loader-" + user + "' style='clear:both'> " +
"<div>" +
"<img src='[% MagicRevision( '/images/report-spinner.gif') %]' class='enabledigest-loading' id='enabledigest-loading-" + user + "'/>" +
"[% locale.maketext("Determining Digest Authentication status …") %]" +
"</div>" +
" </div> " +
[% END -%]
" <div class='enablemysql-container' id='enablemysql_container-" + user + "' style='clear:both;display:none;'> " +
"<div class='checkbox'>" +
"<label for='enablemysql-" + user + "'>[% locale.maketext("Synchronize MySQL password") %]" +
"<input class='enablemysql' type='checkbox' id='enablemysql-" + user + "' name='enablemysql' value='1' checked='checked'>" +
"</label>" +
"<span class='fas fa-question-circle fa-large' id='enablemysql-info' onclick=" + '"' + "CPANEL.ajax.toggleToolTip(this,'[% locale.maketext('Synchronize MySQL password') %]');" + '"' + " title='[% locale.maketext('This option will set the MySQL password to the new password.') %] [% locale.maketext('If a “[_1]” file exists in the user’s home directory and they still want to use the password in their “[_1]” file, uncheck this option.','.my.cnf') %]'></span>" +
"</div>" +
" </div> " +
[% IF acl.item('digest-auth') -%]
" <input type='hidden' name='enabledigest_shown' value='1'>" +
" <div class='enabledigest-container' id='enabledigest_container-" + user + "' style='clear:both;display:none;'> " +
"<div class='checkbox'>" +
"<label for='enabledigest-" + user + "'>[% locale.maketext("Enable Digest Authentication") %]" +
"<input class='enabledigest' type='checkbox' id='enabledigest-" + user + "' name='enabledigest' value='1' checked='checked'>" +
"</label>" +
"<span class='fas fa-question-circle fa-large' id='enabledigest-info' onclick=" + '"' + "CPANEL.ajax.toggleToolTip(this,'[% locale.maketext('Digest Authentication') %]');" + '"' + " title='[% locale.maketext('[list_and,_*] require Digest Authentication support to be enabled in order to access your Web Disk over a clear text/unencrypted connection.', 'Windows Vista®', 'Windows® 7', 'Windows® 8') %] [% locale.maketext('If the server has an SSL certificate signed by a recognized certificate authority and you are able to make an SSL connection over port 2078, you do not need to enable this.') %]'></span>"+
"</div>" +
" </div> " +
[% END -%]
" </form>" +
"</div>";
[% END -%]
command_template += "<div class='sub-form email-form'>" +
" <form method='POST' ACTION='../scripts2/dochangeemail'>" +
" <label for='user" + user + "'>[% locale.maketext("Change Contact Email:") %]</label>" +
" <input type='hidden' name='user' value='" + user.html_encode() + "'>" +
" <input type='hidden' name='oldemail' value='" + email.html_encode() + "'>" +
" <input id='user" + user + "' type='text' name='email' value='" + email.html_encode() + "'>" +
" <input class='btn btn-primary' type='submit' value='[% locale.maketext("Change") %]'>" +
" </form>" +
"</div>";
[% IF acl.item('suspend-acct') %]
command_template += "<div class='sub-form suspend-form'>";
if( is_suspended == 1){
command_template += "<div>" +
" <div><strong>[% locale.maketext("Account Suspended") %]</strong></div>" +
" <div><strong>[% locale.maketext("Reason") %]</strong> " + suspended_reason.html_encode() + "</div>" +
" <div><strong>[% locale.maketext("Suspended") %]</strong> " + suspended_date + "</div>";
[% IF acl.all %]
command_template += " <div><strong>[% locale.maketext("Suspension Locked") %]</strong> ";
command_template += (suspension_locked == 1 ) ? "Yes" : "No";
command_template += "</div>";
[% END %]
command_template += "</div>";
[%- IF ! acl.all %]
if( suspension_locked == 1){
command_template +=
" <span class='dlink'>" +
" <button class='btn btn-primary' disabled=1 title='[%locale.maketext("Suspension Locked")%]'>" +
" <span>[% locale.maketext("Suspension Locked") %]</span>" +
" </button>" +
" </span>";
}
else{
[%- END %]
command_template +=
" <span class='dlink'>" +
" <button class='btn btn-primary' onclick='unsuspendAccount(\"" + user + "\", \"" + domain + "\")' title='[%locale.maketext("Unsuspend")%]'>" +
" <span>[% locale.maketext("Unsuspend") %]</span>" +
" </button>";
if( USER_TRANSFERRED_MESSAGE_RE.exec(suspended_reason) ){
command_template +=
' <div class="checkbox"> \
<label> \
<input id="retain-proxying" type="checkbox" name="retain-proxying" value="1" /> \
[% locale.maketext('Retain [output,url,_1,Service Proxying,target,serviceProxyingDocs]','https://go.cpanel.net/ServiceProxying') %] \
</label> \
<span \
id=\'retain-proxying-info\' \
class=\'fas fa-question-circle fa-large\' \
onclick=\'CPANEL.ajax.toggleToolTip(this,"[% locale.maketext('Retain Service Proxying') %]");\' \
title=\'[% locale.maketext('Select this checkbox to keep the account’s current service proxying settings. If you do not select this checkbox, the system will disable service proxying by default.') %]\'> \
\
</span> \
</div>';
}
command_template += " </span>";
[%- IF ! acl.all %]
}
[%- END %]
}
else{
command_template +=
"<form method='POST' action='../scripts2/suspendacct'>" +
" <label for='user-" + user + "'>[% locale.maketext("Suspend Account") %]</label>" +
" <input type='hidden' name='user' value='" + user + "'>" +
" <input type='hidden' name='domain' value='" + domain + "'>" +
" <input type='hidden' name='suspend-domain' value='Suspend'>" +
" <input type='text' name='reason' id='suspend-" + user + "-reason'>" +
" <input class='btn btn-primary' type='submit' value='[%locale.maketext("Suspend")%]' />" +
[%- IF acl.all -%]
" <div class='localsuspension-container' id='locksuspension_container-" + user + "' style='clear:both'> " +
" <div class='checkbox'>" +
" <label for='reason-" + user + "'>[% locale.maketext("Prevent unsuspending") %]" +
" <input class='enabledigest' type='checkbox' name='disallowun' id='reason-" + user + "' value='1'>" +
" </label>" +
" <span class='fas fa-question-circle fa-large' id='prevent-unsuspend-info' onclick='CPANEL.ajax.toggleToolTip(this,\"[% locale.maketext('Prevent unsuspending') %]\");' title='[% locale.maketext('Only resellers with the All privilege are allowed to unsuspend.') %]'> </span>" +
" </div>" +
" </div>" +
[%- END -%]
"</form>";
}
[%# End Suspend Account Block %]
command_template += "</div></div>";
[% END -%]
[% IF acl.all || acl.item('rearrange-accts') || acl.quota || acl.item('upgrade-account') || acl.item('edit-account') || acl.item('suspend-acct') || acl.item('kill-acct') %]
command_template += "<div class='actions-container group'>" +
" <label class='title'>[% locale.maketext("Actions:") %]</label>" +
" <div class='button-container'>";
[% IF acl.all %]
command_template +=" <span class='dlink'>" +
" <button class='btn btn-primary' onclick='window.location=\"../scripts2/changeip?domain=" + domain + "&user=" + user + "\"' title='[% locale.maketext("Change the account’s IP address.") %]'>" +
" <span>[% locale.maketext("Change IP Address") %]</span>" +
" </button>" +
" </span>";
[% END %]
[% IF acl.item('rearrange-accts') %]
command_template += " <span class='dlink'>" +
" <button class='btn btn-primary' onclick='window.location=\"../scripts/rearrangeacct?domain=" + user + "&user=" + user + "\"' title='[%locale.maketext("Change the accounts disk partition.")%]'>" +
" <span>[% locale.maketext("Change Disk Partition") %]</span>" +
" </button>" +
" </span>";
[% END %]
[% IF acl.quota %]
command_template += " <span class='dlink'>" +
" <button class='btn btn-primary' onclick='window.location=\"../scripts/quotalist?domain=" + domain + "&user=" + user +"\"' title='[%locale.maketext("Change the accounts disk quota.")%]'>" +
" <span>[% locale.maketext("Change Quota") %]</span>" +
" </button>" +
" </span>";
[% END %]
[% IF acl.item('upgrade-account') %]
command_template += " <span class='dlink'>" +
" <button class='btn btn-primary' onclick='window.location=\"../scripts/selectupgrade?domain=" + domain + "&user=" + user + "\"' title='[%locale.maketext("Change the account plan.")%]'>" +
" <span>[% locale.maketext("Change Plan") %]</span>" +
" </button>" +
" </span>";
[% END %]
[% IF acl.item('edit-account') %]
command_template += " <span class='dlink'>" +
" <button class='btn btn-primary' onclick='window.location=\"../scripts/edituser?domain=" + domain + "&user=" + user + "\"' title='[%locale.maketext("Change the account using the Modify Accounts.")%]'>" +
" <span>[% locale.maketext("Modify Account") %]</span>" +
" </button>" +
" </span>";
[% END %]
[% IF acl.item('kill-acct') %]
command_template += " <span class='dlink'>" +
" <button class='btn btn-primary' onclick='window.location=\"../scripts4/multikillacct/" + user + "\"' title='[%locale.maketext("Terminate Account")%]'>" +
" <span>[% locale.maketext("Terminate Account") %]</span>" +
" </button>" +
" </span>";
[% END %]
command_template += "</div>";
[%# End first acl check -%]
[% END -%]
command_template += "</div>";
newtd.innerHTML = command_template;
newtr.appendChild(newtd);
var div = newtr.childNodes[0];
YAHOO.util.Dom.removeClass(newtr, 'activerow');
tBodyEl.insertBefore(newtr, nextSib);
var mycnf_api_call = {
func: "has_mycnf_for_cpuser",
version: "1",
data: {
user: user
}
};
mycnf_api_call.callback = {
success: function(o) {
CPANEL.animate.slide_up('enablemysql_loader-' + user);
var response = YAHOO.lang.JSON.parse( o.responseText );
if ( response && response.metadata && response.metadata.result === 1 ) {
var userMysqlCheck = DOM.get('enablemysql-' + user);
if (userMysqlCheck) {
if ( parseInt(response.data.has_mycnf_for_cpuser) ) {
userMysqlCheck.checked = false;
CPANEL.animate.slide_down('enablemysql_container-' + user);
} else {
userMysqlCheck.checked = true;
}
}
}
},
failure: function(o) {
CPANEL.animate.slide_up('enablemysql_loader-' + user);
var userMysqlCheck = DOM.get('enablemysql-' + user);
if (userMysqlCheck) {
userMysqlCheck.checked = true;
}
}
};
CPANEL.api(mycnf_api_call);
[% IF acl.item('digest-auth') -%]
var digest_auth_api_call = {
func: "has_digest_auth",
version: "1",
data: {
user: user
}
};
digest_auth_api_call.callback = {
success: function(o) {
CPANEL.animate.slide_up('enabledigestauth_loader-' + user);
var response = YAHOO.lang.JSON.parse( o.responseText );
if ( response && response.metadata && response.metadata.result === 1 ) {
var userDigestCheck = DOM.get('enabledigest-' + user);
if (userDigestCheck) {
userDigestCheck.checked = parseInt(response.data.digestauth, 10) ? true : false;
CPANEL.animate.slide_down('enabledigest_container-' + user);
}
}
},
failure: function(o) {
CPANEL.animate.slide_up('enabledigestauth_loader-' + user);
}
};
CPANEL.api(digest_auth_api_call);
[% END -%]
}
function setDefaultFocus() {
var searchTextEl = document.getElementById('searchtxttop');
if (searchTextEl) {
var len = searchTextEl.value ? searchTextEl.value.length : 0;
searchTextEl.focus();
setCaretPosition(searchTextEl, len);
}
}
function unsuspendAccount(user, domain) {
var retainProxyingEl = document.getElementById('retain-proxying');
var retainProxying = retainProxyingEl && retainProxyingEl.checked ? "1" : "0";
window.location = "../scripts2/suspendacct?user=" + user + "&domain=" + domain + "&unsuspend-domain=Unsuspend&reason=&retain-proxying=" + retainProxying;
}
function setElementFocus(el) {
if(isString(el))
el = document.getElementById(el);
if(el) {
setTimeout(function() {
var that = el;
that.focus();
}, 0);
}
}
function isString(obj) {
return obj !== undefined && obj != null && obj.toLowerCase !== undefined;
}
function setCaretPosition(el, pos) {
if(el.setSelectionRange) {
el.focus();
el.setSelectionRange(pos, pos);
}
else if(el.createTextRange) {
var range = el.createTextRange();
range.collapse(true);
range.moveEnd('character', pos);
range.moveStart('character', pos);
range.select();
}
}
Bubble_Click = false;
function clickrow(row_el) {
if (Bubble_Click) {
Bubble_Click = false;
return;
}
CPANEL.dom.toggle_class(row_el, 'clicked');
}
// Show or hide additional form input options based on input selection
function optionsChange(selected_el) {
var selected_name = selected_el.getAttribute("name");
var enclosing_form = selected_el.form;
// For all input elements of the same name in the enclosing form...
enclosing_form
.querySelectorAll('input[name="' + selected_name + '"]')
.forEach(function(input_el) {
var input_id = input_el.getAttribute("id");
// If an element ID exists that matches the input ID w/ _options
// suffix, then hide or unhide that element depending on input state
var options_el = enclosing_form.querySelector("#" + input_id + "_options");
if (options_el) {
if (input_el.checked) {
options_el.classList.remove("hidden");
} else {
options_el.classList.add("hidden");
}
}
});
}
function checkPhpOutdatedVersions() {
var rowEl = document.getElementById("phpVersionsListAccountsRow");
var textEl = document.getElementById("phpVersionsStatusText");
if (!rowEl || !textEl) {
return;
}
var request = new XMLHttpRequest();
request.addEventListener("load", function(event) {
if (request.status >= 200 && request.status < 300 ||
request.status === 304) {
var response = JSON.parse(event.target.responseText);
var amount = response.data && response.data.eol_php_sites;
if (amount > 0) {
textEl.textContent = LOCALE.maketext("[quant,_1,site uses,sites use,No sites use] outdated [asis,PHP].", amount);
rowEl.classList.remove("hide");
trackMixpanelEvent("PHPELS-Widget-Shown-List-Accounts");
var linkEl = document.getElementById("phpElsSecureLink");
if (linkEl) {
linkEl.addEventListener("click", function() {
trackMixpanelEvent("PHPELS-Widget-Link-Clicked-List-Accounts");
});
}
}
}
// On HTTP error: row stays hidden — silent, non-blocking failure.
});
request.open("GET", "[% cp_security_token %]/json-api/eol_php_sites?api.version=1", true);
request.send();
}
function trackMixpanelEvent(eventName) {
var mp = window && window.mixpanel;
if (mp && typeof mp.track === "function") {
mp.track(eventName, {});
}
}
YAHOO.util.Event.addListener(window,'load',setDefaultFocus);
YAHOO.util.Event.addListener(window,'load',initializeCellSubmit);
YAHOO.util.Event.addListener(window,'load',checkPhpOutdatedVersions);
</script>
[% PROCESS '_ajaxapp_footer.tmpl' -%]
Back to Directory
File Manager