The default timestamp of 00000000000000 cannot represent as timestamp,
because it gets a negative timestamp -00011130000000
This is needed for proper cross-RDBMS support
This reapply a change from I46206e0b3a687dff3168a81cf0020e669133e876,
reverted with I1c8c409b7820512b3e31246a7f3d8c1cf4db209c.
Bug: T244898
Change-Id: I109b783de0a8d60ccb161b280ce5fa09e145017b
Make buttons match the style guide a bit more closely:
* Use bold text
* Add border-radius
* Tweak padding
Change-Id: Idc929f2b7846c71c9a3011376402aaee65b32dcf
This is needed for proper cross-RDBMS support
This reapply a change from I46206e0b3a687dff3168a81cf0020e669133e876,
reverted with I1c8c409b7820512b3e31246a7f3d8c1cf4db209c.
Bug: T244898
Change-Id: I8b1387aff18d88088a993bc099165e9882658ac0
This reverts commit 4eb8fa23e4.
Reason for revert:
Wikimedia\Timestamp\ConvertibleTimestamp::getTimestamp:
The timestamp cannot be represented in the specified format
Bug: T304307
Change-Id: I1c8c409b7820512b3e31246a7f3d8c1cf4db209c
Comments has been duplicating these methods for quite some time for no real reason other than that they're private here.
Duplicating these methods appears to be necessary if and when working with extensions where users can be @mentioned but which are
not implemented as ContentHandler subclasses or otherwise related to regular wikitext pages.
Change-Id: I9c097bab9c5eed8f2399c86897b1f8968126c765
Moved the factory deeper into the code right before the one usage it
still needed a full user object
Narrow done method arguments from User to UserIdentity
and use the identity directly
Change-Id: Ic118f23ef504c7fda892480df61ea68c10915f78
The form UI currently allows selecting Special/Media pages, even though these notifications are not applicable on those pages.
Also:
- Update some comments regarding LoadUserOptions hook
- Remove $titleFactory as MultiTitleFilter doesn't require it any longer
Change-Id: I74f7b0091cb5f47c34a54958656e2bce20a394ec
The section titles are wikitext extracted from inside heading markup
like `== … ==`, so start-of-line markup like `*` should not be parsed.
Bug: T299572
Change-Id: Ie3995b943e5fe20ad86041d6be755f14f32eb01e
$user->saveSettings() happens in AuthManager after the LocalUserCreated
hook finishes running.
Bug: T199393
Change-Id: I1e1826c9f304d7b6c8f3663196a48267a0af0bae
The global function wfWikiID() is deprecated since 1.35 and it's usages
should be replaced with WikiMap::getCurrentWikiId().
Bug: T298059
Change-Id: Ia8cbc992eb80ee6d531cf11bdf2bc06181bce8b0
Replace User::getOption() with UserOptionsLookup::getOption() since this method will be hard-deprecated.
Bug: T296083
Change-Id: I0ecdc63b0344bc4c24196cc5edb3d02b6a7ed615
* Use LinksUpdateComplete instead of the unusual hook
LinksUpdateAfterInsert, which I want to deprecate.
* Fix the fixme regarding revert detection in link events. It's not
pretty but I confirmed that it works with undo and rollback.
Bug: T297011
Change-Id: Ic0092a55e85a3db78db98f1a3dfdce74a7fa2b29
Fixes mapper parsing errors in Logstash because most other producers
generate the response field as an object.
Bug: T239458
Change-Id: I95436dce23efde7f4aa460007187a7544cc36462
If the page is deleted, we won't be able to find it (easily) in
WatchlistChangePresentationModel. Luckily there's support for using
backup data for constructing the title; we just need to pass along the
DBKey and namespace data in the extra params for the event.
Bug: T286192
Change-Id: I8e46de9599a213d9c22ce7bbedefa00528887f59
Without the default the preference is never deleted from the database,
even it was disabled by the user.
Bug: T291748
Change-Id: Id7c79d8e8f0de4f1d3d624a16fc3783fbded7f49
This reverts commit 393aace621.
Reason for revert: namespacing reverted in I1d358d178a3999e82e7a25e17851c3cf60d7ddaa.
Change-Id: If4f7ddf51cbd63dc782e61b389b3f45effc13299
The MWNamespace class has been deprecated in favor of the NamespaceInfo
service. All methods in the MWNamespace should be replaced with the
equivalent methods of the NamespaceInfo service.
Bug: T291389
Change-Id: I396c50c7537b21b2f88dd9433180a8317c5c27f3
explode always returns an array with one item, even for the empty string
Filter out every possible empty string
Change-Id: I0cf0794c0f3e0eedab7e5626e973d8458b28e46a
This extension already depends on MW 1.37, so all these methods exist.
Bug: T254646
Depends-On: I9a90b4f74eb65cd9e20ae9faa6d1949be96543c0
Change-Id: Iebfdd33d3a967c87fbf87382a010a01da5cd4fc8
talk-alert copies the mytalk link but does not disable the icon.
In future this will cause an unexpected icon to appear on the
message bar which is not wanted.
Change-Id: Icd585ad846275a140eb08edf99e1b27257484941
Using 'text' in skins must provide a string,
not a message (see Skin->makeLink)
Avoid also global state by using the SkinTemplate as ContextSource for
the message
Change-Id: Ie736487023d7aeb31cdb1829ba59adeb0ba2b022
It's an attribute, so it is definitely the manager's
responsibility. Unit test case included.
(EchoDataOutputFormatter really calls for becoming a service.)
Change-Id: If2658dd8c107246158cd93cbb233d8af62fd4424
Previously, ApiEchoNotifications returned only events which were
enabled for the `web` notifier type. With this change, the notifier
type or types to consider can be specified by argument to the new
`notifiertypes` parameter.
This change is required so that the apps can request notification
content from the API for push notifications.
Bug: T287909
Change-Id: I2d1155e113f2defb0f02416a7a659c3ee162d3a6
This hook is no longer called in MW 1.36+ by core, and this
extension already requires MW 1.37+
See I5124789fac333a664b73b4b4a1e801ecc0a618ca
Change-Id: I420c2a231cc1c7d6a350a1f04f7c7d4fd942b377
At the moment we support a maximum of 10 tokens per user for subscribing
to push notifications, stored as a basic list that runs out when the
limit is reached. There may, however, be some edge cases where an app
registers a token and then forgets to unregister it (and repeats this 10
times), after which time it will be unable to register any new token.
This changes the token list to behave more like a circular buffer, by
simply deleting the oldest token before inserting the new one. This way
an app could register a new token even in the rare case of forgetting
the previous ten.
Change-Id: I387de63460882e4e56d1aa6db1f78d73a0495208
I believe this is a bug. Individual user's option ($userNotifyTypes)
should not influence the options for all users ($notifyTypes).
This piece of code was first introduced in
I51600bbb26594323831d22bc35d34587ff146d47.
Change-Id: I32d56891ac68e82734813280505b4a57d5427f8c
Some of Echo's subscription user preferences are mapped to existing
user preferences defined in core MediaWiki. However, this special page
was checking the Echo preference names, returning incorrect values.
This affected the edit-user-talk preference and watchlist preferences
(not available with the default configuration).
Change-Id: I2de7553f82434505c000c30a71b9f90c4490482b
On some systems, when they are disabled, checked and unchecked
checkboxes are not that easy to distinguish. They're really bad
for me on Windows (apparently a bit less bad on macOS).
https://phabricator.wikimedia.org/F34567120
OOUI checkboxes are clearer (since they're bigger and the
check icon has higher contrast against the background).
https://phabricator.wikimedia.org/F34567121
Change-Id: I124c7e1874d50d5f3883ffcc5264da46ae012e0a
User::setOption() is deprecated and should be replaced with UserOptionsManager::setOption()
Bug: T277818
Change-Id: I001301fb95635c421a0bbb921fd909c5312dc896
This partially reverts commit 83a181ce9c
and fully reverts 82896eff62
To avoid regressing to the errors from T139665, check if the user
retrieved from RequestContext::getMain()->getUser() is safe to load
instead of $wgUser, still in addition to the other checks that
EchoForeignWikiRequest::$user is safe to load.
Bug: T243732
Change-Id: I22c4918fc7e8b3d1364a95de3958c055059971b8
https://bugs.php.net/bug.php?id=50688 was closed as fixed
in 2017 when PHP 7.0 was only supported upstream.
We already require PHP 7.2.
Change-Id: Ie9801e38915da634e31c91ebdcb61226e0ae5712
Update to 7880cc18, restores ".mw-echo-alert" class on "class" property
instead of on "link-class" property.
Bug: T284496
Change-Id: I11a04fa5a7e9d0b34e62733ee537a43549d13477
If there's exactly one new user talk message, then link directly to it
from the orange banner.
I'm using EchoEventPresentationModel to get the link target, instead
of some more direct way, because this approach allows us to override
the link in DiscussionTools. Together with the changes proposed in
T281590, this would allow linking directly to individual messages (and
highlighting them), rather than just the section.
Bug: T58475
Change-Id: I1fd0e22f4ee0f0dfacaf420d3fd890dce0820cbd
Note: This change would potentially affect all skins including modern
and legacy Vector and others.
The status quo when a talk notification is present is to transform the
talk link into an orange notification message. One option is to leave
the talk link and **add** a notification instead of transforming it.
This will result in two elements #pt-mytalk and #pt-talk-alert
This will interfere with styles targeting #pt-mytalk .mw-echo-alert
This impacts user styles but not anything in production.
Bug: T283811
Change-Id: I3e4be1381f9a2e9986b94b3b13df5ed64d09a59d
Before this commit, setting:
```
$wgVectorConsolidateUserLinks = [
'logged_in' => true
];
```
would result in an orange talk notification that had missing or
incorrect attributes (`#ca-mytalk` instead of `#pt-mytalk` and missing
the `title` and `accesskey` attributes) when visiting modern Vector
with a talk notification visible. The notification's html looked like:
```
<li id="ca-mytalk" class="mw-echo-alert">
<a href="/wiki/User_talk:Newuser5">You have a new Talk page message</a>
</li>
```
The `pt-mytalk` id is important for echo to remove the notification [1].
The title and accesskey are important for accessibility reasons.
This commit corrects that by setting a `link-class`, setting an explicit
`id`, and NOT setting a `class` key. This results in html that is
correct in both modern and legacy Vector:
```
<li id="pt-mytalk">
<a href="/wiki/User_talk:Newuser5" class="mw-echo-alert" title="Your talk page [ctrl-option-n]" accesskey="n">You have a new Talk page message</a>
</li>
```
[1] 67bf58a489/modules/ext.echo.init.js (L172)
Bug: T274428
Change-Id: I5afc74992ad3153ac32df65ccf5fd03b469f05fb
**Note**: This change will affect the order of the yellow talk page
message notification on legacy Vector/other skins by moving it from
after the `#pt-notifications-notice` element to before the
`#pt-notifications-alert` element. This was done because the
notification is related to the list of messages that appear when the
bell icon is clicked so having it in close proximity to that icon is
hopefully more intuitive than having it next to the unrelated inbox
icon. [1]
Per T274428, we need this notification to be inside the `notifications`
array instead of inside the `user-menu` array.
Additionally:
* Per T274428, update the notifications message copy to "You have a new
Talk page message"
* Remove the `onPersonalUrls` hook method inside EchoHooks,
unregister its use as a hook in extension.json, and update its
references in Echo.
[1] T274428#7113896
Bug: T274428
Change-Id: I5ae0ec089bcf0eec1ec7ac13f60e811f54e1d8e1
Thanks to the changes from T254074, the EditResult object passed to
the 'PageSaveComplete' hook now knows whether the edit being saved
is a rollback. We don't need to pass this information from the
'RollbackComplete' hook via globals.
Bug: T277649
Change-Id: Ieef7941e4665204b1a9b2356a58216626ed1f54b
ContentHandler::getContentText() is deprecated and should be
replaced with Content::getText() for TextContent instances.
Change-Id: Ia92c5a41954b1d21deb39dcafabbdff60a414f55
I think the problem the GROUP BY was trying to solve was the potential
for there to be multiple rows with the same (etp_page,etp_event) pair.
There's no unique index to prevent that, and it would cause the event to
be duplicated in the result set. DISTINCT fixes that without generating
an error with sql_mode='ONLY_FULL_GROUP_BY'.
Per https://dev.mysql.com/doc/refman/8.0/en/distinct-optimization.html
DISTINCT is effectively shorthand for a GROUP BY with all the fields.
Bug: T281329
Change-Id: I6a0d578d729c33241a5c5fbd3f4e83f0e5fab83f
Collect event data and allow modification by a hook.
This allows extensions to look at the events generated so far,
add more events, or remove events.
Bug: T276990
Change-Id: I60818d57552946857077dee93b0adb036621b791
$wgEchoNotifications is checked inside EchoEvent::create(). Similar
code (e.g. onRollbackComplete() in this file) does not check it.
Change-Id: I2be05ae182c3fd5d90b87e9579f8c2aa6b79c655
When one of the $wgEnableEmail and $wgEnableUserEmail variables is
false, "Email from other user" option should not be shown in
preferences.
Bug: T266087
Change-Id: I38e439b778d2679967776757d8e0d3b63519612e
Remove using of User:isBlocked since this method will be hard-deprecated. Now it is soft-deprecated
Bug: T276371
Change-Id: Ibcb9071ce2df2733ee5bd87e077b3c0d034d1212
Remove using of User::getCanonicalName since this method will be hard-deprecated. Now it is soft-deprecated
Bug: T275030
Change-Id: Id708800bc709de175bc7c6acc422368a734b00f1
Adds AttributeManager to EchoServices so that dependencies of
AttributeManager can be injected.
Bug: T275148
Change-Id: I4fa5084d72914d16b6d218e7dd3521f5a1919b80
Remove using of User::isIP since this method will be hard-deprecated. Now it is soft-deprecated
Bug: T275602
Change-Id: Ic1749cbad92bfe0eeae40736403fd5ceb6d504e8
ApiEchoUnreadNotificationPages::getUnreadNotificationPagesFromForeign we
sometime erroneous responses from the foreign wiki. We silently ignore
them since d8a4b6ba9, this add logging of the response payload.
Bug: T273479
Signed-off-by: Thiemo Kreuz <thiemo.kreuz@wikimedia.de>
Change-Id: I4dde4e3bb4ff2ea8b7669bb18b2689410e5e7713
…::getUnreadNotificationPagesFromForeign().
I'm not 100% sure if this fixes the code in a way it is
supposed to work. However, I see that getFromForeign() is
called 3 times in existing code, and 2 of these places
already do an isset() check. It looks like it was just
forgotten here.
Even if there is another issue to fix here, this patch:
a) silences the error, and
b) gives us more useful debug output.
Bug: T273479
Change-Id: I257620f646196c0554b9d86c849a02f5a8b9519c
User::getId() is typehinted to return int and so this cast is causing
Phan failure.
Note the method is deprecated but this patch is not meant to fix that.
Change-Id: I3b7ad419d7c28c3ad7144b8005f2fa387af58b0d
Ia1451e3e802441162eecfc5b7f6a7ba2ae72f377 introduced
the notifications content navigation, which allows skins
to choose where they want notifications to be positioned,
rather than requiring them to manually extract them from
the personal tools.
Bug: T266613
Depends-On: Ia1451e3e802441162eecfc5b7f6a7ba2ae72f377
Change-Id: I7badfd9bf9257b2537596e9f2e93248f52e4bd82
isRegistered is part of the slick UserIdentity interface, i.e.
it's the more "canonical" form. This change makes it a bit
easier to move away from using the huge (4000+ LOC) User class
everywhere, in favor of the UserIdentity interface, where
possible.
This patch is meant as a small step towards this goal. I tried
to replace some usages of User type hints already, but prefer
to go in small, incremental steps.
Change-Id: I039c7a18672dfb6ea9507752bce9ea754babd690
These dont work. Timeless provides its own skinStyles for this module:
* Revert "Timeless skinStyles should be additive not replace"
This reverts commit 98d0d296a8.
* Revert "Use skinStyles for deciding where the text-indent should apply"
This reverts commit 8adab78547.
A new implementation in Vector means these are redundant:
* Revert "Item label can now use overflow hidden"
This reverts commit b5dd7baa08.
* Revert "Drop text indent in modern Vector"
This reverts commit 150fc7a16c.
Bug: T264339
Depends-On: I2afc12504d7184583fa8331479125474c68017dc
Change-Id: Ifd0dd5a0479588664b772fb839dbbcd8d7c47320
The following sniffs are failing and were disabled:
* MediaWiki.Commenting.FunctionComment.ObjectTypeHintParam
* MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationPrivate
* MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationProtected
* MediaWiki.Commenting.PropertyDocumentation.MissingVar
* MediaWiki.Usage.ExtendClassUsage.FunctionConfigUsage
Additional changes:
* Dropped .inc files from .phpcs.xml (T200956).
Change-Id: I46e3dacb3da1266ff52d614003ad911feeb7504e
* EchoEvent now supports `extra` params for job delay and deduplication
* When Echo identifies this type of param it creates a
DelayedEchoNotificationJob that will be executed after `delay` seconds
Change-Id: Ib0c6789dfe42e9703a67835909e5932c0054089f
It appears like the initial \h in this non-Unicode regular
expression matches parts of an UTF-8 character, destroying it.
This makes the final preg_match() in this method fail, when
$output is going to be used as a pattern.
Bug: T264922
Change-Id: Iaf240bc2e0808c2f57c1f8bab2589d3207915afe
Since the icon is applied to the link element it is now possible
to apply overflow hidden to the label itself when its wrapped in
a span.
Bug: T264339
Change-Id: Ifdc1d152702c1f5338fd2969cccf07971d622fc7
* DB changes
- Create a table for push topics NameTableStore
- Add a foreign key on subscriptions to normalize push topics
* Implement NameTableStore to normalize topics
* Update DB query joins to include topic from foreignkey
* Adapt code to use IDs instead of the actual topic
Bug: T261756
Change-Id: Ia7589f4a607993352d45b2dd3bcb3867d12d6e97
Creates a new push-subscription-manager group and an associated
right, manage-all-push-subscriptions. The purpose of this is to
allow privileged accounts to purge expired subscriptions from the
database on behalf of other users. A user with this right will be
permitted to delete any subscription from the DB based on the token
alone. For all other users, deletion requests will be limited to
those associated with the requesting user's central ID.
This right will be granted to a bot account on Metawiki associated
with the Wikimedia push notifications service, and the push
notifications service account will make push subscription delete
requests to the API for subscriptions for which vendor APIs return bad
subscription responses.
Additionally, the providertoken parameter to ApiPushSubscriptionDelete
is updated to allow multiple providertoken values.
Bug: T259148
Change-Id: Ia6c17588ee94e6be74e5e3a75eb33e38f172fc93
Adds statsd counters for events and notifications, both overall and by
type. (Events and notifications have a one-to-many relationship, as
notifications may be created for multiple users per event.)
These are specifically of interest to estimate the potential volume of
notifications to be handled by the new push service.
Bug: T260836
Change-Id: I41974cd30a90c674f56003e15d540a5581d19c7d
1) send apns topic when present in subscription metadata
2) check if subscription metadata is a valid JSON string
3) make epp_id column at echo_push_provider table auto_increment,
otherwise it will fail when trying to add a second row in the table
Bug: T259394
Change-Id: I785435e9f2d4ba9c14977d431d271f0fa2d0c795
array_plus (+=) does a union over keys and does not merge
sequential (integer) keys like array_merge. This probably
broke the "do not notify me of seen notifications" feature.
Use cleaner syntax for query building.
Change-Id: Ie0e8d562aec94060c18eed989bb54a9484ccb5d3
Both styles create the exact same object. Casting an array to an
object creates an stdClass object as well. The main benefit of this
syntax is that there is much less repetition. Everything is one
token instead of individual lines, where each line might contain a
typo.
Change-Id: Id43fa2c4b6bd5d9dbc60008427d4a9e14ae3811c
ParserOptions::setTidy() was already a no-op in MW 1.35, and
Echo already requires MW >= 1.35 in extension.json.
ParserOptions::setTidy() was deprecated in MW 1.35 and will be removed
in a future release.
Bug: T198214
Change-Id: I6a5378a42a6cf035296ad549525c25438803970a
Creates a EchoPushMaxSubscriptionsPerUser config setting (default: 0)
that controls the maximum number of subscriptions a user may associate
with the user's central user ID.
The setting is enforced in EchoPush\SubscriptionManager::create().
To allow creating push subscriptions for development, set
$wgEchoPushMaxSubscriptionsPerUser to a positive integer value in
LocalSettings.php:
$wgEchoPushMaxSubscriptionsPerUser = 10;
Bug: T259150
Change-Id: Ib97b6b6cbb8161dd75dad92c54b4fe4fff80c421
PersonalUrls hooks is not meant to be used to add RL modules,
its documentation says it's meant to "alter the user-specific
navigation links (e.g. "my page, * my talk page, my contributions" etc)."
Echo is already using BeforePageDisplay hook to add modules, let's
now register all our modules via that
Bug: T259872
Change-Id: I12616a9947ea0e574287443361e2180c42e48d4b