Skip to content
Snippets Groups Projects
Commit b27d77c6 authored by Jan-Hendrik Willms's avatar Jan-Hendrik Willms
Browse files

respect global visibility setting 'always' and sanitize associated code, fixes #938

Closes #938
parent e9e032fe
No related branches found
No related tags found
No related merge requests found
...@@ -48,16 +48,14 @@ class Settings_PrivacyController extends Settings_SettingsController ...@@ -48,16 +48,14 @@ class Settings_PrivacyController extends Settings_SettingsController
// Get default visibility for homepage elements. // Get default visibility for homepage elements.
$this->default_homepage_visibility = Visibility::get_default_homepage_visibility($this->user->user_id); $this->default_homepage_visibility = Visibility::get_default_homepage_visibility($this->user->user_id);
$this->NOT_HIDEABLE_FIELDS = $GLOBALS['NOT_HIDEABLE_FIELDS']; $this->user_perm = $GLOBALS['perm']->get_perm($this->user->user_id);
$this->user_perm = $GLOBALS['perm']->get_perm($this->user->user_id); $this->user_domains = UserDomain::getUserDomains();
$this->user_domains = UserDomain::getUserDomains();
// Calculate colWidth and colCount for different visibilities // Calculate colWidth and colCount for different visibilities
$this->colCount = Visibility::getColCount(); $this->colCount = Visibility::getColCount();
$this->colWidth = 67 / $this->colCount; $this->colWidth = 67 / $this->colCount;
$this->visibilities = Visibility::getVisibilities(); $this->visibilities = Visibility::getVisibilities();
$this->homepage_elements = Visibility::getHTMLArgs($this->user->user_id); $this->homepage_elements = Visibility::getHTMLArgs($this->user->user_id);
} }
/** /**
......
...@@ -49,37 +49,31 @@ use Studip\Button, Studip\LinkButton; ...@@ -49,37 +49,31 @@ use Studip\Button, Studip\LinkButton;
</div> </div>
</label> </label>
<? if ((in_array($global_visibility, ['yes', 'global']) || <? if (Visibility::allowExtendedSettings($user)): ?>
($global_visibility === 'unknown' && Config::get()->USER_VISIBILITY_UNKNOWN) ||
($user_perm === 'dozent' && Config::get()->DOZENT_ALWAYS_VISIBLE)) &&
(!$NOT_HIDEABLE_FIELDS[$user_perm]['online'] ||
!$NOT_HIDEABLE_FIELDS[$user_perm]['search'] ||
!$NOT_HIDEABLE_FIELDS[$user_perm]['email'])
) : ?>
<div> <div>
<?= _('Erweiterte Einstellungen') ?> <?= _('Erweiterte Einstellungen') ?>
<?= tooltipIcon( <?= tooltipIcon(
_('Stellen Sie hier ein, in welchen Bereichen des Systems Sie erscheinen wollen.') _('Stellen Sie hier ein, in welchen Bereichen des Systems Sie erscheinen wollen.')
. (!$NOT_HIDEABLE_FIELDS[$user_perm]['email'] . (Visibility::isFieldHideableForUser('email', $user)
? _('Wenn Sie hier Ihre E-Mail-Adresse verstecken, wird stattdessen die E-Mail-Adresse Ihrer (Standard-)Einrichtung angezeigt.') ? _('Wenn Sie hier Ihre E-Mail-Adresse verstecken, wird stattdessen die E-Mail-Adresse Ihrer (Standard-)Einrichtung angezeigt.')
: '') : '')
) ?> ) ?>
<? if (!$NOT_HIDEABLE_FIELDS[$user_perm]['online']): ?> <? if (Visibility::isFieldHideableForUser('online', $user)): ?>
<label> <label>
<input type="checkbox" name="online" value="1" <input type="checkbox" name="online" value="1"
<? if ($online_visibility) echo 'checked'; ?>> <? if ($online_visibility) echo 'checked'; ?>>
<?= _('sichtbar in "Wer ist online"') ?> <?= _('sichtbar in "Wer ist online"') ?>
</label> </label>
<? endif; ?> <? endif; ?>
<? if (!$NOT_HIDEABLE_FIELDS[$user_perm]['search']): ?> <? if (Visibility::isFieldHideableForUser('search', $user)): ?>
<label> <label>
<input type="checkbox" name="search" value="1" <input type="checkbox" name="search" value="1"
<? if ($search_visibility) echo 'checked'; ?>> <? if ($search_visibility) echo 'checked'; ?>>
<?= _('auffindbar über die Personensuche') ?> <?= _('auffindbar über die Personensuche') ?>
</label> </label>
<? endif; ?> <? endif; ?>
<? if (!$NOT_HIDEABLE_FIELDS[$user_perm]['email']): ?> <? if (Visibility::isFieldHideableForUser('email', $user)): ?>
<label> <label>
<input type="checkbox" name="email" value="1" <input type="checkbox" name="email" value="1"
<? if ($email_visibility) echo 'checked'; ?>> <? if ($email_visibility) echo 'checked'; ?>>
......
...@@ -644,5 +644,67 @@ class Visibility ...@@ -644,5 +644,67 @@ class Visibility
$stmt->execute(); $stmt->execute();
return $stmt->rowCount(); return $stmt->rowCount();
} }
/**
* Returns whether the user should be allowed to configure the extended
* settings.
*
* @param User|null $user User object (defaults to current user)
*
* @return bool
*/
public static function allowExtendedSettings(\User $user = null): bool
{
$user = $user ?? User::findCurrent();
if (!$user) {
return false;
}
// Check if all fields for the extended settings are not hideable. If
// so, we mustn't show the extended settings.
if (
!self::isFieldHideableForUser('online', $user)
&& !self::isFieldHideableForUser('search', $user)
&& !self::isFieldHideableForUser('email', $user)
) {
return false;
}
// User chose to be visible and may configure the extended settings.
if (in_array($user->visible, ['yes', 'global'])) {
return true;
}
// User did not specify a visibility but the global config defines
// visibility, so the user may configure the extended settings.
if ($user->visible === 'unknown' && Config::get()->USER_VISIBILITY_UNKNOWN) {
return true;
}
// Teachers are always visible by configuration? So they may see the
// extended settings
if ($user->perms === 'dozent' && Config::get()->DOZENT_ALWAYS_VISIBLE) {
return true;
}
// In all other cases, don't show the extended settings.
return false;
}
/**
* Returns whether the given field is hideable by configuration for the
* given user permission.
*
* @param string $field Field that should be hidden
* @param User|null $user User object (defaults to current user)
*
* @return bool
*/
public static function isFieldHideableForUser(string $field, User $user = null): bool
{
$user = $user ?? User::findCurrent();
return empty($GLOBALS['NOT_HIDEABLE_FIELDS'][$user->perms][$field]);
}
} }
?>
...@@ -274,15 +274,23 @@ function first_decision($userid) { ...@@ -274,15 +274,23 @@ function first_decision($userid) {
function get_local_visibility_by_id($user_id, $context, $return_user_perm=false) { function get_local_visibility_by_id($user_id, $context, $return_user_perm=false) {
global $NOT_HIDEABLE_FIELDS; global $NOT_HIDEABLE_FIELDS;
$query = "SELECT a.perms, u.`{$context}` $user = User::find($user_id);
FROM auth_user_md5 AS a
LEFT JOIN user_visibility AS u USING (user_id) if (Visibility::allowExtendedSettings($user)) {
WHERE user_id = ?"; $query = "SELECT u.`{$context}`
$statement = DBManager::get()->prepare($query); FROM auth_user_md5 AS a
$statement->execute([$user_id]); LEFT JOIN user_visibility AS u USING (user_id)
$data = $statement->fetch(PDO::FETCH_ASSOC); WHERE user_id = ?";
$statement = DBManager::get()->prepare($query);
$statement->execute([$user_id]);
$data = $statement->fetch(PDO::FETCH_ASSOC);
} else {
$data = [];
}
if ($context === 'homepage') { if ($context === 'homepage') {
$homepage_settings = [];
$settings = User_Visibility_Settings::findByUser_id($user_id); $settings = User_Visibility_Settings::findByUser_id($user_id);
foreach ($settings as $setting) { foreach ($settings as $setting) {
if ($setting['category'] == 1) { if ($setting['category'] == 1) {
...@@ -296,30 +304,26 @@ function get_local_visibility_by_id($user_id, $context, $return_user_perm=false) ...@@ -296,30 +304,26 @@ function get_local_visibility_by_id($user_id, $context, $return_user_perm=false)
} }
if ($data[$context] === null) { if ($data[$context] === null) {
$user_perm = $data['perm'];
$data['perms'] = $user_perm;
$data[$context] = Config::get()->getValue(mb_strtoupper($context) . '_VISIBILITY_DEFAULT'); $data[$context] = Config::get()->getValue(mb_strtoupper($context) . '_VISIBILITY_DEFAULT');
} }
// Valid context given.
if (isset($data[$context])) { if (!isset($data[$context])) {
// No valid context given.
$result = false;
} elseif (!Visibility::isFieldHideableForUser($context, $user)) {
// Context may not be hidden per global config setting. // Context may not be hidden per global config setting.
if ($NOT_HIDEABLE_FIELDS[$data['perms']][$context]) { $result = true;
$result = true; } elseif ($return_user_perm) {
} else { // Give also user's permission level.
// Give also user's permission level. $result = [
if ($return_user_perm) { 'perms' => $user->perms,
$result = [ $context => $data[$context]
'perms' => $data['perms'], ];
$context => $data[$context]
];
} else {
$result = $data[$context];
}
}
} else { } else {
$result = false; // Valid context given.
$result = $data[$context];
} }
return $result; return $result;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment