Commit graph

244 commits

Author SHA1 Message Date
Fomafix cfa04f8c1e Hard deprecate GadgetRepo::singleton and GadgetRepo::setSingleton
The two methodes are deprecated since
I0ab14ca936eec1eead91d4eb0970f898628c8388 included in REL1_42.

Depends-On: Ic3343446b1a41760eb1b8fd1e9ad557abac89639
Depends-On: Iae5cf4c0a0d8fdac7e291fdeb0e7f4e4a78a1d58
Depends-On: I226b259e361d3d27ec89975353fdf6396ba60ccb
Depends-On: Ib405ad79b3c348bed51a8938a6a8f73bd35267d2
Depends-On: I41d1516e185ceb5c49b38361360a3adad1a333de
Change-Id: I5452a46ee5fd85efb3835a108c947950945e91f3
2024-06-30 17:34:27 +00:00
jenkins-bot 6fed9643c8 Merge "Inject services into SpecialGadgets" 2024-06-30 12:02:52 +00:00
Fomafix c2b21d5116 Use service GadgetsRepo instead of deprecated GadgetRepo::singleton()
Change-Id: I1cfe65fa6ec9a10c4d1812b7c5edbe35facf2587
2024-06-29 19:01:18 +00:00
Fomafix b40211a711 Inject services into SpecialGadgets
Change-Id: Icb4dac39a68ec988e95003ed2d7c6718f3bd400c
2024-06-29 18:57:00 +00:00
Umherirrender 0b870852d8 Use namespaced classes
Changes to the use statements done automatically via script
Addition of missing use statement done manually

Change-Id: Idc09b4f3e1ffa40f234b34cd8c0c515bd58ce67b
2024-06-09 11:27:57 +02:00
Timo Tijhof 9349b05a37 Simplify code around injected srvCache/wanCache
Follows-up de999997e7 (I6c7967ef09).

Change-Id: I481331d411b68ed34cfd63b42348ae93d7f59b71
2024-05-27 14:16:51 +01:00
Wandji69 de999997e7 Use ObjectCacheFactory instead of the deprecated ObjectCache methods
Bug: T363770
Change-Id: I6c7967ef092513b1a57bacc4d68b9ee3a50822e8
2024-05-27 12:48:04 +00:00
sbassett f2bc65a518 SECURITY: Improve regular expression performance
* This patch improves the performance of an
  ext:Gadgets regular expression which helps parse
  out sections of the gadgets definition page.

Bug: T363773
Change-Id: Ic9e1a181b261ae4d25e9ce2f91ad12f92e9855d9
2024-05-14 16:07:36 -05:00
jenkins-bot 16d3a0f75d Merge "Replace EditFilterMergedContent hook with ContentHandler override" 2024-05-03 19:50:52 +00:00
jenkins-bot 848a226189 Merge "Drop a few easy to avoid Html::open/closeElement" 2024-04-29 14:07:52 +00:00
thiemowmde 7d1c8336e3 Drop a few easy to avoid Html::open/closeElement
The singular Html::rawElement call does the same but is more robust.

Change-Id: I0dda45dff8b49ce877b57bb88b88f08f6b26ac8b
2024-04-29 12:53:07 +02:00
thiemowmde 65f6500730 Stop using the Xml class in this codebase
Bug: T341779
Change-Id: I40760d002b7075be762fbf0713fdefe73a6e266e
2024-04-29 12:51:42 +02:00
Timo Tijhof d2a37f5f69 Replace EditFilterMergedContent hook with ContentHandler override
The reason for this hook is not the validation itself, because that
is already done by `GadgetDefinitionContent->isValid` which is part
of the core Content interface, already enforced by ContentHandler.

Instead, the hook was here to provide the custom interface message
GadgetDefinitionValidator, because the core Content interface is
limited to boolean isValid(), which provides a very generic error
message.

However, nowadays ContentHandler exposes this mechanism directly
such that we can directly attach a custom message to it without
needing to wait for the stack to reach the EditPage and then override
it after the fact from a global hook.

Also:

* Simplify validation logic towards "is" checks with only an
  expected description.

* Move schema.json file to top-level file.
  It has been unused for as long as it has been in the repo, despite
  appearing (due to its placement) to be used as part of the source.
  It was added, I believe, with the intent to be used by the validator,
  but it isn't. It also isn't validated or checked for correctness
  by anything right now.
  For now, keep it as informal schema in the top-level location for
  easy discovery where perhaps others can find a use for it.
  SD0001 mentions gadget developers may want to start using it for
  Git-maintained gadgets to help with validation in their IDE, after
  Gadgets 2.0 is launched.

Test Plan:
* Set `$wgGadgetsRepo = 'json+definition';`
* Create `MediaWiki:Gadgets/example.json`
* Attempt to save "x" in settings.namespaces item.
* Attempt to save "x.zip" in module.pages item.
* Fails with this patch, similar as on master.

