Refactor and Extract HTML from table privs page

Server\Privileges::getHtmlForSpecificTablePrivileges

Signed-off-by: Maurício Meneghini Fauth <mauricio@fauth.dev>
This commit is contained in:
Maurício Meneghini Fauth 2019-09-28 20:23:36 -03:00
parent ecd9b08dbb
commit 860290eef4
2 changed files with 153 additions and 13 deletions

View File

@ -1425,34 +1425,91 @@ class Privileges
*/
public function getHtmlForSpecificTablePrivileges(string $db, string $table): string
{
global $cfg, $pmaThemeImage, $text_dir, $is_createuser;
global $cfg, $pmaThemeImage, $text_dir, $is_createuser, $is_grantuser;
$scriptName = Util::getScriptNameForOption(
$cfg['DefaultTabTable'],
'table'
);
$tableBody = '';
$privileges = [];
if ($this->dbi->isSuperuser()) {
$privileges = $this->getDatabasePrivileges($db);
$databasePrivileges = $this->getDatabasePrivileges($db);
$tablePrivileges = $this->getTablePrivileges($db, $table);
foreach ($tablePrivileges as $user => $hosts) {
foreach ($hosts as $host => $privs) {
$privileges[$user] = $privileges[$user] ?? [];
$privileges[$user][$host] = array_merge($privileges[$user][$host] ?? [], $privs);
foreach ($hosts as $host => $specificPrivileges) {
$databasePrivileges[$user] = $databasePrivileges[$user] ?? [];
$databasePrivileges[$user][$host] = array_merge(
$databasePrivileges[$user][$host] ?? [],
$specificPrivileges
);
}
}
$routinePrivileges = $this->getRoutinesPrivileges($db);
foreach ($routinePrivileges as $user => $hosts) {
foreach ($hosts as $host => $privs) {
$privileges[$user] = $privileges[$user] ?? [];
$privileges[$user][$host] = array_merge($privileges[$user][$host] ?? [], $privs);
foreach ($hosts as $host => $specificPrivileges) {
$databasePrivileges[$user] = $databasePrivileges[$user] ?? [];
$databasePrivileges[$user][$host] = array_merge(
$databasePrivileges[$user][$host] ?? [],
$specificPrivileges
);
}
}
$tableBody = $this->getHtmlTableBodyForSpecificDbOrTablePrivs($privileges, $db);
foreach ($databasePrivileges as $user => $hosts) {
foreach ($hosts as $host => $specificPrivileges) {
$privileges[$user . '@' . $host] = [
'user' => $user,
'host' => $host,
'privileges' => [],
];
foreach ($specificPrivileges as $specificPrivilege) {
$privilege = [
'type' => $specificPrivilege['Type'],
'database' => $specificPrivilege['Db'],
];
if ($specificPrivilege['Type'] === 'r') {
$privilege['routine'] = $specificPrivilege['Routine_name'];
$privilege['has_grant'] = strpos(
$specificPrivilege['Proc_priv'],
'Grant'
) !== false;
$privilege['privileges'] = explode(',', $specificPrivilege['Proc_priv']);
} elseif ($specificPrivilege['Type'] === 't') {
$privilege['table'] = $specificPrivilege['Table_name'];
$privilege['has_grant'] = strpos(
$specificPrivilege['Table_priv'],
'Grant'
) !== false;
$tablePrivs = explode(',', $specificPrivilege['Table_priv']);
$specificPrivileges = [];
$grantsArr = $this->getTableGrantsArray();
foreach ($grantsArr as $grant) {
$specificPrivileges[$grant[0]] = 'N';
foreach ($tablePrivs as $priv) {
if ($grant[0] == $priv) {
$specificPrivileges[$grant[0]] = 'Y';
}
}
}
$privilege['privileges'] = $this->extractPrivInfo(
$specificPrivileges,
true,
true
);
} else {
$privilege['has_grant'] = $specificPrivilege['Grant_priv'] === 'Y';
$privilege['privileges'] = $this->extractPrivInfo(
$specificPrivilege,
true
);
}
$privileges[$user . '@' . $host]['privileges'][$specificPrivilege['Type']] = $privilege;
}
}
}
}
return $this->template->render('server/privileges/table', [
@ -1462,8 +1519,9 @@ class Privileges
'table_url' => $scriptName,
'pma_theme_image' => $pmaThemeImage,
'text_dir' => $text_dir,
'table_body' => $tableBody,
'is_createuser' => $is_createuser,
'is_grantuser' => $is_grantuser,
'privileges' => $privileges,
]);
}

View File

@ -25,13 +25,95 @@
</tr>
</thead>
{{ table_body|raw }}
<tbody>
{% for privilege in privileges %}
{% set privileges_amount = privilege.privileges|length %}
<tr>
<td{% if privileges_amount > 1 %} rowspan="{{ privileges_amount }}"{% endif %}>
<input type="checkbox" class="checkall" name="selected_usr[]" id="checkbox_sel_users_{{ loop.index0 }}" value="
{{- privilege.user ~ '&amp;#27;' ~ privilege.host }}">
</td>
<td{% if privileges_amount > 1 %} rowspan="{{ privileges_amount }}"{% endif %}>
{% if privilege.user is empty %}
<span class="text-danger">{% trans 'Any' %}</span>
{% else %}
{{ privilege.user }}
{% endif %}
</td>
<td{% if privileges_amount > 1 %} rowspan="{{ privileges_amount }}"{% endif %}>
{{ privilege.host }}
</td>
{% for priv in privilege.privileges %}
<td>
{% if priv.type == 'g' %}
{% trans 'global' %}
{% elseif priv.type == 'd' %}
{% if priv.database == db|replace({'_': '\\_', '%': '\\%'}) %}
{% trans 'database-specific' %}
{% else %}
{% trans 'wildcard' %}: <code>{{ priv.database }}</code>
{% endif %}
{% elseif priv.type == 't' %}
{% trans 'table-specific' %}
{% elseif priv.type == 'r' %}
{% trans 'routine' %}
{% endif %}
</td>
<td>
<code>
{% if priv.type == 'r' %}
{{ priv.routine }}
({{ priv.privileges|join(', ')|upper }})
{% else %}
{{ priv.privileges|join(', ')|raw }}
{% endif %}
</code>
</td>
<td>
{{ priv.has_grant ? 'Yes'|trans : 'No'|trans }}
</td>
<td>
{% if is_grantuser %}
<a class="edit_user_anchor" href="{{ url('/server/privileges', {
'username': privilege.user,
'hostname': privilege.host,
'dbname': priv.database != '*' ? priv.database,
'tablename': priv.table is defined and priv.table != '*' ? priv.table,
'routinename': priv.routine ?? ''
}) }}">
{{ get_icon('b_usredit', 'Edit privileges'|trans) }}
</a>
{% endif %}
</td>
<td class="center">
<a class="export_user_anchor ajax" href="{{ url('/server/privileges', {
'username': privilege.user,
'hostname': privilege.host,
'export': true,
'initial': ''
}) }}">
{{ get_icon('b_tblexport', 'Export'|trans) }}
</a>
</td>
</tr>
{% if privileges_amount > 1 %}
<tr class="noclick">
{% endif %}
{% endfor %}
{% else %}
<tr>
<td colspan="7">
{% trans 'No user found.' %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<div class="floatleft">
<img class="selectallarrow" src="{{ pma_theme_image }}arrow_{{ text_dir }}.png" alt="
{%- trans 'With selected:' %}" width="38" height="22">
{%- trans 'With selected:' %}" width="38" height="22">
<input type="checkbox" id="usersForm_checkall" class="checkall_box" title="{% trans 'Check all' %}">
<label for="usersForm_checkall">{% trans 'Check all' %}</label>
<em class="with-selected">{% trans 'With selected:' %}</em>