X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FPreferences.php;h=6d15c1eec5614afc71d8806c7bd17c8984b7fe78;hb=1cf375fb01b48b0edd9404a0ce72d12ccbdd9db6;hp=cf8e7b80882c17f8c993f9f6653695377f34fd77;hpb=17b3bab4d636df56e4a4b55e52fcda9fde892804;p=lhc%2Fweb%2Fwiklou.git
diff --git a/includes/Preferences.php b/includes/Preferences.php
index cf8e7b8088..6d15c1eec5 100644
--- a/includes/Preferences.php
+++ b/includes/Preferences.php
@@ -55,8 +55,6 @@ class Preferences {
/** @var array */
protected static $saveFilters = [
'timecorrection' => [ 'Preferences', 'filterTimezoneInput' ],
- 'cols' => [ 'Preferences', 'filterIntval' ],
- 'rows' => [ 'Preferences', 'filterIntval' ],
'rclimit' => [ 'Preferences', 'filterIntval' ],
'wllimit' => [ 'Preferences', 'filterIntval' ],
'searchlimit' => [ 'Preferences', 'filterIntval' ],
@@ -224,24 +222,48 @@ class Preferences {
'section' => 'personal/info',
];
+ $lang = $context->getLanguage();
+
# Get groups to which the user belongs
$userEffectiveGroups = $user->getEffectiveGroups();
- $userGroups = $userMembers = [];
+ $userGroupMemberships = $user->getGroupMemberships();
+ $userGroups = $userMembers = $userTempGroups = $userTempMembers = [];
foreach ( $userEffectiveGroups as $ueg ) {
if ( $ueg == '*' ) {
// Skip the default * group, seems useless here
continue;
}
- $groupName = User::getGroupName( $ueg );
- $userGroups[] = User::makeGroupLinkHTML( $ueg, $groupName );
- $memberName = User::getGroupMember( $ueg, $userName );
- $userMembers[] = User::makeGroupLinkHTML( $ueg, $memberName );
- }
- asort( $userGroups );
- asort( $userMembers );
+ if ( isset( $userGroupMemberships[$ueg] ) ) {
+ $groupStringOrObject = $userGroupMemberships[$ueg];
+ } else {
+ $groupStringOrObject = $ueg;
+ }
- $lang = $context->getLanguage();
+ $userG = UserGroupMembership::getLink( $groupStringOrObject, $context, 'html' );
+ $userM = UserGroupMembership::getLink( $groupStringOrObject, $context, 'html',
+ $userName );
+
+ // Store expiring groups separately, so we can place them before non-expiring
+ // groups in the list. This is to avoid the ambiguity of something like
+ // "administrator, bureaucrat (until X date)" -- users might wonder whether the
+ // expiry date applies to both groups, or just the last one
+ if ( $groupStringOrObject instanceof UserGroupMembership &&
+ $groupStringOrObject->getExpiry()
+ ) {
+ $userTempGroups[] = $userG;
+ $userTempMembers[] = $userM;
+ } else {
+ $userGroups[] = $userG;
+ $userMembers[] = $userM;
+ }
+ }
+ sort( $userGroups );
+ sort( $userMembers );
+ sort( $userTempGroups );
+ sort( $userTempMembers );
+ $userGroups = array_merge( $userTempGroups, $userGroups );
+ $userMembers = array_merge( $userTempMembers, $userMembers );
$defaultPreferences['usergroups'] = [
'type' => 'info',
@@ -495,9 +517,9 @@ class Preferences {
} else {
$disableEmailPrefs = true;
$emailauthenticated = $context->msg( 'emailnotauthenticated' )->parse() . '
' .
- Linker::linkKnown(
+ $linkRenderer->makeKnownLink(
SpecialPage::getTitleFor( 'Confirmemail' ),
- $context->msg( 'emailconfirmlink' )->escaped()
+ $context->msg( 'emailconfirmlink' )->text()
) . '
';
$emailauthenticationclass = "mw-email-not-authenticated";
}
@@ -696,19 +718,23 @@ class Preferences {
$tzOptions = self::getTimezoneOptions( $context );
$tzSetting = $tzOffset;
- if ( count( $tz ) > 1 && $tz[0] == 'Offset' ) {
- $minDiff = $tz[1];
- $tzSetting = sprintf( '%+03d:%02d', floor( $minDiff / 60 ), abs( $minDiff ) % 60 );
- } elseif ( count( $tz ) > 1 && $tz[0] == 'ZoneInfo' &&
+ if ( count( $tz ) > 1 && $tz[0] == 'ZoneInfo' &&
!in_array( $tzOffset, HTMLFormField::flattenOptions( $tzOptions ) )
) {
- # Timezone offset can vary with DST
- $userTZ = timezone_open( $tz[2] );
- if ( $userTZ !== false ) {
- $minDiff = floor( timezone_offset_get( $userTZ, date_create( 'now' ) ) / 60 );
+ // Timezone offset can vary with DST
+ try {
+ $userTZ = new DateTimeZone( $tz[2] );
+ $minDiff = floor( $userTZ->getOffset( new DateTime( 'now' ) ) / 60 );
$tzSetting = "ZoneInfo|$minDiff|{$tz[2]}";
+ } catch ( Exception $e ) {
+ // User has an invalid time zone set. Fall back to just using the offset
+ $tz[0] = 'Offset';
}
}
+ if ( count( $tz ) > 1 && $tz[0] == 'Offset' ) {
+ $minDiff = $tz[1];
+ $tzSetting = sprintf( '%+03d:%02d', floor( $minDiff / 60 ), abs( $minDiff ) % 60 );
+ }
$defaultPreferences['timecorrection'] = [
'class' => 'HTMLSelectOrOtherField',
@@ -813,20 +839,7 @@ class Preferences {
]
];
}
- $defaultPreferences['cols'] = [
- 'type' => 'int',
- 'label-message' => 'columns',
- 'section' => 'editing/editor',
- 'min' => 4,
- 'max' => 1000,
- ];
- $defaultPreferences['rows'] = [
- 'type' => 'int',
- 'label-message' => 'rows',
- 'section' => 'editing/editor',
- 'min' => 4,
- 'max' => 1000,
- ];
+
if ( $user->isAllowed( 'minoredit' ) ) {
$defaultPreferences['minordefault'] = [
'type' => 'toggle',
@@ -834,6 +847,7 @@ class Preferences {
'label-message' => 'tog-minordefault',
];
}
+
$defaultPreferences['forceeditsummary'] = [
'type' => 'toggle',
'section' => 'editing/editor',
@@ -952,11 +966,12 @@ class Preferences {
'raw' => [ 'EditWatchlist', 'raw' ],
'clear' => [ 'EditWatchlist', 'clear' ],
];
+ $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
foreach ( $editWatchlistModes as $editWatchlistMode => $mode ) {
// Messages: prefs-editwatchlist-edit, prefs-editwatchlist-raw, prefs-editwatchlist-clear
- $editWatchlistLinks[] = Linker::linkKnown(
+ $editWatchlistLinks[] = $linkRenderer->makeKnownLink(
SpecialPage::getTitleFor( $mode[0], $mode[1] ),
- $context->msg( "prefs-editwatchlist-{$editWatchlistMode}" )->parse()
+ new HtmlArmor( $context->msg( "prefs-editwatchlist-{$editWatchlistMode}" )->parse() )
);
}
@@ -1391,6 +1406,24 @@ class Preferences {
$data = explode( '|', $tz, 3 );
switch ( $data[0] ) {
case 'ZoneInfo':
+ $valid = false;
+
+ if ( count( $data ) === 3 ) {
+ // Make sure this timezone exists
+ try {
+ new DateTimeZone( $data[2] );
+ // If the constructor didn't throw, we know it's valid
+ $valid = true;
+ } catch ( Exception $e ) {
+ // Not a valid timezone
+ }
+ }
+
+ if ( !$valid ) {
+ // If the supplied timezone doesn't exist, fall back to the encoded offset
+ return 'Offset|' . intval( $tz[1] );
+ }
+ return $tz;
case 'System':
return $tz;
default:
@@ -1409,7 +1442,7 @@ class Preferences {
# Max is +14:00 and min is -12:00, see:
# https://en.wikipedia.org/wiki/Timezone
$minDiff = min( $minDiff, 840 ); # 14:00
- $minDiff = max( $minDiff, - 720 ); # -12:00
+ $minDiff = max( $minDiff, -720 ); # -12:00
return 'Offset|' . $minDiff;
}
}