Bug: T31272
Change-Id: I61bc3e40348a0aeb3bd3fa9ca86ccb7b93304095
2024-04-24 19:31:14 +00:00
Umherirrender 1f186a0f2b Change type-hints to IReadableDatabase
Change-Id: Ib77f8f409b48115684396bf920428adb075c2820
2024-04-21 20:48:58 +02:00
Timo Tijhof 6e6f21b385 Replace 'hash' with CACHE_HASH to improve discovery
Bug: T139216
Change-Id: Ifac0701050ca4ca25f1d3e103ce6db8734a2ec77
2024-03-27 12:05:15 -07:00
Timo Tijhof 9c5b7cef9e Improve localisation on Special:Gadgets, minor code cleanups
For each item, either display human-readable and translated text,
or display a technical non-translatable identifier as `<code>`,
with optional localised text in the title attribute.

* Re-format "rights" as a sentence instead of a bullet list. It was
  the only one using a bullet list, which made it feel a bit long.

* Re-format "actions" as `<code>` since they are not localised.

* Re-format "contentModels" as `<code>`, and add the localised display
  name in a title attribute, same as we do with "rights" already.
  ContentHandler::getLocalizedName() is also used already on
  Special:ChangeContentModel.

* Fix "contentModels" to set `needLineBreakAfter = true`, otherwise
  if a gadget also sets "supportsUrlLoad", then that sentence is
  appended to the previous line.

Update phrasing and sorting to be consistent everywhere, and adopt
native PHP types where possible.

In most cases, I made things alphabetical, with the exception of
Special:Gadgets user interface output, and Gadget class methods,
which both follow the order of most recently added feature last
(rights, skins, actions, namespaces, contentmodels, categories).

Highlights:

* Fix namespace IDs type. These can be strings when they are parsed
  from the gadget definition text, not always integers.

* Add explicit default for 'category'. In theory not needed because
  MediaWikiGadgetsDefinitionRepo has a `$section = '';` default, and
  MediaWikiGadgetsJsonRepo uses GadgetDefinitionContentHandler where
  `category: ''` is part of both the initial page content, as well
  as merged via getDefaultMetadata.

  This default benefits simpler test cases, and static analysis,
  since the Gadget class constructor does not (yet) require it.
  Without this, getCategory() could TypeError due to returning null.

Bug: T63007
Change-Id: I3b2c72a6424d520431d03761d23a5a222518ce3d
2024-03-25 15:37:40 -07:00
jenkins-bot 8c5a03862a Merge "hooks: Migrate buildLike to expression builder" 2024-03-17 21:58:35 +00:00
jenkins-bot d6e1510af0 Merge "Add support for categories in definitions" 2024-03-16 22:54:42 +00:00
Sophivorus e2cb01ddcd Add support for categories in definitions
Adds a "categories" option to the gadget definition, which takes a
list of category names. Enabled gadgets will only load when the
viewed page is in one of the required categories.

Bug: T204201
Bug: T63007
Change-Id: I0ced9507bdab6cacd0baf2a331859099f35b73e5
2024-03-16 22:31:03 +00:00
Atieno cd585ee7b3 hooks: Migrate buildLike to expression builder
Bug: T350963
Change-Id: I50303841351fdfe37ee50f25d8f8de38d799d9e0
2024-03-11 13:04:13 +03:00
Umherirrender c5ce0b1a7c build: Upgrade mediawiki/mediawiki-codesniffer to v43.0.0
Change-Id: I36974f572bbf3e7fcd504496769ee7b6b28651b1
2024-03-10 19:23:46 +01:00
thiemowmde 32aa712323 Add missing type hints to untyped …->getService() calls
IDEs can't discover this without the extra type hints.

Bug: T359290
Change-Id: Ibb4462911d04397beabf1884c4f7c90eaa740d3b
2024-03-06 14:50:16 +01:00
thiemowmde ac5db23b17 Add missing function argument to titleWithoutPrefix call
This is the most minimal patch possible to fix the regression. More
can be done in later patches.

Bug: T359290
Change-Id: I9351bdbc2f985e72fb253e424cd7523b73820dcd
2024-03-06 10:25:40 +00:00
Siddharth VP 9d05af9df8 Replace uses of deprecated wfGetDB()
Bug: T357642
Change-Id: I868133bca622ad2af851e874b450fe0be53017d2
2024-03-04 18:39:15 +05:30
Siddharth VP a629d7f71d Introduce MultiGadgetRepo to facilitate repo migration
MultiGadgetRepo is a wrapper around two or more GadgetRepos so that
they can be used at the same, facilitating migration from one repo to
another.

If a gadget appears in both repos, the definition in the first repo
takes precedence, and a warning is shown on Special:Gadgets.

This can be enabled to wrap GadgetDefinitionNamespaceRepo and
MediaWikiGadgetsDefinitionRepo by setting $wgGadgetsRepo to
'json+definition'. In this configuration, once a new JSON definition
exists for the same name, it is used instead of the old one, and the
old one can then safely be removed at a later time in the safe
knowledge that it is no longer used.

Adapted from If3cc5e22e9812d0fd1a9e8e269ea74a7f667dadd

Bug: T140323
Co-authored-by: Kunal Mehta <legoktm@debian.org>
Change-Id: Ibad53629e63ec8713d7a3b84a19838b94600588e
2024-03-02 18:22:04 +00:00
jenkins-bot af3ab84860 Merge "Content: Use DI for GadgetRepo service" 2024-02-24 16:51:09 +00:00
jenkins-bot 88e934c6cb Merge "Goodbye Gadget/Gadget_definition namespaces!" 2024-02-24 16:50:56 +00:00
Bartosz Dziewoński 9cc4ff546e Use OutputPage::setPageTitleMsg() instead of ::setPageTitle()
Bug: T343994
Change-Id: I71d1ffabd3fca96c6a3b2a9f1647edf9e675e332
2024-02-17 02:57:11 +01:00
Timo Tijhof 107428075e Content: Use DI for GadgetRepo service
Change-Id: Idfabb0dfc15bdb9527f7a0018313dc9606cbd715
2024-02-13 13:45:30 +00:00
Timo Tijhof fce6fdfb20 Goodbye Gadget/Gadget_definition namespaces!
== What ==

* Remove the empty Gadget and Gadget_definition namespaces.
* Remove the "gadgets-definition-edit" user right.
* Remove need for custom namespace permissions that previously
  had to extend editsitejs to apply to NS_GADGET.

== Why ==

Simplify the (unused) "GadgetDefinitionNamespaceRepo" backend for
Gadgets 2.0 by making it less radically different from the status quo.

The experimental 2.0 branch will now make use of the "gadget definition"
content model via "MediaWiki:Gadgets/<id>.json" pages, instead of
through a dedicated namespace.

When I first worked the Gadgets 2.0 branch, content models
were not a thing in MediaWiki, and interface-admin wasn't a thing yet
either. Now that we have per-page permissions and per-page content
models, we don't really need a separate namespace.

This follows the principle of least surprise, and fits well with other
interface admin and site configuration tools such as:
- Citoid, MediaWiki:Citoid-template-type-map.json,
- VisualEditor, MediaWiki:Visualeditor-template-tools-definition.json,
- AbuseFilter, MediaWiki:BlockedExternalDomains.json,
- the upcoming "Community Config" initiative.

If/when we develop the SpecialPage GUI for editing gadget definitions,
this can save its data to these pages the same as it would in
any other namespace. Similar to how Special:BlockedExternalDomains
operates on MediaWiki:BlockedExternalDomains.json.

See also bf1d6b3e93 (I6ffd5e9467), which recently removed the
gadgets-edit user right in favour of the editsite{css,js,json} rights.

Change-Id: I5b04ab251552e839087d0a8a6923d205adc7f771
2024-02-13 13:30:26 +00:00
Timo Tijhof a8c3eb1282 Move "gadgets" message to "special-gadgets"
This makes way for "MediaWiki:Gadgets/<id>.json" to be used free of
any confusion or misinterpretation about the subpage being a
translation of "MediaWiki:Gadgets".

Change-Id: Icb68ce6c26a83d7201a97a5406f8752b3c5b0855
2024-02-09 19:10:54 +00:00
jenkins-bot c6b47d5bfd Merge "Follow-Up 27f913cc96: Drop complicated MobileContext injection, now unused" 2024-02-07 18:15:34 +00:00
Reedy 1b2a84aaff Gadget: Bump GADGET_CLASS_VERSION
Bug: T356322
Follows-Up: If6d742ea719e4c8db9d915e8297d915d2150ef50
Change-Id: Id5f60e054304e6a715f0f54d11fd2f467fe4c5c7
2024-01-31 19:37:07 +00:00
James D. Forrester 9d6b0e8206 Follow-Up 27f913cc96: Drop complicated MobileContext injection, now unused
Change-Id: I8b32abd4bcc0b588972c65956d08c4b29bf6b4aa
2024-01-26 12:48:18 -05:00
James D. Forrester 27f913cc96 Drop RL targets definitions from module class, and validation / error code
Bug: T328497
Change-Id: If6d742ea719e4c8db9d915e8297d915d2150ef50
2024-01-24 12:11:20 -05:00
Novem Linguae cc22098a48 Make Special:Gadgets [Edit description] link smaller
To match the style of section [edit] links in articles.

Bug: T344489
Change-Id: Ic3fd864a7b2889ba246418d4a781fd8db29f5ce9
2024-01-18 16:49:16 -08:00
Novem Linguae 5b656b1ee9 SpecialGadgets: refactor
Improve code grouping and comments.

Change-Id: I67fd8081fb5e47bd5a13c85b68433d9a90b67c05
2024-01-18 16:44:43 -08:00
jenkins-bot da62832dde Merge "SpecialGadgets: better variable names" 2024-01-18 23:21:01 +00:00
jenkins-bot 4ca73e1556 Merge "SpecialGadgets: convert Xml class to Html class" 2024-01-17 18:08:04 +00:00
Novem Linguae e62314d4ba SpecialGadgets: fix docblock type mistake
Change-Id: I1716c0c4b74ec34d6b8b69316fb397aa1de3b8bc
2024-01-17 08:02:14 -08:00
Novem Linguae 209c626d66 SpecialGadgets: better variable names
Change-Id: I515d4016a3cb4a9eeb2488a39afa2b5d48a2dc48
2024-01-17 07:59:17 -08:00
Novem Linguae eeb4740fbc SpecialGadgets: convert Xml class to Html class
Change-Id: I8a24789a11ad5f494dc0f9a87642b1b79b40fd3b
2024-01-17 07:50:21 -08:00
jenkins-bot 50d2405a43 Merge "Add validations for skins and rights" 2024-01-11 17:03:15 +00:00
Siddharth VP b944152d3a Add validations for skins and rights
Bug: T298334
Change-Id: If32b334f331845eab6c115f40f8dcf4534028c9c
2024-01-11 10:02:40 +05:30
Timo Tijhof 1448500c2a Avoid global RequestContext in GadgetRep::validationWarnings()
This already returns safe Message objects, which allow Special:Gadgets
to localise it accordingly.

Avoid formatting the list ahead of time with a hardcoded user language,
and instead use Message::listParam() so that the caller controls
the Language object. This makes it safe to use in jobs, CLI, tests,
load.php and elsewhere instead of previously where RequestContext would
cause an exception or use something the caller doesn't control.

Bug: T298334
Change-Id: I77dd3c7fef86b4c8c41837bfb276b019f30baeb0
2024-01-09 21:05:18 +00:00
jenkins-bot cc4efec689 Merge "Avoid persisting default gadget configs in definitions" 2024-01-09 17:27:16 +00:00
jenkins-bot 47c360c47a Merge "Expand pre-save validations for JSON definition pages" 2024-01-09 06:07:27 +00:00
Siddharth VP 41af49e9b5 Expand pre-save validations for JSON definition pages
* Validate that pages have .js, .css or .json suffixes.
* Validate that namespaces are integers, disallowing doubles.
* Validate that type is either general or styles.
* Validate that targets are either desktop or mobile.
* Fix validation of skins: stop allowing `true` as it isn't actually
allowed - it causes an exception in Gadget::isSkinSupported().

Bug: T298334
Change-Id: Ic59c20172f496d281acd59419f5c760ad29ce317
2024-01-08 20:04:12 +00:00
Umherirrender dc84f149bc SpecialGadgetUsage: Fix query for postgres (and improve for mariadb)
The column user_properties.up_value is a text based type in all rdbms.
postgres does not autoconvert strings to numbers, so SUM( up_value )
gives an error when running on postgres.
The use of SUM( up_value ) is also problematic on mariadb/sqlite, as
up_value can be set to any number via the Action API's options module.
This value goes into the sum and produce a wrong result. Using a
non-number value allows to remove the value from the sum and that also
produce a wrong result.

Change the query to exclude the rows which disables a gadget and just
count the "active" ones. Typically there are only rows to disable a
gadget, when the gadget is marked as default, but default gadget are
displayed with the message 'gadgetusage-default' and does not needs to
be counted. In case a gadget was default in the past, there could always
such rows, so be safe and exclude them. That means it is safe to only
count for "active" gadget option usage.
This also allows to remove the up_value condition on the join to
querycachetwo as only rows to enable a gadget are now selected and get
joined to find the active users.

For the join condition use an assoc array, as for database condition the
database class is quoting the value of that array, if that is a string.
In postgres the " is used to quote columns or tables, but not values,
that gives a query error on postgres about the condition.
fixed when using the array style and not "raw" sql.

Define the condition only once as it should be the same for both
queries. Use the new IDatabase::expr function to write that sql piece.

Change-Id: I8dfc3fd5adc4c4bdabceaab20c4b37ffd48e6bee
2024-01-08 18:59:45 +01:00
Umherirrender 1afd0a6e02 Use namespaced classes
This requires 1.42 for some new names

Changes to the use statements done automatically via script
Addition of missing use statement done manually

Change-Id: Iacbea33299995c537a7ef77b524614ad02c6a559
2024-01-06 17:45:07 +01:00