Compare commits

...
Author SHA1 Message Date
yu-i-i e824377bea Minor changes in README.md 2025-04-09 15:31:39 +02:00
yu-i-i 2c934c5bec Track changes / comments: update backend to support frontend changes 2025-04-09 15:31:39 +02:00
yu-i-i 97892dd3ac Allow EXTERNAL_AUTH to be undefined, fixes #26 2025-04-09 15:31:39 +02:00
yu-i-i 9cf606d061 Clarify OIDC redirect URI in README.md (closes #28) 2025-04-09 15:31:39 +02:00
yu-i-i b45e1a0c17 Symbol palette: switch to 'OL' UI components and apply minor cosmetic changes 2025-04-09 15:31:39 +02:00
yu-i-i 4f6e15b306 Clarify OVERLEAF_OIDC_USER_ID_FIELD parameter usage (closes #24) 2025-04-09 15:31:39 +02:00
yu-i-i 683c225c4a Make OVERLEAF_OIDC_USER_ID_FIELD support 'email' as a value 2025-04-09 15:31:38 +02:00
yu-i-i 6f06e85065 See upstream commit 42ee56e 2025-04-09 15:31:38 +02:00
yu-i-i c4f69e4d24 Fix glitches in symbol palette after switching to Bootstrap 5 2025-04-09 15:31:38 +02:00
yu-i-i 40c014800a Whitelist /oidc/login endpoint, fixes #21 2025-04-09 15:31:38 +02:00
yu-i-i d65bd08f6a Update README.md (add ENV variables to control SAML signature validation) 2025-04-09 15:31:38 +02:00
yu-i-i 4af7208d5e Add ENV variables to control SAML signature validation 2025-04-09 15:31:38 +02:00
yu-i-i c6747d2985 Update README.md 2025-04-09 15:31:38 +02:00
yu-i-i e615d96b90 Re-export doLogout (was removed from exports in commit b9fb636). 2025-04-09 15:31:37 +02:00
yu-i-i 3b9dc301a1 Refactor authentication code; add OIDC support 2025-04-09 15:31:37 +02:00
yu-i-i 559abbf34f Allow adding extra flags to LaTeX compiler through environment variable 2025-04-09 15:31:37 +02:00
yu-i-i 8e1c78eb88 Update README.md 2025-04-09 15:31:36 +02:00
yu-i-i 178555ad4f Enable LDAP and SAML authentication support 2025-04-09 15:31:36 +02:00
yu-i-i 2a21801e8f Enable Symbol Palette 2025-04-09 15:31:36 +02:00
yu-i-i c683551e65 Allow selecting a TeX Live image for a project 2025-04-09 15:31:36 +02:00
Sam Van den Vonder 4cfec830b3 Enable Sandboxed Compiles feature 2025-04-09 15:31:36 +02:00
yu-i-i f51f49ec7a Enable autocomplete of reference keys feature 2025-04-09 15:31:35 +02:00
yu-i-i 7e86c8a56a Enable track changes and comments feature 2025-04-09 15:31:35 +02:00
yu-i-i 2ef7738a56 Redirect non-existing links to Overleaf page 2025-04-09 15:31:35 +02:00
ilkin-overleaf 3b5a148cdc Merge pull request #24634 from overleaf/ii-flexible-group-licensing-replace-add-with-purchase
[web] Replace "add" with "buy" in FL

GitOrigin-RevId: 2c9aa50f138306a46ebfd8557d907c6c55d694bc
2025-04-03 08:05:12 +00:00
Domagoj Kriskovic 4e27add5b7 Add AI assist subscription check in WritefullManager (#24428)
* Add AI assist subscription check when updating subscription in WritefullManager

* move AI assist check in WritefullController

GitOrigin-RevId: 0327e1c19e14e554fb707dc1d2840b7147bdf1d1
2025-04-03 08:05:08 +00:00
Domagoj Kriskovic c3e34f8850 Rename editMode to mode in "project-opened" analytics event (#24552)
GitOrigin-RevId: f04d5c3550bed14e9f34067fef5b8e46e56e6c4d
2025-04-03 08:05:03 +00:00
Domagoj Kriskovic f36c87b301 Update share modal dropdown with a description for reviewers in a free project (#24571)
* Update collaborator select dropdown with a description for reviewers in free project

* Update share-project-modal test

* Fix saas-e2e tests

* fix server pro tests

* fix cypress multiple inputs selection

* fix testid case

GitOrigin-RevId: 5369828334596d80988aba168385f0a51eea998f
2025-04-03 08:04:59 +00:00
Domagoj Kriskovic 830d0daa38 Script for removing user enrollment from a subscription (#24627)
* Script for removing user enrollment to a subcription

* Add "release-managed-user"  audit log event for an user id

GitOrigin-RevId: adf2dd97ac82977bcfa07d9a24d1f3c190d095a2
2025-04-03 08:04:54 +00:00
Miguel Serrano fd62142b21 Merge pull request #24397 from overleaf/msm-saml-logs-indexes
[web] Add missing indexes for SAML Logs search

GitOrigin-RevId: 07d994fc6a1b2af7a86e933d0b0c4d4c76370801
2025-04-03 08:04:49 +00:00
Miguel Serrano 6501314616 Merge pull request #24445 from overleaf/msm-saml-identifiers-migration
[web] Update user.samlIdentifiers compound index

GitOrigin-RevId: f14da17fa89c89f0fc75df074b3f6ca04b479efb
2025-04-03 08:04:45 +00:00
ilkin-overleaf fef5ab7255 Merge pull request #24562 from overleaf/ii-bs5-group-settings-tear-down
[web] Group settings BS5 feature flag tear down

GitOrigin-RevId: c83297771dfeeb0426096b3b0765d6c420356d2a
2025-04-02 08:05:14 +00:00
roo hutton 0c6c61b654 Merge pull request #24618 from overleaf/rh-null-pending-reviewer
Handle null readOnly_refs in CollaboratorsHandler

GitOrigin-RevId: b718c4a1b5216a42920909615a0f3c2fe0a16bdb
2025-04-02 08:05:10 +00:00
roo hutton 774292d8ba Merge pull request #24609 from overleaf/rh-bs5-b2c-teardown
Teardown Bootstrap 5 B2C feature flag

GitOrigin-RevId: 4021820bc3b207dae9fffd23dfac778746fa8f20
2025-04-02 08:05:05 +00:00
Brian Gough 6969a12fae Merge pull request #24616 from overleaf/bg-npm-audit-fix
update axios to version 1.8.4

GitOrigin-RevId: 0e7deb1b55b08ad1c1d81fdd2fa96925b514caf7
2025-04-02 08:04:59 +00:00
roo hutton c52b23af57 Merge pull request #24614 from overleaf/rh-pending-reviewer-pull
Set null pendingReviewer_refs to empty array in removeUserFromProject

GitOrigin-RevId: b21dd3f2febdb59dfafb45347960e375daeac463
2025-04-01 08:04:42 +00:00
CloudBuild e08e58485e auto update translation
GitOrigin-RevId: 034ad5d613a28540d777f88c75e7284bc7eb7c3e
2025-03-31 08:05:01 +00:00
ilkin-overleaf b9bc2b01fd Merge pull request #24597 from overleaf/ii-flexible-group-licensing-replace-users-with-licenses-2
[web] FL "licenses" in cost summary preview

GitOrigin-RevId: f6020fe0c5903dc2b1ebb923718525403e5a2fe7
2025-03-31 08:04:57 +00:00
ilkin-overleaf b223bb8da8 Merge pull request #24576 from overleaf/ii-flexible-group-licensing-replace-users-with-licenses
[web] Replace "users" with "licenses" in flexible licensing

GitOrigin-RevId: c262f802c92e7ce82f8dc60badf8e6147c5da4e5
2025-03-31 08:04:50 +00:00
ilkin-overleaf 61ce012fb5 Merge pull request #24430 from overleaf/ii-flexible-group-licensing-tear-down-feature-flag
[web] Tear down flexible group licensing feature flag

GitOrigin-RevId: 181713f1f2371b51cbc4256debea59bbcf3668f3
2025-03-31 08:04:42 +00:00
M Fahru f0fe0db10c [web] Remove unused get_more_compile_time string key because of paywall-cta split test is removed (#24574)
* Re-add missing translation key

* Remove `get_more_compile_time` translation key because of `paywall-cta` is removed

GitOrigin-RevId: bf0fe677adc32a91db57d41d83f0f1e0b2ee3741
2025-03-28 09:04:41 +00:00
Andrew Rumble 93793fe723 Increase default value
GitOrigin-RevId: 6674716042415aaa6b73b4efcf46443c3faab0cc
2025-03-27 14:17:15 +00:00
Andrew Rumble 46f3b595a9 Configure backup RPO for backup-verifier
GitOrigin-RevId: 376c2f18a1e9bef4e77f0ce5999ec7ce5341d481
2025-03-27 14:17:11 +00:00
M Fahru 639690bb50 Merge pull request #24551 from overleaf/mf-remove-fedramp-plans-page
[web] Remove fedramp from group tab in plans page features table

GitOrigin-RevId: fd855ad6ce7bb0d14e970342740a93d4f85ae465
2025-03-27 14:17:07 +00:00
M Fahru 90b6dbdf55 Merge pull request #24530 from overleaf/mf-add-papers-integration-plans-page
[web] Add Papers integration to plans page

GitOrigin-RevId: 72a890fb69417d5a9e8f4146421a3a2ee1716c32
2025-03-27 14:17:03 +00:00
M Fahru 640c699042 Merge pull request #24525 from overleaf/mf-add-learning-menu-navigation
[web] Add new "Resources" menu in our "Help" menu dropdown

GitOrigin-RevId: 9a0e26696d33edaba091abf8fac97fbf051bb6c2
2025-03-27 14:16:59 +00:00
M Fahru ad677afa81 Merge pull request #22705 from overleaf/mf-tear-down-paywall-cta
[web] Tear down `paywall-cta` split test

GitOrigin-RevId: 8cfba819b80bb34f48f8fc1fec37aee6791ef9f0
2025-03-27 14:16:52 +00:00
Eric Mc Sween f46fd6f2d5 Merge pull request #24433 from overleaf/em-pending-reviewers
Support reviewers in the collaborator limit enforcement logic

GitOrigin-RevId: f11a8e37ca6ef36f9894233803c6ee8363bf0ff8
2025-03-27 14:16:48 +00:00
Miguel Serrano 373b222929 Merge pull request #24565 from overleaf/msm-fix-ldap-test
[CE/SP] Fix LDAP e2e tests

GitOrigin-RevId: 536de71f2b4e5b9bd2ae67dbea26d03b794a7a64
2025-03-27 14:16:44 +00:00
Andrew RumbleandBrian Gough 99ab41fd76 Allow scaling in getEndDateForRPO
RPO can now be scaled to allow a little extra grace in certain
circumstances.

Co-authored-by: Brian Gough <brian.gough@overleaf.com>
GitOrigin-RevId: fa60a9ffe966977e396b5645919ddd1451fb1b7a
2025-03-27 14:16:40 +00:00
Andrew Rumble c921c8f586 Monitor backup status in health check
GitOrigin-RevId: 1a90b2fcf85bfa5ec1e5aabcfe4183d406da95e6
2025-03-27 14:16:36 +00:00
Andrew Rumble 4707842642 Add functions for monitoring backup status of db records
GitOrigin-RevId: f0d3564dfd3b38ef9ee451de866c0c05acd0cb20
2025-03-27 14:16:32 +00:00
Andrew Rumble dabf610764 Extract getEndDateForRPO method to utils
This will allow sharing with other functionality.

GitOrigin-RevId: a6e11447180511cc3741ca03f4996ef7ceb45ea5
2025-03-27 14:16:28 +00:00
Miguel Serrano b44dd4d3c5 Merge pull request #24558 from overleaf/msm-ce-rebuild-dockerfile
[CE] Rebuild Dockerfile-base

GitOrigin-RevId: 7fca7fc64a709f7d5d4eccb4b7f9586a78769803
2025-03-27 14:16:17 +00:00
Tim Down 2d4b5e51f1 Merge pull request #24539 from overleaf/td-inactive-project-index-2
Update inactive project deactivation index, second attempt

GitOrigin-RevId: adc16761b001b2aa919b5a61cdbd468b7ad4e26d
2025-03-27 14:16:07 +00:00
Andrew Rumble c55df0e803 Add new index to improve sort speed on hostname search
GitOrigin-RevId: e78c2848a0cfbe6347e57de140512941a68f7f47
2025-03-27 14:15:59 +00:00
Alf Eaton b14490d6aa Avoid setting pendingOpCreatedAt for remote changes (#24542)
GitOrigin-RevId: 5d1684a743825cac23d486678b8f249cf0d152d8
2025-03-27 09:06:02 +00:00
David d67f3d3181 Merge pull request #24442 from overleaf/dp-writefull-parent
Provide writefull with element selectors to insert into

GitOrigin-RevId: 87c9a939f7024e54adfe0b970dddb96b7f56d6b3
2025-03-27 09:05:51 +00:00
Antoine Clausse 2f0254a2c8 [web] Add reCAPTCHA conditions to /user/emails/add-secondary (#24528)
* Add RecaptchaConditions to `user/emails/add-secondary`, set font to 12px

* Hide `RecaptchaConditions` if `ExposedSettings.recaptchaDisabled.addEmail`

GitOrigin-RevId: dcc4609bf8787076257caed6b5a5d1e47178380e
2025-03-27 09:05:47 +00:00
Antoine Clausse fa058a5ca8 Add recaptcha conditions to the add-email form (#24295)
GitOrigin-RevId: 4b90a73edd2435d6c858ccf790827fb3352069e8
2025-03-27 09:05:42 +00:00
Tim Down 25d1b2a24d Merge pull request #24448 from overleaf/td-deleted-users-email-index
Add user email indexes on deletedUsers collection

GitOrigin-RevId: 032b8b189b67b9f491b47438c3b2e0cbfd7b8294
2025-03-27 09:05:38 +00:00
Tim Down 363e426e9f Merge pull request #24536 from overleaf/revert-24444-td-inactive-project-index
Revert "Update inactive project deactivation index"

GitOrigin-RevId: cc6788af5fcb652fdb1eaeefe7f10c5bc1afa910
2025-03-27 09:05:34 +00:00
Tim Down d04cc1d8ac Update inactive project deactivation index (#24444)
* Update inactive project deactivation index

* Delete index first, otherwise Mongo complains that the index already exists with a different name

GitOrigin-RevId: b28a60c0774a77363c4e052ddb64bf68665cccf5
2025-03-27 09:05:22 +00:00
Jakob Ackermann dda94cdfbc [web] ensure that only a single socket.io transport is connected (#24422)
GitOrigin-RevId: 9397b0c85f0a889385d4761945e976ada7aa537b
2025-03-27 09:05:14 +00:00
Alf Eaton e754ee9cb4 Remove unused flush-changes listener (#24449)
GitOrigin-RevId: e22a6677617e1d20f9cd4fce38653d126714a553
2025-03-27 09:05:06 +00:00
Andrew Rumble 7eb5c8a38e Adds deleted filter to docs index
GitOrigin-RevId: bd00fa383946c3a2aa7b03f355aad399bbe9cdca
2025-03-27 09:05:01 +00:00
Miguel Serrano 1ab8302254 Merge pull request #24467 from overleaf/msm-fix-sp-e2e
[CE/SP] e2e fixes

GitOrigin-RevId: 32722dd7d7520e87cd8d8cf6dbdadec73b27caa6
2025-03-26 09:05:36 +00:00
roo hutton 29238e54e3 Merge pull request #24125 from overleaf/rh-current-version-fix
Fix version check for undefined split tests

GitOrigin-RevId: bbbd44a27ca41c5ffac02cb34ac0049a14cd13e4
2025-03-26 09:05:32 +00:00
Eric Mc Sween 20c7f14b3c Merge pull request #24461 from overleaf/em-non-editable-file-in-history
Graceful fallback for getRangesSnapshot()

GitOrigin-RevId: 2f0e70dbcdd38de87d0b1c7590f7d8a5a7112937
2025-03-26 09:05:21 +00:00
Miguel Serrano b480903426 Merge pull request #24381 from overleaf/msm-improve-sync-group-subscription-script
[web] Improve group subscription sync + add missing indexes

GitOrigin-RevId: e7cecd9b8a1978a9e13a165d3f646b98ff7e9394
2025-03-26 09:05:04 +00:00
Miguel Serrano 235f1a5a59 Merge pull request #24329 from overleaf/msm-fix-login-translation-ce-sp
[web] Fix `log_in` default translation in user/pass login

GitOrigin-RevId: 70876652a462b7917d9864e5dccce45ebf3b6d0a
2025-03-26 09:05:00 +00:00
Miguel Serrano d59afb21be Merge pull request #24327 from overleaf/msm-update-max-reconnect-gracefully-interval
[web] Make `maxReconnectGracefullyIntervalMs` configurable

GitOrigin-RevId: 18846b050e76ec86d00bc0dd7e07ab09d552bed7
2025-03-26 09:04:56 +00:00
Jimmy Domagala-Tang 5ba43eb56c Merge pull request #24253 from overleaf/jdt-move-wf-instance-to-context
moving WF to editor context in anticipation for calling functionality…

GitOrigin-RevId: 368554e9308fe8e9e7ef42a4abd78690ec834520
2025-03-25 09:05:21 +00:00
M Fahru 9eb84d6ad5 Merge pull request #24417 from overleaf/mf-implement-stripe-hosted-checkout-split-test
[web] Implement stripe hosted checkout with split test

GitOrigin-RevId: 25e5ff2a46135f402cdf479623ab38c858c5640c
2025-03-25 09:05:16 +00:00
Eric Mc Sween 374acf8119 Merge pull request #24462 from overleaf/em-resync-error
Fix error reporting on resyncs in project-history

GitOrigin-RevId: 9e8a454f746c2b4db7c28fafcd52e50935af5957
2025-03-25 09:05:12 +00:00
CloudBuild ab19677a6c auto update translation
GitOrigin-RevId: 9ba894868c164a34d5420369c798d837a06fd450
2025-03-24 10:51:34 +00:00
CloudBuild e8462f4250 auto update translation
GitOrigin-RevId: d8edcccce86a3892bebf2b4ab2d769275a231325
2025-03-24 10:51:30 +00:00
Eric Mc Sween 1fb94dee18 Merge pull request #24357 from overleaf/em-reviewers-limit
Count reviewers towards the collaborator limit in the backend

GitOrigin-RevId: 352fa37023ffbb032e23a474a81897ca871fee69
2025-03-24 10:51:14 +00:00
Eric Mc Sween e4dae982d2 Merge pull request #24225 from overleaf/em-reviewers-share-modal
Count reviewers towards collaborator limit in share modal

GitOrigin-RevId: 27ec3a787124be7590791412d914ec6da78bab35
2025-03-24 10:51:09 +00:00
Thomas Mees f5c92cb627 Merge pull request #24309 from overleaf/tm-recurly-webhook-ratelimit
Make a new less restrictive ratelimiter for the recurly callback

GitOrigin-RevId: 61bc39110a7ecc6e8f937478a9ccc965b555add5
2025-03-24 10:51:05 +00:00
Alf Eaton bdcf1d3a83 Convert GitHub Sync tests to Cypress (#24228)
* Use OError
* Remove setTimeout stub
* Convert GitHub Sync tests to Cypress
* Use setIgnoringExternalUpdates directly
* Migrate remaining GitHub Sync components to TypeScript

GitOrigin-RevId: 7c8b875b9a7bbf6353d87a5f93c2267d1d4bc65d
2025-03-24 10:51:00 +00:00
Alf Eaton e827540a6d Record an event when the "unsaved doc" alert is displayed (#24431)
GitOrigin-RevId: 87ccdf5a15173afa7548532d72fb1d3e32f255fe
2025-03-24 10:50:56 +00:00
Alf Eaton 7f019d3880 Fix id and labels for compile/image settings (#24439)
GitOrigin-RevId: 5a686afed947bf2da1f90d80f20cb8ba7168a1f5
2025-03-24 10:50:51 +00:00
Miguel Serrano 716fe07e84 Merge pull request #24383 from overleaf/msm-hotfix-5-3-3
[SP/CE] Hotfix 5.3.3 / 4.2.9

GitOrigin-RevId: e377fe7ab83295d0a270f908bde4628928a76775
2025-03-24 10:50:43 +00:00
Eric Mc Sween 0e9c310d1d Merge pull request #24390 from overleaf/em-enforce-content-hash-validation
Enforce content hash validation in history

GitOrigin-RevId: 90de21ea86ddc6548001059c41139a2af5b27060
2025-03-24 10:50:01 +00:00
David 7308ac0e1f Merge pull request #24306 from overleaf/mj-ide-breadcrumbs-loading
[web] Disable breadcrumbs with user setting

GitOrigin-RevId: bcb43aee139a321d9532b9a49e1e73fabba2fd66
2025-03-24 10:49:46 +00:00
David a853a92765 Merge pull request #24350 from overleaf/dp-settings-modal
Implement new editor settings modal options

GitOrigin-RevId: b16358e29f2ebcac6e7f92f1c0196f5911f2e733
2025-03-24 10:49:41 +00:00
Rebeka DekanyandTim Down 562ef81389 Cleanup Bootstrap 3 code in the Account settings page (#24058)
* Remove the Bootstrap 5 version utilities

* Remove Account settings LESS stylesheet and unused styles

* Prefer using the OLFormText wrapper component instead of FormText

* Remove the Bootstrap 3 version stories

* Replace Font Awesome icons to Material icons

* Fix the heading hierarchy

* Cleanup unused translation

* Restore ellipsis to the text of two loading spinners

* Add loading button tests back and add some button loading labels

---------

Co-authored-by: Tim Down <158919+timdown@users.noreply.github.com>
GitOrigin-RevId: 283a9167c8c78bf0fe5062840ded6917dcd6263b
2025-03-24 10:49:33 +00:00
Domagoj Kriskovic 8fe07b196b Fix import path for UpgradeTrackChangesModal in review mode switcher (#24410)
GitOrigin-RevId: 929c85480d253ff5786d99812f4959683f050b52
2025-03-24 10:49:25 +00:00
Domagoj Kriskovic 7f67df2468 Disable track changes for reviewers in free projects (#24368)
* Disable track changes for reviewers in free projects

* cleanup_unused_locales

GitOrigin-RevId: 806ee20c0aed5ef61352041782af620cec72ed70
2025-03-24 10:49:20 +00:00
Domagoj Kriskovic 47fb3a644c Script for generating add-on prices (from recurly) (#24051)
* Script for generating addon prices (from recurly)

* addon code as param

GitOrigin-RevId: b1a45a806c29de56a10532398b56468f9732593f
2025-03-24 10:49:15 +00:00
Liangjun Song e44f892cb0 Merge pull request #24271 from overleaf/ls-script-to-update-manually-billed-users
Scripts to update terms and conditions for manually billed users

GitOrigin-RevId: 5efe43a42c3ed21779c9de698268817e2cbb5249
2025-03-24 10:49:11 +00:00
Domagoj Kriskovic 6932b3deb7 Add AI feature detection to subscription in OAuth user info (#24240)
* Add AI feature detection to subscription in OAuth user info

* remove subscriptionHasAi

GitOrigin-RevId: 73cdbe452cc5c7f5e379d29723978b33cb827762
2025-03-24 10:49:02 +00:00
Andrew Rumble 800b151024 Ensure metrics exist before collecting them
GitOrigin-RevId: 811301ddebb794341dccc0f27954c66dc5c44aa4
2025-03-24 10:48:58 +00:00
Andrew Rumble 47d8e59938 Add code to shutdown message for debugging
GitOrigin-RevId: 1efbda8c82ca1bc160ec4334388fb14259be563c
2025-03-24 10:48:53 +00:00
Andrew Rumble 56f8993bd7 Remove low information log message
GitOrigin-RevId: 8e961d7dea04debe0f459db3b461673618ab7597
2025-03-24 10:48:48 +00:00
Andrew Rumble 432a92173a Perform verification smoothly over time window
GitOrigin-RevId: b00c18a61a5473f3b7353fd5ab1e55f191722ecd
2025-03-24 10:48:44 +00:00
Andrew Rumble 2779691cd9 Add a script for verifying a set of blobs have been backed up
GitOrigin-RevId: 8f7af647ce0ac86ee9800cdf3d386fb78debed7a
2025-03-24 10:48:39 +00:00
Andrew Rumble d2d556ddf6 Allow cached persistor to get size of a blob
GitOrigin-RevId: 7e2c14381cf717c21325917ef4f78acb340a50d9
2025-03-24 10:48:35 +00:00
David 0895b5c6ee Merge pull request #24405 from overleaf/dp-review-panel-new-cleanup
Remove review-panel-new namespacing css class

GitOrigin-RevId: 3a3f62674763d1b6b4b1a69e6a72b676cdd549c0
2025-03-24 10:48:30 +00:00
Tim Down 7168572e74 Merge pull request #24336 from overleaf/td-bs5-migrate-cypress-tests
Migrate some Cypress tests to Bootstrap 5

GitOrigin-RevId: a3de8680046c35f8cc1df8baef60981d8eb52580
2025-03-24 10:48:25 +00:00
Tim Down c2da12939e Merge pull request #24313 from overleaf/td-ac-bs5-frontend-tests
Update front-end tests to use Bootstrap 5

GitOrigin-RevId: abaa09f8c0639d64d6ade97468ab16204e5de97b
2025-03-24 10:48:20 +00:00
Alf Eaton b8d74c6ae0 Remove 'review-panel-redesign' split test and old code (#24235)
GitOrigin-RevId: 1f3d4a9a51429591a82391a9bee3cfdf226bc9c8
2025-03-24 10:48:15 +00:00
Alf Eaton e56c4304a1 Avoid re-rendering sync buttons when code/pdf position changes (#24192)
GitOrigin-RevId: cc17fc15df356bde6a737d6e60479cdc2e421d3e
2025-03-24 10:48:02 +00:00
Alf Eaton 9fd4e4ab87 Display changes as additions when only whitespace content is removed (#24296)
GitOrigin-RevId: b6527e8a1c4a73faeed01538212224349ad70614
2025-03-24 10:47:53 +00:00
Alf Eaton d7cddd14fa Use first root .tex file as fallback main doc when importing from zip (#24302)
GitOrigin-RevId: 51affe14b77aa4f774d5e5f0807f42e07842f807
2025-03-24 10:47:44 +00:00
Alf Eaton 67a6857ca6 Increase the file upload rate limit from 200 to 500 per 15 mins (#24312)
GitOrigin-RevId: e57cc9f8dc12d40ce30eba0ef8067dd3ae72f3ea
2025-03-24 10:47:40 +00:00
M Fahru 57f389646c Merge pull request #24360 from overleaf/mf-initialize-stripe-package-and-keys
[web] Init Stripe packages and keys

GitOrigin-RevId: e707704db6d758a0309f398bfde8900376b5cc67
2025-03-24 10:47:20 +00:00
Jessica Lawshe f3a19f48d8 Merge pull request #24377 from overleaf/jel-xml-crypto-update
[web] Upgrade dependencies of dependencies for `xml-crypto`

GitOrigin-RevId: 004302f7b5a780e3a43c427182e21fb162df8dd1
2025-03-24 10:47:16 +00:00
Domagoj Kriskovic 19852ed180 Update project-joined event to include role, mode, ownerId, and source (#23677)
* Update project-joined event to include role, mode, ownerId, and source

* fix test

GitOrigin-RevId: 67c428a80f5791b69a57b6719ec795399e2a98ef
2025-03-24 10:47:11 +00:00
Domagoj Kriskovic 5a33a51076 Fix font family for edit mode switcher dropdown (#24291)
GitOrigin-RevId: ccefe032da6dcbecdad8e076797c08ceb5776d6c
2025-03-24 10:47:06 +00:00
Tim Down 48e0bc28f8 Merge pull request #24365 from overleaf/td-bs5-misc-clean-up
Remove BS3 code from a couple of places

GitOrigin-RevId: 110a8f4c96a5418da27be11471d2e93bb7e01ee8
2025-03-24 10:47:02 +00:00
Tim Down e98ec386cb Merge pull request #24349 from overleaf/td-bs5-add-secondary-email
Migrate add secondary email page to Bootstrap 5

GitOrigin-RevId: f5d1992f2cb2d313f5950ccfd5c187b9bac72d82
2025-03-24 10:46:57 +00:00
David 9680fd115b Merge pull request #24346 from overleaf/dp-breadcrumbs-flag
Remove remaining direct usage of editor-redesign feature flag

GitOrigin-RevId: c17e377f7e6f7828a77e9620df6e31d1030a98cf
2025-03-24 10:46:52 +00:00
Jakob AckermannandDavid Powell 54f5c3115c [web] convert file-list to typescript (#24354)
* [web] convert file-list to typescript

* [web] add type annotation for clsiServerId without providing default

Co-authored-by: David Powell <david.powell@overleaf.com>

---------

Co-authored-by: David Powell <david.powell@overleaf.com>
GitOrigin-RevId: 5ecb79c2540a3e46e296c6bf7f8573fb65febc3f
2025-03-24 10:46:48 +00:00
Jakob AckermannandMathias Jakobsen 1117ea1b3e [clsi] add helper function for detecting extraneous files (#24376)
* [clsi] add helper function for detecting extraneous files

* [clsi] output.pdfxref and output.synctex.gz are extraneous as well

* [clsi] minor code cleanup

Co-authored-by: Mathias Jakobsen <mathias.jakobsen@overleaf.com>

---------

Co-authored-by: Mathias Jakobsen <mathias.jakobsen@overleaf.com>
GitOrigin-RevId: 0d6c96c99b6be3adaee1558b1f958da885e6307a
2025-03-24 10:46:43 +00:00
Jakob AckermannandEric Mc Sween ff78f687d8 [document-updater] add endpoint for project wide last updated timestamp (#24352)
* [document-updater] fix acceptance test for sending two updates

The Object.create() invocation yields an empty object. The following v
assignment works as expected. The effective update is { v: 43 }.
Processing that fails as no operations were included.

* [document-updater] add endpoint project wide last updated timestamp

* [document-updater] apply review feedback

Co-authored-by: Eric Mc Sween <eric.mcsween@overleaf.com>

---------

Co-authored-by: Eric Mc Sween <eric.mcsween@overleaf.com>
GitOrigin-RevId: 81397537bfd85c2077f19669860b1391c15b34a3
2025-03-24 10:46:38 +00:00
Brian Gough 31b57e2991 Merge pull request #24367 from overleaf/bg-add-new-project-history-flush-script
add new project history flush script

GitOrigin-RevId: 4d6f3be1ada7191334b934e34e1c9eac59a816d0
2025-03-24 10:46:34 +00:00
Jakob Ackermann 8ada51158f [clsi] add support for downloading output files with dot in extension (#24342)
E.g. output.tar.gz

GitOrigin-RevId: d119a41172bb21fb2de429a64b82d05a1efc2375
2025-03-24 10:46:29 +00:00
Jessica Lawshe 6cb5360c88 Merge pull request #24339 from overleaf/jel-xml-crypto
[web] Upgrade `xml-crypto` in web

GitOrigin-RevId: 0fa810d227da9c65031b843958f8b5e796e3adc8
2025-03-24 10:46:24 +00:00
Jakob Ackermann 70601db76f [fetch-utils] export fetchRedirectWithResponse (#24372)
GitOrigin-RevId: 7cd30479fbe70fce68f2d6ef573187fc4f412749
2025-03-24 10:46:19 +00:00
7b69d61540 [saas-e2e] initial revision of SaaS E2E tests running in the dev-env (#24311)
* [saas-e2e] initial revision of SaaS E2E tests running in the dev-env

* [v1] make rubocop happy

* [v1] make rubocop happy

* [saas-e2e] more retries for webpack startup check

Co-authored-by: Alf Eaton <alf.eaton@overleaf.com>

* [web] restrict e2e_test_setup.mjs to running in the dev-env

Co-authored-by: Mathias Jakobsen <mathias.jakobsen@overleaf.com>

* [saas-e2e] import latest split-tests from production

---------

Co-authored-by: Alf Eaton <alf.eaton@overleaf.com>
Co-authored-by: Mathias Jakobsen <mathias.jakobsen@overleaf.com>
GitOrigin-RevId: 034343ee56b8d059090d8a5de74eaac24429b527
2025-03-24 10:46:15 +00:00
Jakob Ackermann 13bf214a3c [web] generate clsi buildId ahead of fetching project content (#24337)
* [web] generate clsi buildId ahead of fetching project content

The buildIds timestamp component will be used for cache invalidation.

* [clsi] strict validation for buildId

* [clsi] validate buildId parameter

GitOrigin-RevId: 88e8b2d48e78fa137b6dca7f2e6b93bbcf88a777
2025-03-24 10:46:02 +00:00
Jakob Ackermann 47ea64c30a [web] operate on shadow-copy of compileResponse.outputFiles (#24330)
GitOrigin-RevId: 49336daf11b2a011d03b7469aa4c0ffed72b279a
2025-03-24 10:45:58 +00:00
Jakob Ackermann e94473a1ce [web] add support for regex based allow-list for skipping captcha (#24266)
* [web] double down on validating email addresses

* [web] normalize emails in captcha middleware

* [web] add support for regex based allow-list for skipping captcha

* [web] skip captcha for trusted users on all actions

GitOrigin-RevId: a994ebf6b74e80f462d2dab1fe5113bbffa676a9
2025-03-24 10:45:53 +00:00
Jakob Ackermann a7818e9b11 [web] update reference to backfill_project_image_name script (#24326)
GitOrigin-RevId: 40a459de2321aa140638d30c5a1d16390c2cdb28
2025-03-24 10:45:48 +00:00
M Fahru f94adbf039 Merge pull request #24244 from overleaf/mf-add-new-stickers-contentful-11march25
[web] Add new stickers in contentful

GitOrigin-RevId: ebb5411e38ffab7bb1dc366de7521d03bad2ab27
2025-03-18 09:06:02 +00:00
M Fahru ec13227fc6 Merge pull request #21520 from overleaf/mf-fedramp-ad
[web][will merge 17 march 2025] Add "FedRamp" advertisement variant to the US Gov banner list with a special rule

GitOrigin-RevId: 86f96c6c108f72b44658dca53d2cecabf0fe9d14
2025-03-18 09:05:58 +00:00
Jakob Ackermann a530cca2c5 [history-v1] increase timeout for preparing test environment (#24345)
GitOrigin-RevId: a11a16f07da61603218ff14bef32172d4f32c469
2025-03-18 09:05:53 +00:00
Brian Gough 0292bc418d Merge pull request #24335 from overleaf/bg-warn-old-pending-changes
add warning for backups outside rpo threshold

GitOrigin-RevId: a8421529ae64693d860b0325961b010a132426da
2025-03-18 09:05:49 +00:00
Jakob Ackermann e99cd74cca [fetch-utils] add fetchRedirectWithResponse (#24341)
GitOrigin-RevId: 9b1e9b02399beea87dbae0f87d1d7d897d145178
2025-03-18 09:05:44 +00:00
David dcabf55882 Merge pull request #24137 from overleaf/mj-ide-permissions-utils
[web] Add switcher for editor redesign

GitOrigin-RevId: 806a1f567027df53f879b564a50aaae9166c8480
2025-03-18 09:05:40 +00:00
Eric Mc Sween 35dc7faab6 Merge pull request #24224 from overleaf/em-resync-on-flush-failure
Immediately attempt a resync when a history flush fails

GitOrigin-RevId: 098a0a7edf55c0ed47c48e0a3c080e3562cdceaa
2025-03-18 09:05:36 +00:00
Tim Down c5b584e3d8 Merge pull request #24165 from overleaf/lg-td-firefox-78-unsupported
Redirect Firefox 78 and lower to unsupported browser page

GitOrigin-RevId: 1da7379c622b3ae61c3309295c769fe293c0e716
2025-03-18 09:05:21 +00:00
Tim Down 09b68de041 Merge pull request #24083 from overleaf/td-bs5-misc-bs3-removal
Remove Bootstrap 3 components in a few places

GitOrigin-RevId: 0380506543b40f3d8d83f2bf6199af28f61ad5af
2025-03-18 09:05:17 +00:00
Tim Down 7c7cc0fce0 Merge pull request #24021 from overleaf/td-social-logos
Update social media logos in footer

GitOrigin-RevId: a9498d7501c6d4c4ce1b76884f0f278dd92d4cf7
2025-03-18 09:05:12 +00:00
Brian Gough 3f7c88108c Merge pull request #24275 from overleaf/bg-fix-pending-change-timestamp
fix pending change timestamp

GitOrigin-RevId: 9297a4b57ea718e6a2e1ca62388919c62911af6c
2025-03-18 09:05:08 +00:00
Andrew Rumble f134746c9c Extend script to allow multiple blobs to be processed from csv
GitOrigin-RevId: ad47eb754436ddc7f56b27ceda627268c3a030a1
2025-03-18 09:05:03 +00:00
Andrew Rumble b5d6484991 Add a script to backup a single blob from a project
GitOrigin-RevId: 464e6d69093b87891497e07d1627cd20e2285380
2025-03-18 09:04:59 +00:00
Andrew Rumble 78481e010e Add verification looper and handle shutdown signals
Shutdown signals become more relevant now that we are looping as we want
to gracefully stop processing records rather than continue looping.

GitOrigin-RevId: dbb499388c86d552d77954988f8fc27d140da3f1
2025-03-18 09:04:54 +00:00
Andrew Rumble 9d72eeeeac Add new strategy to verify_sampled_projects
GitOrigin-RevId: d967da41250bb5945d5b8668b212d4a61b4f9d69
2025-03-18 09:04:50 +00:00
Andrew Rumble f85fdd3a97 Refactor project sampler and add new sampler type
GitOrigin-RevId: 984aa35cef1165e1c8342073b9211a387bd6089e
2025-03-18 09:04:46 +00:00
Jakob AckermannandAlf Eaton f6bd485863 [misc] align initializing of mongodb replica set (#24287)
* [misc] align initializing of mongodb replica set

* [misc] fix volumes for mono container in dev-env

* Remove duplicate volumes key

---------

Co-authored-by: Alf Eaton <alf.eaton@overleaf.com>
GitOrigin-RevId: 0119c42ee8b13a0fca9373e40a27fc5b2a52d73b
2025-03-17 09:04:58 +00:00
Jakob Ackermann 5cdaa424ee [clsi] increase CACHE_AGE for output files to 90 minutes (#24322)
GitOrigin-RevId: d6208281be8d9a97278f7c60e203de68eb3f7501
2025-03-17 09:04:53 +00:00
Jakob Ackermann 0c3a62297a [clsi] collect disk usage more frequently (#24314)
GitOrigin-RevId: 0c5b3ebeadec6d2ac70b7adc77935aa0cea92ffc
2025-03-17 09:04:49 +00:00
CloudBuild a097577e29 auto update translation
GitOrigin-RevId: 3fa7f5bc4f52ddec1c55f0409bc930be1e522971
2025-03-17 09:04:44 +00:00
Jakob Ackermann f7e716c826 [clsi] add metric for disk usage (#24303)
GitOrigin-RevId: e21b867a2fdaf54e9ec5b29b0f80b29349eb901c
2025-03-14 09:05:23 +00:00
Thomas Mees 84996ea88c Implement checks for user eligibility when switching plans (#24276)
* Convert updateSubscription controller to async/await

* Move updateSubscription to subscription module

* Validate if user is eligible to change plan

GitOrigin-RevId: ce538429cd5a3b93acabdc046f1a8b164ac02301
2025-03-14 09:05:19 +00:00
Mathias Jakobsen e6371ec197 Merge pull request #24260 from overleaf/mj-ide-rail-selected-states
[web] Editor redesign: Update selected state for rail tabs

GitOrigin-RevId: 4ce868c62a53355f8271db32884db0b2ed985d60
2025-03-14 09:05:00 +00:00
Mathias Jakobsen 971c63a636 Merge pull request #24258 from overleaf/mj-ide-dark-mode-readonly-file
[web] Specify text color of readonly files

GitOrigin-RevId: c7395f4b693c9b413d60e0aba20cc78ea72efd86
2025-03-14 09:04:54 +00:00
Mathias Jakobsen 5a67353dc3 [web] Editor redesign: Add actions to project name dropdown (#24220)
GitOrigin-RevId: 04f4abdc529a0494c70b0e3d14847b0cf452b80d
2025-03-14 09:04:40 +00:00
Jakob Ackermann eaefecb91d [server-pro] TeXLive 2025 has been released (#24285)
* [server-pro] TeXLive 2025 has been released

* [server-ce] bump copyright year in README

GitOrigin-RevId: ece909181b96f25250559cf387c19cd87bb48097
2025-03-13 09:06:48 +00:00
Jakob Ackermann 8d569815e6 [real-time] only log userId from session (#24281)
While we are at it, log projectId and transport.

GitOrigin-RevId: ac10220247947e0050f1374c81091c50c8cc0e85
2025-03-13 09:06:44 +00:00
Brian Gough 2d48c86e61 Merge pull request #24269 from overleaf/bg-backup-replication-smoothing
extend backup scheduler to delay jobs for load levelling

GitOrigin-RevId: be62c458d3be464bf80ca590fcc107c2760aa061
2025-03-13 09:06:28 +00:00
Brian Gough a178c0f400 Merge pull request #24268 from overleaf/bg-backup-replication-lag-metrics
add backup replication metrics

GitOrigin-RevId: a734435e3c6ce56350b2286bd218a5e2324d93a9
2025-03-13 09:06:24 +00:00
Brian Gough cf105cf01d Merge pull request #24267 from overleaf/bg-fix-init-option
update backup script to use index when finding uninitialised projects

GitOrigin-RevId: 04ce0654b3d42de1c1a9bb542482c2dd53540628
2025-03-13 09:06:20 +00:00
Brian Gough 3b93efdf5c Merge pull request #24256 from overleaf/bg-backup-fix-sample
fix backup sample script

GitOrigin-RevId: 4bf4c15324d9b3b7ebd809f7b212e52d75ab216d
2025-03-13 09:06:16 +00:00
Alf Eaton 28ff69b51b Revert "Check for changed files since last merge in GitHub Sync modal (#24180)" (#24273)
This reverts commit 4cd55e1501648f0a18b77be5af19deb0773d6881.

GitOrigin-RevId: 132eead97e924037c2fd17fd636a769ef95f4cc1
2025-03-13 09:06:06 +00:00
Alf Eaton 4ddd3ee772 Check for changed files since last merge in GitHub Sync modal (#24180)
GitOrigin-RevId: 4cd55e1501648f0a18b77be5af19deb0773d6881
2025-03-13 09:06:02 +00:00
Andrew Rumble 92499f6260 Revert "Revert "Add a metric so that we can know maint is prevented""
This reverts commit b3c4e7181b5f6f52178e165f6220c485e8e97caf.

GitOrigin-RevId: d5525bbe5cb1546cdff8e201de04762a8d86e332
2025-03-13 09:05:59 +00:00
Jakob Ackermann 3d9bc77fce [misc] compress in ssl_proxy instead of webpack-dev-server (#24263)
GitOrigin-RevId: 200cf9c49a68412591a359f46f0d1d900e303520
2025-03-13 09:05:52 +00:00
Christopher Hoskin c3ade4dce1 Merge pull request #24070 from overleaf/csh-fix-check_institution_users
Allow higher timeouts

GitOrigin-RevId: 8b762cab7cf1420cec732ea592a8075e96b9a5f8
2025-03-13 09:05:45 +00:00
Miguel Serrano 9470c3a44b Merge pull request #23790 from overleaf/msm-base-image-update
[CE] Trigger CE `Dockerfile-base` build

GitOrigin-RevId: b96b8b2d612b5b0a4079b9fafd6cf3c071c6ab8d
2025-03-13 09:05:35 +00:00
Miguel Serrano 89b4eaf391 Merge pull request #24130 from overleaf/msm-proxy-agent-learn
[web] Add `https-proxy-agent` for learn wiki

GitOrigin-RevId: 215f0f3ad5254b0620692c1cc4c90b50bdf1d4ef
2025-03-13 09:05:31 +00:00
Miguel Serrano 79dcab4ef5 Merge pull request #24231 from overleaf/msm-fix-separator-footer
[web] Fix separator in thin-footer

GitOrigin-RevId: 8b5700ea7998e9fe451dded10321757ee5fa47a6
2025-03-13 09:05:27 +00:00
David 542a52c510 Merge pull request #24210 from overleaf/mj-nested-menu-bar
[web] Editor redesign: Make menu bar nestable

GitOrigin-RevId: 5c08126499ff96494d6af9adcbd75126ddd596af
2025-03-13 09:05:23 +00:00
David 10b0d6333f Merge pull request #24177 from overleaf/mj-ide-symbol-palette
[web] Editor redesign: Add symbol palette

GitOrigin-RevId: c9c1e15adef86023b18a6d6efea854777fa4fb11
2025-03-13 09:05:19 +00:00
David 1fcf046c81 Merge pull request #24133 from overleaf/mj-ide-selected-colors
[web] Editor redesign: Update selected states

GitOrigin-RevId: a43f4504c14c536850ce97c6259bf5d4d67b5418
2025-03-13 09:05:15 +00:00
David cc72d8b11b Merge pull request #24171 from overleaf/mj-ide-dark-mode-premium
[web] Editor redesign: Fix color of premium badge in dark mode

GitOrigin-RevId: 6a49ec99a2e339635c1e2f7a732a4a1176bdd8f4
2025-03-13 09:05:11 +00:00
David c4493ebc90 Merge pull request #24197 from overleaf/mj-ide-dark-color-scheme
[web] Editor redesign: Set color-scheme to dark in dark mode

GitOrigin-RevId: 6d62288e4ec9737629ed2e7a78865c6017ccea59
2025-03-13 09:05:07 +00:00
David 3d9b1bb177 Merge pull request #23914 from overleaf/dp-history
Add existing history view into new editor

GitOrigin-RevId: 0d35ba1f38dafd8a71087f231f2cddc1b0424401
2025-03-13 09:05:03 +00:00
David ea33c7d896 Merge pull request #24233 from overleaf/dp-dark-breadcrumbs
Add dark mode for breadcrumbs

GitOrigin-RevId: f1425a1da514f74854fd7afe176e27e2b62dae9c
2025-03-13 09:04:59 +00:00
Andrew Rumble 768180c456 Handle errors during startup
GitOrigin-RevId: ba8e5964e78439b0ea3650191f5ea9c9e22f2b50
2025-03-13 09:04:55 +00:00
Andrew Rumble dad6f97cce Load global blobs when starting backup-verifier
GitOrigin-RevId: 31aa2a3639f8d9a69b5b98f27aff17b98bd14694
2025-03-13 09:04:51 +00:00
Andrew Rumble 273ae4aecd Split healthCheck out into separate module
GitOrigin-RevId: 847d00b696fe6d82f4bd5fea8f9130437c68e7b2
2025-03-13 09:04:47 +00:00
Andrew RumbleandJakob Ackermann b5f8bfa28e Switch health check to use projects instead of blobs
Co-authored-by: Jakob Ackermann <jakob.ackermann@overleaf.com>
GitOrigin-RevId: db1a1c8ce5968e558b0754e5e0da50af89fd80db
2025-03-13 09:04:43 +00:00
Antoine Clausse 959562661f [web] Make Bootstrap 5 the default for new pages (#24079)
* Update layout-base.pug to treat missing `bootstrap5PageStatus` as enabled

* Set `bootstrap5PageStatus = 'disabled'` everywhere it's undefined

I found the files with `find . -name "*.pug" -type f -exec grep -l "block content" {} \; | xargs grep -L "bootstrap5PageStatus\|layout-website-redesign-boo
                        tstrap-5\|layout-website-redesign-cms-bootstrap-5" | sort`

GitOrigin-RevId: 8ecf2eedea032d96e4fba078fb0316a7a311b08a
2025-03-12 09:06:50 +00:00
Jimmy Domagala-Tang 80abd0ac2c Merge pull request #23972 from overleaf/jdt-grant-assist-via-wf-set-trait
enable granting of premium error assist based on WF entitlement to bu…

GitOrigin-RevId: 9d21cf8755c881bdc698c0cf9891076ecefd34eb
2025-03-12 09:06:42 +00:00
Andrew Rumble 19eefebe95 Revert "Switch health check to use projects instead of blobs"
This reverts commit c318b70397ed5e2fcbb07fa019412b56844260ef.

GitOrigin-RevId: 087ae9d21be83bf3dae47c4e6d27eb4e74f387df
2025-03-12 09:06:34 +00:00
Andrew Rumble 087a9daf34 Revert "Split healthCheck out into separate module"
This reverts commit 96061812977d5c854e494cd44163b16a96722b17.

GitOrigin-RevId: f30a185b65a4f1346ed13fa0c6e9ea0852d44335
2025-03-12 09:06:30 +00:00
Andrew Rumble a7be1f3430 Split healthCheck out into separate module
GitOrigin-RevId: 96061812977d5c854e494cd44163b16a96722b17
2025-03-12 09:06:22 +00:00
Andrew RumbleandJakob Ackermann c373db4f86 Switch health check to use projects instead of blobs
Co-authored-by: Jakob Ackermann <jakob.ackermann@overleaf.com>
GitOrigin-RevId: c318b70397ed5e2fcbb07fa019412b56844260ef
2025-03-12 09:06:18 +00:00
Jessica Lawshe 3bc21faeaf Merge pull request #23088 from overleaf/jel-managed-users-enroll
[web] Show message instead of enrollment form when already managed

GitOrigin-RevId: ffa9dfd8af17ee3128df15d4027a66b96f2c8b0d
2025-03-12 09:06:03 +00:00
Jessica Lawshe f9515f10cd Merge pull request #24191 from overleaf/jel-latexqc-bootstrap
[latexqc] Remove `react-bootstrap` and upgrade to `bootstrap` 5

GitOrigin-RevId: 39d9a12121d34e3844a8e80a50bc6d3bc73c1808
2025-03-12 09:05:59 +00:00
Andrew Rumble 0b387c5116 Simplify error identification
GitOrigin-RevId: 6dae1ed99269deb26e15ec921ba173f85f5e6fc9
2025-03-12 09:05:48 +00:00
Andrew Rumble 149b590413 Fix script name in usage prompt
GitOrigin-RevId: ab4ed7479c96d3d1db82b23ef3c883706c61995e
2025-03-12 09:05:44 +00:00
Andrew Rumble 282f5f92ff Ensure global blobs are loaded before verifying
GitOrigin-RevId: 3f78c44e6b4d98fd6c469b0f4fbacc033b0a0868
2025-03-12 09:05:39 +00:00
Andrew Rumble afedce1b0e Add script for verifying sampled sets of projects
GitOrigin-RevId: 23a599ea269a528201c67cda66bd2d00c0d376e4
2025-03-12 09:05:35 +00:00
Andrew Rumble 061d67ee4b Emit more specific errors from backupVerifier
GitOrigin-RevId: 99475608f096be3e35fbaaf1825b99d145ea86f3
2025-03-12 09:05:31 +00:00
Andrew Rumble 36056e75d7 Improve chunk loading in backupVerifier
Brings the process closer to history_store.

We can't use the backup history_store because the keys are generated
differently for chunks than the standard history_store way of doing it.

GitOrigin-RevId: 07adfc0531f6ec0f38bb70ea0fe8ae0d41f508cc
2025-03-12 09:05:26 +00:00
Andrew Rumble d04bfbcdea Add promiseMapSettledWithLimit utility
GitOrigin-RevId: e34102de17f28e43deb383d630088c6e753e2ec1
2025-03-12 09:05:22 +00:00
Alf Eaton ecc2f1f544 Merge pull request #24196 from overleaf/ae-fetch-data-access
Avoid fetching unavailable project data

GitOrigin-RevId: 58fd58f098af5e3eb000e31f22b403d3e28ef691
2025-03-12 09:05:18 +00:00
Alf Eaton a11266471c Merge pull request #22661 from overleaf/ae-remove-client-opentelemetry
Remove OpenTelemetry from the web frontend

GitOrigin-RevId: fc81052724afd7f62c44e17de3adffbb7c1a62c2
2025-03-12 09:05:13 +00:00
Andrew Rumble 302362c70d Return a NotFoundError when filestore disabled
GitOrigin-RevId: b470d75fc621e2e52180cf923d0ee818f4ec4cb2
2025-03-12 09:05:09 +00:00
Brian Gough efd53e567c Merge pull request #24237 from overleaf/bg-fix-backup-worker
fixes for backup worker

GitOrigin-RevId: 79c99e5b2d99d1b0298f69d968e0e2cb89281dd6
2025-03-12 09:05:04 +00:00
Andrew Rumble 0002e008bb Revert "Add a metric so that we can know maint is prevented"
This reverts commit a4df6ce7f22df01e1116ae9dbf5c7c7afc73c388.

GitOrigin-RevId: b3c4e7181b5f6f52178e165f6220c485e8e97caf
2025-03-12 09:04:57 +00:00
ilkin-overleaf 96af83a4ed Merge pull request #24138 from overleaf/ii-flexible-licensing-colombian-pesos
[web] Recurly subtotal limit on flexible licensing

GitOrigin-RevId: 302fb15dcc360e3b47674e8e776ffa115af6cbe6
2025-03-12 09:04:52 +00:00
Andrew Rumble 00aa26cd1a Add a metric so that we can know maint is prevented
GitOrigin-RevId: a4df6ce7f22df01e1116ae9dbf5c7c7afc73c388
2025-03-12 09:04:48 +00:00
Brian Gough 3cad54b215 Merge pull request #24186 from overleaf/bg-backup-index-on-missing-lastBackedUpVersion
add a mongo index to find projects which are not backed up

GitOrigin-RevId: d776ebac2bef348117dc87556156e4682ac1b3e3
2025-03-11 09:06:47 +00:00
Brian Gough a04d3198a8 Merge pull request #24181 from overleaf/bg-Project-Audit-Log-Transfer-ownership-is-missing-the-IP-address
add missing ip adress to audit log for transfer ownership

GitOrigin-RevId: c14494efce25efa92a6cd81bcf197d8f897571bb
2025-03-11 09:06:43 +00:00
CloudBuild aaa15a2733 auto update translation
GitOrigin-RevId: 9617a83b396ecec5c4b8a50a858db49257326027
2025-03-11 09:06:26 +00:00
M Fahru cae698b705 Merge pull request #23994 from overleaf/mf-20-millions-update-user-count
[web] Update user count to 20 millions

GitOrigin-RevId: 768b08b70cdbcff0435897f7cf518de3dff80f55
2025-03-11 09:06:12 +00:00
Brian Gough c233243948 Merge pull request #24200 from overleaf/bg-backup-queue-pending-jobs
fix backup worker and backup scheduler to handle pending projects

GitOrigin-RevId: a97e011615666b3ae2b8fafe26a96d41b3609edd
2025-03-11 09:06:05 +00:00
Andrew Rumble f045361b49 Merge pull request #24205 from overleaf/ar-log-additional-information-when-getting-a-file-from-filestore
[web] Gather information about files with no hash

GitOrigin-RevId: 7f509c13f14902a40ae39bf1889103274de23040
2025-03-11 09:06:01 +00:00
Andrew Rumble 441c7a89a7 Merge pull request #24204 from overleaf/ar-jpa-add-chunk-verification
[history-v1] add chunk verification

GitOrigin-RevId: 7208ad20872386813bb1c6946283afddb5e8b1cf
2025-03-11 09:05:57 +00:00
Davinder Singh 7ec4cbd841 Merge pull request #24164 from overleaf/ds-group-discount-10-percent-february
Group plans - Reintroduce 10% discount for group plans (Part 1, 2 & 3 Combined)

GitOrigin-RevId: f3a59a65bbd300cc06f70e179e794c32ed7970ce
2025-03-11 09:05:50 +00:00
Eric Mc Sween 1ea577ef12 Merge pull request #24154 from overleaf/em-bs5-subscription-preview
Migrate the subscription change preview page to BS5

GitOrigin-RevId: beb398ef3a81be1b8d35536c524af6c110ea1b3d
2025-03-11 09:05:46 +00:00
Alf Eaton eedf5367fc Store/update entity sha after importing from GitHub (#23935)
* Refactor WebApiManager
* Store/update entity sha after importing

GitOrigin-RevId: 604bf3b8010140355c21afca01a54237a301eb92
2025-03-11 09:05:42 +00:00
Alf Eaton fe4f41501f Parse labels from environment options (#24189)
GitOrigin-RevId: e51eed7521f6e32e614f8b38092a0b0219f7f186
2025-03-11 09:05:31 +00:00
Mathias Jakobsen f11ad91249 Merge pull request #24201 from overleaf/mj-fix-ce-contact
[web] Import contact us modal via macro

GitOrigin-RevId: 6d8a14c33fb158a38413d32036b17dd4b3debdd9
2025-03-11 09:05:24 +00:00
ilkin-overleaf 1c4a761478 Merge pull request #24057 from overleaf/ii-group-management-improvements
[web] Group management improvements

GitOrigin-RevId: 01826bf37fa8d5e06595f660ccb42a8df00b63ae
2025-03-11 09:05:20 +00:00
ilkin-overleaf c3c14ccfbc Merge pull request #24028 from overleaf/ii-bs5-group-settings
[web] BS5 group settings

GitOrigin-RevId: d4f0a16c653548bee66a65a5a5db056c8cc09666
2025-03-11 09:05:16 +00:00
David 9824151e62 Merge pull request #24033 from overleaf/mj-rail-dropdown
[web] Editor redesign: Add help dropdown to rail

GitOrigin-RevId: 052ba1852a8e2702fe1671c4613d986b9b0c91c2
2025-03-11 09:05:12 +00:00
David d7ad742ba3 Merge pull request #23747 from overleaf/dp-breadcrumbs
Add file breadcrumbs to new editor

GitOrigin-RevId: 54bde446ad632976503a2c4aff915c862bad710e
2025-03-11 09:05:08 +00:00
Jakob AckermannandDr. Sasha Göbbels 087c41190e [web] switch query for hard-deleting users and add index (#22920)
* [web] switch query for hard-deleting users and add index

Co-authored-by: Dr. Sasha Göbbels <sasha.goebbels@overleaf.com>

* [web] fix unit tests

---------

Co-authored-by: Dr. Sasha Göbbels <sasha.goebbels@overleaf.com>
GitOrigin-RevId: a7fd2a590351d2e0d60c0032ca78d457ef815e41
2025-03-11 09:05:04 +00:00
Rebeka Dekany 69bc8a135b Bootstrap 3 cleanup from the IDE page - #2 (#24175)
* Remove skipLoadingStyleSheet

* Remove unused bootstrap-5 assignment from the Account settings page since it's archived

* Remove bsVersionIcon

* Remove bsVersion, bootstrapVersion and isBootstrap5 from elements on the IDE page

* Remove BS3Dropdown from the context menu

* Cleanup Bootstrap 3 related comment and type

GitOrigin-RevId: a67244eb78943ee84cc5f89bae164c0361e8fc13
2025-03-11 09:05:00 +00:00
CloudBuild 6a344c7a52 auto update translation
GitOrigin-RevId: 037a91f43519537e0dc572771f8cbe92659d61df
2025-03-10 09:05:31 +00:00
CloudBuild b5031fdee5 auto update translation
GitOrigin-RevId: ba3022ee74dee8356611c970a9cd880930023d34
2025-03-10 09:05:27 +00:00
Brian Gough 15e5501ddd Merge pull request #23119 from overleaf/bg-issue23112
Add script to SP/CE to export user projects

GitOrigin-RevId: d8a5af638ccc2376ce2af25ef00904be5aa682e3
2025-03-10 09:05:23 +00:00
Rebeka Dekany 5974eed4aa Upgrade Storybook to 8.4.7 (#24144)
GitOrigin-RevId: df469e5d4123f0a4704a8670896ad29797f0f92b
2025-03-10 09:05:19 +00:00
Brian Gough 8a4c84e7dd Merge pull request #24131 from overleaf/bg-disable-call-to-filestore-in-project-deleter
disable call to filestore in project deleter

GitOrigin-RevId: 07d9d3b33220e33abfa18a5f54e56e2b8d544e8d
2025-03-10 09:05:15 +00:00
Antoine ClausseandJakob Ackermann c4e6dfbbbd [web] Use 6-digits code to confirm existing email in Account Settings (#23931)
* Rename `checkSecondaryEmailConfirmationCode` to `checkAddSecondaryEmailConfirmationCode`

* Create function `sendCodeAndStoreInSession`

* Create function `sendExistingSecondaryEmailConfirmationCode`

* Create function `_checkConfirmationCode`

* Create function `checkExistingEmailConfirmationCode`

* Rename `resendSecondaryEmailConfirmationCode` to `resendAddSecondaryEmailConfirmationCode`

* Create function `_resendConfirmationCode`

* Create function `resendExistingSecondaryEmailConfirmationCode`

* Add `ResendConfirmationCodeModal`

* Remove `ResendConfirmationEmailButton`

* `bin/run web npm run extract-translations`

* Update frontend test

* Fix: don't throw on render when send-confirmation-code fails!

* Update phrasing in the UI

Per https://docs.google.com/document/d/1PE1vlZWQN--PjmXpyHR9rV2YPd7OIPIsUbnZaHj0cDI/edit?usp=sharing

* Add unit test

* Don't share the "send-confirmation" and "resend-confirmation" rate-limits

* Update frontend test after copy change

* Rename `checkAddSecondaryEmailConfirmationCode` to `checkNewSecondaryEmailConfirmationCode` and `resendAddSecondaryEmailConfirmationCode` to `resendNewSecondaryEmailConfirmationCode`

* Rename `cb` to `beforeConfirmEmail`

Co-authored-by: Jakob Ackermann <jakob.ackermann@overleaf.com>

* Return `422` on missing session data

Co-authored-by: Jakob Ackermann <jakob.ackermann@overleaf.com>

* Add `userId` to log

* Replace `isSecondary` param by `welcomeUser`

Co-authored-by: Jakob Ackermann <jakob.ackermann@overleaf.com>

* Rename `resend-confirm-email-code`'s `existingEmail` to `email`

* Remove "secondary" from rate-limiters

Co-authored-by: Jakob Ackermann <jakob.ackermann@overleaf.com>

* Remove unnecessary `userId` check behind `AuthenticationController.requireLogin()`

* Only open the modal if the code was sent successfully

---------

Co-authored-by: Jakob Ackermann <jakob.ackermann@overleaf.com>
GitOrigin-RevId: df892064641d9f722785699777383b2d863124e1
2025-03-07 09:06:50 +00:00
Davinder Singh e52f3543a7 Merge pull request #24149 from overleaf/ds-revert-of-discount-pr
Revert "Group plans - Reintroduce 10% discount for group plans (part 1)"

GitOrigin-RevId: b3ed4fa969df49c35e9119241161dabeeb66ce61
2025-03-07 09:06:39 +00:00
Davinder Singh 37dc516ea2 Merge pull request #24148 from overleaf/revert-24066-ds-group-discount-2
Revert "Group plans - Reintroduce 10% discount for group plans (part 2)"

GitOrigin-RevId: 2d8a8d117222daa997e4d0632a9e7235559a8b8c
2025-03-07 09:06:35 +00:00
Davinder Singh 6dce566595 Merge pull request #24147 from overleaf/revert-24096-ds-group-discount-3
Revert "Group plans - Reintroduce 10% discount for group plans (part 3)"

GitOrigin-RevId: e763fff88109ff57e897173e287415baed6fc81c
2025-03-07 09:06:30 +00:00
Brian Gough 9ff3a45690 Merge pull request #24142 from overleaf/bg-backup-fix-blob-error-handling
fix bug which caused errors to be ignored when backing up blobs

GitOrigin-RevId: 64674a484a6e22493cba8f8e47d4671072dc2e9a
2025-03-07 09:06:26 +00:00
Brian Gough 281168fd52 Merge pull request #24080 from overleaf/bg-serialise-backup-initialisation
fix backup initialization to avoid incorrect use of batchedUpdate

GitOrigin-RevId: 6984f3510c6b03b3dfda35efea8173f848e58eff
2025-03-07 09:06:22 +00:00
Brian Gough 154de1a0f9 Merge pull request #24102 from overleaf/bg-backup-stats-script
add backup sampling script

GitOrigin-RevId: cfd546d421cdcfb9f8ad2111703a437a7272bd54
2025-03-07 09:06:17 +00:00
Davinder Singh 4e8d718609 Merge pull request #24096 from overleaf/ds-group-discount-3
Group plans - Reintroduce 10% discount for group plans (part 3)

GitOrigin-RevId: bd3b834c86e5821dee18a8b5f884d8b7f8a1111b
2025-03-07 09:06:10 +00:00
Davinder Singh 3784061935 Merge pull request #24066 from overleaf/ds-group-discount-2
Group plans - Reintroduce 10% discount for group plans (part 2)

GitOrigin-RevId: ea5d600d901329944092daf560a015ac8ca10cd3
2025-03-07 09:06:05 +00:00
Davinder Singh 8ad7ec6682 Merge pull request #23973 from overleaf/ds-group-discount
Group plans - Reintroduce 10% discount for group plans (part 1)

GitOrigin-RevId: 7cb60413ff99396a015de03450b19fba2d896fab
2025-03-07 09:06:01 +00:00
Rebeka Dekany cd133e8240 Show dashboard notification for unconfirmed emails and untrusted secondary emails (#23919)
* Show an aggressive dashboard notification for unconfirmed emails
Show a persistent dashboard notification for untrusted secondary emails

* For emails before the cutoffDate, start displaying the notification on the deletionDate and show the notification for 90 days

* Update the email deletion logic for displaying the email notification and update test

* Update test

GitOrigin-RevId: 1b0e44f79592292d428c634dc1ec4df9e6ceaeb4
2025-03-07 09:05:50 +00:00
Alf Eaton 2147f1d53d Remove Bootstrap 3 code from IDE page components (#23061)
GitOrigin-RevId: b41aff10672bf96e892de0be396a69eb25e2443b
2025-03-07 09:05:45 +00:00
Alf Eaton a062ec2dd9 Ensure that the PDF viewer has an isolated stacking context (#24003)
GitOrigin-RevId: 2cdaffa8c4387e173f3256864ec15d785931caf2
2025-03-07 09:05:30 +00:00
Alf Eaton 763bf34e19 Avoid creating a comment when the main selection is empty (#24063)
GitOrigin-RevId: 8c21dfbcb5f49d196afd0e8730326ee6e0bfbe25
2025-03-07 09:05:25 +00:00
Alf Eaton ee99856b8f Update text in GitHub Sync modal (#24068)
GitOrigin-RevId: c99b9f8eac48b8dee1e195e82ae5d8bbf4a4b0a5
2025-03-07 09:05:21 +00:00
Alf Eaton b653ae2a66 Remove prototype full project search components (#24106)
GitOrigin-RevId: 7ffd290f537c1f3aae072a045405b2c3b2253f45
2025-03-07 09:05:16 +00:00
Alf Eaton ab55d54c45 Add custom words to the en_US dictionary (#24108)
GitOrigin-RevId: 44587567340b4a6ff357f6a321055554a800d799
2025-03-07 09:05:12 +00:00
Alf Eaton b52ad5c32e Set font-size and line-height for upload modal (#24109)
GitOrigin-RevId: 3544628aa616d2507b0b5d440a8bb087c0748748
2025-03-07 09:05:08 +00:00
Antoine Clausse 13e97ab2c9 [web] Remove absolute font-size for code, kdb, samp (#24078)
* Swap pre/div in split-test-dump-modal.tsx

* Remove fixed font-size and line-height for code/kdb/pre/samp

* Set the font-size of code,kdb,samp to 1em instead of 0.875em

* Remove unnecessary `font-size: inherit`

GitOrigin-RevId: b5b19cf08774312ad1b3c4dcf16ea08e08093ccb
2025-03-07 09:04:56 +00:00
Andrew Rumble 13b4e6333c Merge pull request #23874 from overleaf/ar-use-gcp-pre-emptible-signal
[clsi] Use GCP pre-emptible metadata instead of hostname

GitOrigin-RevId: 2df305e68f2999c9d3bde051dbb533025478800f
2025-03-07 09:04:45 +00:00
Jakob Ackermann 6916e22b09 [real-time] log transport and clientId in both directions of serverPing (#24084)
GitOrigin-RevId: dabd8db6949498ef1a6252864cef94cd4329e3c0
2025-03-07 09:04:40 +00:00
roo hutton 27e2adecab Merge pull request #23939 from overleaf/rh-cio-analytics-split-test
Only send events to customer.io if in campaign split test

GitOrigin-RevId: 572ad5efdfc1e86f525722c6a425fa1454f2cf3a
2025-03-06 09:05:45 +00:00
CloudBuild 4441f42dea auto update translation
GitOrigin-RevId: 2e25b40ec57740bbb49deaab1c4f4809a5c150fd
2025-03-06 09:05:41 +00:00
Eric Mc Sween 4ccc21ca85 Merge pull request #24046 from overleaf/em-cdn-assets
Load assets from the CDN in selected pages

GitOrigin-RevId: c2b25f74e30c0ce47e486855dee3815d72d43d47
2025-03-06 09:05:23 +00:00
Eric Mc Sween 8e86a78666 Merge pull request #24038 from overleaf/em-tear-down-bs5-misc-pages-core
Tear down bs5-misc-pages-core feature flag

GitOrigin-RevId: e99ad216f775ec7acba3eab7bbaef2753877e046
2025-03-06 09:05:18 +00:00
Domagoj Kriskovic 42ddbb6eb3 Update Overleaf assist paywall to reflect group and institution licensing (#24061)
GitOrigin-RevId: 5df447febb845ed60ddb04428d7f6a0375f351f7
2025-03-06 09:05:07 +00:00
Domagoj Kriskovic 08882c63df Adjust scroll behavior in review panel to account for wrapped lines (#24029)
GitOrigin-RevId: 748f7ffcdd2d0c83132b43de99b10f598227f6b0
2025-03-06 09:05:03 +00:00
Miguel Serrano 42ee56ecd4 Merge pull request #23810 from overleaf/msm-ldap-login-rate-limiter
[SP] LDAP login rate limiter

GitOrigin-RevId: dedab17da85c0f91b280d002cdad796e95b9fd4f
2025-03-06 09:04:55 +00:00
CloudBuild 2c91363745 auto update translation
GitOrigin-RevId: 0ad3c5d4f7b66b19329b2a249a291af52c7da312
2025-03-05 09:06:00 +00:00
Brian Gough 893294e6b8 Merge pull request #24069 from overleaf/bg-backup-errors
more tweaks for backup errors

GitOrigin-RevId: 0f7c7bb5004923c3c22c6e3471bb7152cc3e05e2
2025-03-05 09:05:50 +00:00
Mathias Jakobsen 6f826c5546 Merge pull request #24024 from overleaf/ae-react-refresh-enabled
Use process.env.REACT_REFRESH_ENABLED for configuration

GitOrigin-RevId: e97967e52bed10422b0e2cce53fb09e2745a5c4a
2025-03-05 09:05:46 +00:00
Mathias Jakobsen 3a67124f90 Merge pull request #24026 from overleaf/ae-webpack-version
Ensure single webpack version

GitOrigin-RevId: 1a3c3af2d77967ad010a858404a9c6a87fe22bf3
2025-03-05 09:05:42 +00:00
Mathias Jakobsen d17f698453 Merge pull request #23915 from overleaf/dp-resizing
Blank out pdf and editor windows when resizing rail

GitOrigin-RevId: 0fc93e068541bc6110fe20339c49355f98d2cd7a
2025-03-05 09:05:38 +00:00
Mathias Jakobsen 733bc26ed1 Merge pull request #23848 from overleaf/dp-settings
Add initial components for new editor settings modal

GitOrigin-RevId: e3eb511d2af9265e0fc1cf54178b3e2953717950
2025-03-05 09:05:34 +00:00
Mathias Jakobsen d63221d8b6 Merge pull request #23925 from overleaf/mj-ide-dark-mode
[web] Editor Redesign: Add dark mode

GitOrigin-RevId: 063552ee3c1647e8ae090852868b01d372845b87
2025-03-05 09:05:30 +00:00
Rebeka Dekany 5010c91c79 Make the checkbox to readonly to preserve the Group plan value on form submission (#24004)
GitOrigin-RevId: 555c69952d64e050f0f30669ee8d69a511f6a08d
2025-03-05 09:05:23 +00:00
Rebeka Dekany 55e14b9b21 Adjust the vertical positioning of the OpenDyslexic Mono font (#24008)
GitOrigin-RevId: 0b47294219e0517601a4d005204e8569ad80d786
2025-03-05 09:05:19 +00:00
Brian Gough 34b397073f Merge pull request #24053 from overleaf/bg-backup-queue-tweaks-II
additional backup queue tweaks

GitOrigin-RevId: b54e0c5f4a23bb9962c5062bd1b80f9f124c3c87
2025-03-05 09:05:15 +00:00
Copybot ccd685b60d Merge pull request #1308 from DerEchteJoghurt:fix/mongo/mongosh
GitOrigin-RevId: e3efb05bfb6ea0f65dcd71c820324701bb48fa4f
2025-03-05 09:05:10 +00:00
Tim Down 2d1fb9c1a5 Merge pull request #22639 from overleaf/td-ds-nav-tag-men-toggle-bg
Preserve background on expanded tag menu toggle button in DS nav project dashboard

GitOrigin-RevId: cc5f6092236150e123202af17e1c2eaecca29654
2025-03-05 09:05:06 +00:00
Tim Down cd644320f4 Merge pull request #23998 from overleaf/td-resolved-thread-count
Fix for resolved thread count display

GitOrigin-RevId: c4f6848ed2e952981d20f157466db6dded99c3c9
2025-03-05 09:05:02 +00:00
Tim Down 1f339b37bd Merge pull request #23763 from overleaf/td-bs5-user-activation
Migrate user activation page to BS5

GitOrigin-RevId: 3f4c9173cf480aafc5d874bfe81bbc8503a2e5be
2025-03-05 09:04:58 +00:00
Tim Down 69896f4c8b Merge pull request #23872 from overleaf/td-bs5-compromised-password-page
Migrate compromised password page to Bootstrap 5

GitOrigin-RevId: fed58659cdeb12ba16bdd08c0c91c629a71ac169
2025-03-05 09:04:54 +00:00
Brian Gough c815106d62 Merge pull request #24037 from overleaf/bg-fix-backup-worker-errors
backup worker tweaks

GitOrigin-RevId: 7901bb0257c7c7320afd08ef965f124347a1de30
2025-03-04 09:05:12 +00:00
M Fahru 67947fff6c Merge pull request #23062 from overleaf/mf-remove-leftover-new-design-variant-config
[web] Remove leftover plans page redesign split test config

GitOrigin-RevId: a658dda19034096668a148fc0991010b7914bbca
2025-03-04 09:05:05 +00:00
M Fahru 17d7c3c094 Merge pull request #23585 from overleaf/mf-rename-b2c-pages-bs5-split-test
[web] Rename b2c pages split test to follow the standard for bs5 migration

GitOrigin-RevId: 7a26912642d84866b6b99ce57107f8ba79335f1a
2025-03-04 09:05:01 +00:00
Eric Mc Sween 290bdf4361 Merge pull request #23993 from overleaf/em-remove-fixed-remove-change-flag
Remove fixedRemoveChange flag from editor updates

GitOrigin-RevId: bf74e1137560184c4b024a3b5c6ede5a841d3559
2025-03-04 09:04:48 +00:00
Brian Gough 1dbf5dca10 Merge pull request #24019 from overleaf/bg-backup-add-error-logging
add logging of backup errors in batch mode

GitOrigin-RevId: 96ae7a2354f82451b3bbe8c5459c4d4cf47e5459
2025-03-04 09:04:44 +00:00
Domagoj Kriskovic 408f6dfee3 Open overleaf assist paywall via event listener (#23958)
* Add overleaf assist paywall modal component in storybook

* update img alt

* remove data-action

* rename assistant -> assist

* use css var for blue color

* Open Overleaf assist paywall if in "overleaf-assist-bundle" split-test

* dont use optional planCode

* Open overleaf assist paywal via event listener

* rename to mainEditorLayoutModals

* call setAssistantUpgraded when modal is shown

* fix merge mistake

* fix lint error

* fix merge differences

GitOrigin-RevId: 0b3162a5c241d4dbe2773ae773c3e35f02c5c492
2025-03-04 09:04:37 +00:00
Domagoj Kriskovic 767eccd1c8 Update projectRanges on "accept-changes" (#23984)
GitOrigin-RevId: f06dd126e3948df41f71a189d97f8d3ad6928a43
2025-03-04 09:04:33 +00:00
Jakob Ackermann a4f2d0e37a [server-pro] tests: npm audit fix (#23982)
GitOrigin-RevId: c3779a435a32106bf83c74baf2abf140876459e3
2025-03-03 09:05:35 +00:00
Jakob Ackermann dddb091d77 [real-time] retire legacy transports on the server-side as well (#23983)
GitOrigin-RevId: 27dad39e889a5df46943c4f393277be16ab8ffdd
2025-03-03 09:05:30 +00:00
Jakob Ackermann 195a12a3dc [web] fix download of output.pdf when creating Server Pro template (#23988)
GitOrigin-RevId: 899b9bfd54af8d3f345393068663d769ec3a869b
2025-03-03 09:05:26 +00:00
Brian Gough 4720e8f2c5 Merge pull request #23989 from overleaf/bg-backup-worker-reduce-logging
reduce log level from info to debug for backup logging

GitOrigin-RevId: 10f541b0e0068aafd50710226fb8425527fee7c5
2025-03-03 09:05:22 +00:00
Eric Mc Sween 0d9528932c Merge pull request #23900 from overleaf/em-read-only-permissions
Restrict viewer permissions for comments

GitOrigin-RevId: fb7189b8af9358603e29bbd33b0160dd862fe532
2025-03-03 09:05:17 +00:00
Eric Mc Sween 1534731cdf Merge pull request #23902 from overleaf/em-upgrade-octokit
Upgrade octokit/request to 9.2.2 in github-sync

GitOrigin-RevId: de44a80b5aad50a982f706ab148e9a76f3004b00
2025-03-03 09:05:13 +00:00
Brian Gough 8d0fa5be65 Merge pull request #23977 from overleaf/bg-backup-worker-load-global-blobs
ensure global blobs are loaded in backup worker

GitOrigin-RevId: b80791ef38e7fa8db364bdd3a9c461757778409d
2025-03-03 09:05:08 +00:00
Jakob AckermannandRebeka d8b0ab9436 [clsi] avoid downloads from compile directory (#23975)
* [clsi] make error copying output files a fatal compile error

Co-authored-by: Rebeka <rebeka.dekany@overleaf.com>

* [clsi] remove unused endpoints for downloading files from compileDir

Co-authored-by: Rebeka <rebeka.dekany@overleaf.com>

* [clsi] avoid useless clone of output files

* [clsi] add test for output files when compile did not produce a PDF

---------

Co-authored-by: Rebeka <rebeka.dekany@overleaf.com>
GitOrigin-RevId: cb998b99b4d96cb48ddd70987958f614ad3b40fc
2025-03-03 09:05:04 +00:00
Domagoj Kriskovic 0a270e0870 Open Overleaf assist paywall if in "overleaf-assist-bundle" split-test (#23894)
* Add overleaf assist paywall modal component in storybook

* update img alt

* remove data-action

* rename assistant -> assist

* use css var for blue color

* Open Overleaf assist paywall if in "overleaf-assist-bundle" split-test

* dont use optional planCode

GitOrigin-RevId: 9315ee2350cb7bc804afa720047849c220781686
2025-03-03 09:04:48 +00:00
Brian Gough a8030f9e32 Merge pull request #23970 from overleaf/bg-change-history-worker-to-use-queue-redis
fix backup worker to use queues redis

GitOrigin-RevId: 4f278c12ea00ec98d9fa0a1430e1dd8bc8b40409
2025-03-03 09:04:40 +00:00
Jakob Ackermann 14d9874b68 [git-bridge] add CORS support (#23892)
GitOrigin-RevId: 9e3d85e479746affd047434ec9ce2588b60ca76c
2025-02-28 09:06:10 +00:00
Jakob Ackermann 18fb4effb1 [server-pro] tests: reduce flakiness of editor tests (#23963)
- Swap order of "oldContent" and "static" (apparently that makes the
  selection more reliable...)
- Turn off spellchecking outside the spellchecking test (avoid DOM
  changes from added underline on misspelled words)
- Swap order of opening file and switching to doc under test:
  The cy.findByText('static') was occasionally triggering an unhandled
  error in codemirror when it ran while the editor was getting swapped.
  (something along the lines of "cannot select out-of-dom range")
- Align source and visual editor tests, use ".findByText(oldContent)"
- Double down on waiting for doc switch to finish loading

GitOrigin-RevId: 8b201a6d78a60e3cfa92c22198f63e705d8880ec
2025-02-28 09:06:07 +00:00
Brian Gough b37b409994 Merge pull request #23946 from overleaf/bg-backup-queue-implementation
additional backup queue implementation

GitOrigin-RevId: 03754e57a6c6798a07dcca6a5248dec61b3cdc7a
2025-02-28 09:05:50 +00:00
Andrew Rumble 767591973c Merge pull request #23905 from overleaf/ar-mocha-11
[all] Bump mocha everywhere

GitOrigin-RevId: bf5587047f9ceb88872cbd356c2029717bb8ca9d
2025-02-28 09:05:40 +00:00
Jimmy Domagala-Tang da3a24ad7e Merge pull request #23721 from overleaf/jdt-hide-ai-for-paying-users-if-toggled
Hiding AI should hide assist for paying accounts

GitOrigin-RevId: 6a1ec76d648be2986241ee6e87d74ce69c7c4867
2025-02-28 09:05:32 +00:00
Jimmy Domagala-Tang 8a81b0777a Merge pull request #23820 from overleaf/jdt-transition-wf-accounts-script
Script to transition WF users from auto-load to auto-create

GitOrigin-RevId: 538ff04dece52e4c46a4a592cb5089d20eb5aa7a
2025-02-28 09:05:25 +00:00
Alf Eaton 18c2b4108d Tidy up global scope values (#20379)
* Remove crypto from window
* Remove ui.loadingStyleSheet
* Remove onlineUsers scope
* Remove addNewComment

GitOrigin-RevId: 5e62ed7f265cdd530b5ca85488477093b0be775a
2025-02-28 09:05:15 +00:00
Alf Eaton c9320eb7a1 Allow AI feature use for reviewers (#23843)
GitOrigin-RevId: 190c0ee4174d69d4429dba6c0c58d785b4afab7d
2025-02-28 09:05:10 +00:00
Antoine ClausseandEric Mc Sween 0abdbc0093 [web] Add script to attach dangling comments to a document (#23904)
* Add script to attach dangling comments to a document

* Fix comment id field

---------

Co-authored-by: Eric Mc Sween <5454374+emcsween@users.noreply.github.com>
GitOrigin-RevId: b51c9c57542b24bd27cb9475b088eb2f0d88b3af
2025-02-28 09:05:06 +00:00
Alf Eaton 9586af91e5 Store deletedProjectReviewerIds on deleterData (#23868)
GitOrigin-RevId: 1ae0aaf59de6869fc9469bffaf0c68fe17405464
2025-02-28 09:05:02 +00:00
ilkin-overleaf 887e190de8 reduce the cap to 20 users when adding seats (#23873)
GitOrigin-RevId: f997059632e9d123e2aa71a74a64ac3b0dd20ef9
2025-02-28 09:04:55 +00:00
Davinder Singh 3851ee4eb2 Plans Group Size - Removing the 50 size (#23851)
* removing the group size 50

* removing the if condition for 20/50 groups

* running make cleanup_unused_locales

* removing instances of sizesForHighDenominationCurrencies and the related if conditions

* removing the price related to group size of 50 in different currencies

* fixing the test

* changing the 50 to 20 under faqs

* changing the remaining 50 to 20

* cleaning of variables

* removing extra variable

GitOrigin-RevId: 68f5d7df1eab29360e9c806ad844f1c900341c19
2025-02-28 09:04:51 +00:00
Brian Gough 763e5ba82c Merge pull request #23920 from overleaf/bg-backup-queue
initial history backup queue worker app

GitOrigin-RevId: e9647a2ec3caeb1fff843cead12164ba89fdb1f8
2025-02-28 09:04:46 +00:00
ilkin-overleaf 788f6569d8 Merge pull request #23933 from overleaf/jel-group-table-no-checkbox
[web] Fix group table layout when all users are managed

GitOrigin-RevId: dbbfe31fd8e3a3b9a1ec9fd11d7a8950c7344f83
2025-02-28 09:04:42 +00:00
ilkin-overleaf d5adc6ee4b Merge pull request #23806 from overleaf/ii-bs5-manage-group-managers
[web] BS5 Group managers management

GitOrigin-RevId: 912fd29c3d5cf07eab0cd67e2771e60b1ba25fb3
2025-02-28 09:04:35 +00:00
roo hutton 8ce05dfc62 Merge pull request #23878 from overleaf/rh-cio-split-test-assignment-trial
Assign users to customer.io split test after trial start

GitOrigin-RevId: a9a5bf288919d86a604541810f76578b088579ba
2025-02-27 09:06:07 +00:00
Jakob Ackermann 245473c1ac [server-pro] tests: backport changes from SaaS E2E tests (#23921)
* [server-pro] tests: add helper for gitURL

* [server-pro] tests: avoid hard-coding URL scheme/origin

* [server-pro] tests: fix typo in query selector

* [server-pro] tests: fix spelling of GitHub

* [server-pro] tests: double down on matching email in body

* [server-pro] tests: speed up session resumption

* [server-pro] tests: use a single project in editor spec

* [server-pro] drop check on started recompile

The labels changed between versions and making it configurable is too
verbose.

GitOrigin-RevId: d1ace3b534f28c65b8e20c808bac12268f26fa4d
2025-02-27 09:06:03 +00:00
CloudBuild 8610b190e8 auto update translation
GitOrigin-RevId: 35b25e3daaf940ab241b3c97d48375d78cb385db
2025-02-27 09:05:59 +00:00
Jakob AckermannandAntoine Clausse efdde960d5 [server-pro] trim build context (#23893)
* [server-pro] trim build context

* [misc] remove old Makefile/mvn cache folders from gitignore

* [misc] add extra entries from .gitignore to .dockerignore

Co-authored-by: Antoine Clausse <antoine.clausse@overleaf.com>

---------

Co-authored-by: Antoine Clausse <antoine.clausse@overleaf.com>
GitOrigin-RevId: 2ebca7d6739f778ec31d0c09fd6a75029bf2483e
2025-02-27 09:05:55 +00:00
Jessica Lawshe 06f0ee4c91 Merge pull request #23690 from overleaf/jel-test
[web] Remove test skip

GitOrigin-RevId: bd5a35bcb62227a7bc282bb0813ac0482b04ada2
2025-02-27 09:05:51 +00:00
Jessica Lawshe aa7692b7dc Merge pull request #23299 from overleaf/jel-admin-saml-ids
[web] Show SAML IDs in user audit logs and user info page

GitOrigin-RevId: b8baa44c3110764e466d92ad2b0dc54ddc8f7819
2025-02-27 09:05:47 +00:00
Jessica Lawshe 508b796a69 Merge pull request #23349 from overleaf/jel-managed-unlinked-email-notification
[web] Add message about resetting password when user is managed and unlinked

GitOrigin-RevId: e9d6692f17f31d9d63cb13436018ce9fe6986106
2025-02-27 09:05:43 +00:00
Jessica Lawshe 670c691196 Merge pull request #23394 from overleaf/jel-bs5-notification-close
[web] Use RGB to fix close button hover effect

GitOrigin-RevId: 9c636fdcf509b76a3a7fbad365e24f6adb75f8ee
2025-02-27 09:05:39 +00:00
Jessica Lawshe 50e0d2b4ff Merge pull request #23351 from overleaf/jel-v1-down-sso-login
[web] Catch v1 errors on SSO log in to not block group SSO

GitOrigin-RevId: b99498dfd4a0de2099b8da1ac73dda28280cd430
2025-02-27 09:05:34 +00:00
Jessica Lawshe 182713d02d Merge pull request #23890 from overleaf/jel-reconfirm-date
[web] If v1 date doesn't show as reconfirmed, ensure v2 does not as well

GitOrigin-RevId: dc2850221a2d9176023380b38508311ea98abe43
2025-02-27 09:05:27 +00:00
David fc19e1d34a Merge pull request #23669 from overleaf/mj-ide-chat-look
[web] Update chat in editor redesign

GitOrigin-RevId: 79c79eb9c774fbaa1a5a1e15386b629cc03239b3
2025-02-27 09:05:03 +00:00
David a6d71eb555 Merge pull request #23772 from overleaf/dp-binary-files
Show binary and non-tex files in new editor

GitOrigin-RevId: b6d2681e6ecc868fac0ca484570e33220ec74980
2025-02-27 09:04:56 +00:00
David ad78287c1f Merge pull request #23891 from overleaf/dp-eq-preview
Always include math preview theme even when it is disabled

GitOrigin-RevId: cfbad399ccd0cb6805158633c35c7b15140b9feb
2025-02-27 09:04:51 +00:00
ilkin-overleaf 0783bf1dc7 Merge pull request #23743 from overleaf/ii-bs5-manage-group-members
[web] BS5 Group members management

GitOrigin-RevId: fab24ee6f6de07aa64887e123df930593fcec6a2
2025-02-27 09:04:47 +00:00
CloudBuild 8533b8a628 auto update translation
GitOrigin-RevId: e1b26d9b9d5b0ed7912a6a643f94fc68ba974ba8
2025-02-26 09:05:32 +00:00
Jakob AckermannandAlf Eaton a26290018c [server-pro] tests: avoid opening editor if not needed for test (#23875)
* [server-pro] tests: avoid opening editor if not needed for test

* [server-pro] tests: use intercept to avoid opening editor page

Co-authored-by: Alf Eaton <alf.eaton@overleaf.com>

* [server-pro] tests: use times option in intercept

Co-authored-by: Alf Eaton <alf.eaton@overleaf.com>

---------

Co-authored-by: Alf Eaton <alf.eaton@overleaf.com>
GitOrigin-RevId: 9530d1f5b06766fec70631da47d8b1049b59ead5
2025-02-26 09:05:20 +00:00
Antoine Clausse 08ee37afc1 Update to lockfile-version 3 (#23839)
`npm i --lockfile-version 3`

GitOrigin-RevId: ee5b547b2d7ddd3395f55825123af8a68bfbecd6
2025-02-26 09:05:11 +00:00
Antoine Clausse fe03d8d7fd Add shellcheck to web, server-pro, server-ce (#23823)
* Update shellcheck files to include non ".sh" files having the sh shebang

* Add shellcheck to root Makefile

* `make shellcheck_fix`

* Add shellcheck to server-ce and server-pro

* Exclude SC1091 (Not following) in SP/CE

* Fix errors in SP

* Fix errors in CE

* Update root shellcheck to ignore all failing rules. We can later remove rules one by one.

* Add shellcheck to web

* Add shellcheck step for server-ce and server-pro in cloudbuild.yaml

* Revert "Add shellcheck to root Makefile"

This reverts commit e0fa56f2

* Revert "`make shellcheck_fix`"

This reverts commit eb179245c109a9e742a7fdeeb75a4bdd03963587.

* `make shellcheck_fix` in server-ce

* Fix: Use $(...) notation instead of legacy backticked

```
In init_scripts/100_set_docker_host_ipaddress.sh line 5:
echo "`route -n | awk '/UG[ \t]/{print $2}'` dockerhost" >> /etc/hosts
      ^-- SC2006 (style): Use $(...) notation instead of legacy backticks `...`.

Did you mean:
echo "$(route -n | awk '/UG[ \t]/{print $2}') dockerhost" >> /etc/hosts

For more information:
  https://www.shellcheck.net/wiki/SC2006 -- Use $(...) notation instead of le...
```

* `make shellcheck_fix` in web

* Manual corrections on autofix

* Update SHELLCHECK_FILES to Perl regex so it matches at start of file

GitOrigin-RevId: 815d53f319a3792efa22703beb75570de5977450
2025-02-26 09:05:02 +00:00
Antoine Clausse d9a9fbb242 [web] Fix button-link loading state in subscription page (#23640)
* Fix inline loading button style

* Fix frontend test

GitOrigin-RevId: 59cdf68b8f2ad50f042a4457dc37f5c3d33d6c87
2025-02-26 09:04:58 +00:00
Eric Mc Sween 59fb97d874 Merge pull request #23819 from overleaf/em-find-projects
Rename find_dangling_comments script to check_docs and make improvements

GitOrigin-RevId: 3c81c734f4259c5939c190a886b5b90239d03017
2025-02-26 09:04:54 +00:00
Jakob Ackermann 04c42f03e1 [web] editor connection tweaks for connection attempts when offline (#23864)
* [web] only flag errors originating from WebSocket connect as ws failure

* [web] slow down reconnecting when potentially offline

GitOrigin-RevId: 7c587d52dfe8092c45e2152f929e05e814db98f4
2025-02-26 09:04:47 +00:00
Rebeka Dekany 61ddeeca2b Merge pull request #23695 from overleaf/rd-admin-page-remaining-refactors-bs5
Remaining refactors for admin pages - Bootstrap 5 Migration

GitOrigin-RevId: 2f3ac77ba79f6970bc53b93cd45522d475f974bd
2025-02-26 09:04:40 +00:00
Rebeka Dekany 6f1f968954 Merge pull request #21895 from overleaf/rd-trusted-secondary
Indicate secondary emails in User Info if they are trusted or untrusted

GitOrigin-RevId: b206b022c9661f972dae2b8d4c8e4c71a1ef7eb8
2025-02-26 09:04:36 +00:00
Alf Eaton 1fd9c592e2 Ensure that lastClickEvent is set before handling doubleClick (#23865)
GitOrigin-RevId: 1f080e62e95dc71cec6bcf2f5c9e0cb8bd5f5e2c
2025-02-26 09:04:33 +00:00
59b708e3f7 Allow draining to be prevented in CLSI agent
Co-authored-by: Brian Gough <brian.gough@overleaf.com>
Co-authored-by: Christopher Hoskin <mans0954@users.noreply.github.com>
GitOrigin-RevId: f55de7783cb1c14108eb347eebb74ec329180000
2025-02-26 09:04:26 +00:00
Alf Eaton fe878a88d1 Run Prettier (#23860)
GitOrigin-RevId: fd65c7d24c4ada0367ba38092a142c6f6aeaba71
2025-02-26 09:04:19 +00:00
Domagoj Kriskovic 598d51c9e7 Prevent focusing review panel entry on resolve/accept/reject (#23859)
GitOrigin-RevId: 91d6725d1ea2a27f1ff93871db745440486b7246
2025-02-26 09:04:16 +00:00
Alf Eaton fe1beec09a Use the original double-click location in bracketSelection extension (#23722)
GitOrigin-RevId: 173c4b4149fa4e6b552cb88022dad6334492c59a
2025-02-26 09:04:12 +00:00
Alf Eaton cee51af9fd Disable "Go to code location in PDF" button for non-TeX files (#23751)
GitOrigin-RevId: 9a51252e2df6e52532d0cd787a8fd744af41ed95
2025-02-26 09:04:08 +00:00
Alf Eaton 02cd5d2f2f Reduce PDF.js maxCanvasPixels in Safari (#23781)
GitOrigin-RevId: 3b75d85bb4af33e4d4d40ee6f1dc9cf375f1435f
2025-02-26 09:04:05 +00:00
Alf Eaton 7070a0d410 Focus the editor and place cursor after the learned/corrected word (#23782)
GitOrigin-RevId: 605b13a4bb0d8e9375d8c4edc17a1866e29a3169
2025-02-26 09:04:01 +00:00
Alf Eaton 09ffc2b652 Set flex-shrink: 0 on file name in PDF log header (#23792)
GitOrigin-RevId: 5ba49fdf2715cd4839174c9dcd26b968b0834e27
2025-02-26 09:03:57 +00:00
Alf Eaton 9dee601ba3 Remove AI Error Assistant feedback prompt (#23796)
GitOrigin-RevId: 36ee1ca0befc0f2e4bf817a6946213f814947079
2025-02-26 09:03:52 +00:00
Tim Down 4e353956db Merge pull request #17378 from overleaf/td-stream-buffer-consolidation
Stream and buffer consolidation

GitOrigin-RevId: 284f411e6403e190d2dda3d9ebf806b1935b3949
2025-02-25 09:05:26 +00:00
Brian Gough 6e55a9fa81 Merge pull request #23837 from overleaf/bg-redis-redact-config
sanitise password in redis config output

GitOrigin-RevId: 45d8bd13f01c3c4f138549c8a9f47dc0db29d0b0
2025-02-25 09:05:22 +00:00
Brian Gough 0acc067205 Merge pull request #23836 from overleaf/bg-backup-extend-debugging-script
add support for fetching chunks in backup debugging script

GitOrigin-RevId: 641298088d62148693525259748dcddf4d67d14b
2025-02-25 09:05:18 +00:00
Brian Gough 9d8f9e5358 Merge pull request #23835 from overleaf/bg-backup-show-errors
add error cause logging for missing chunks and blobs in backup comparison

GitOrigin-RevId: 9a1bf84b64621add71fb1d1e0cb013598b226bc8
2025-02-25 09:05:14 +00:00
Brian Gough dd8a683e9e Merge pull request #23834 from overleaf/bg-backup-graceful-shutdown
add graceful shutdown handling to backup script

GitOrigin-RevId: f0fb9a3867b26c7800edefab126fd05fbabdae02
2025-02-25 09:05:10 +00:00
Jakob Ackermann 8b64325e89 [server-pro] tests: wait for editor to finish loading before interacting (#23841)
GitOrigin-RevId: bef74f336c3a240da43cd5f9563629b96bc1d7ca
2025-02-25 09:05:06 +00:00
Jakob AckermannandAlf Eaton 8138c76c1d [web] restrict external heartbeat/server ping to websocket transport (#23830)
Co-authored-by: Alf Eaton <alf.eaton@overleaf.com>
GitOrigin-RevId: c03a78e2c05cd380b705bd14652060980682cb39
2025-02-25 09:05:02 +00:00
Jakob AckermannandAlf Eaton 4d857b7937 [web] editor connection fixes (#23807)
* [haproxy] add support for xhr-polling in real-time

* [web] try 3 WebSockets then fallback to xhr-polling when (re-)connecting

* [web] ensure old socket.io transport has been closed when reconnecting

* [web] close xhr-polling transport before leaving the page

This will de-register the client, leave the project and clean up the
connected clients tracking ASAP.

* [web] rename constant to avoid confusion

Co-authored-by: Alf Eaton <alf.eaton@overleaf.com>

---------

Co-authored-by: Alf Eaton <alf.eaton@overleaf.com>
GitOrigin-RevId: 55e500c341145947e5589875438fc796394b6ae4
2025-02-25 09:04:58 +00:00
Antoine Clausse 82f2e47476 [web] Show DS Navigation for all SAAS users regardless of feature flag (with fix!) (#23821)
* Reapply "[web] Show DS Navigation for all SAAS users regardless of feature fla…"

This reverts commit 8d4096a7e4b6a7894b1bef14290548225deebd57.

* Fix: `hasDsNav` should check `isOverleaf` !!!

* Change `hasDsNav` from a boolean to a function call for dynamic evaluation

GitOrigin-RevId: 17463ac113a4278ed344622552d83da93b208b4d
2025-02-25 09:04:54 +00:00
Antoine Clausse e429ee533f Fix prefetch_custom_texlive command (#23813)
Previous attempt failed with `sh: gcr.io/overleaf-ops/texlive-full:2023.1: No such file or directory`.

✅ Now tested with `make prefetch_custom_texlive`

GitOrigin-RevId: 09a5e1d3c270bdb58c761c8be3c665155879290f
2025-02-25 09:04:50 +00:00
Jakob Ackermann d65be7772d [server-ce] precompile pug files concurrent to npm-i-dev/webpack build (#23824)
GitOrigin-RevId: 7fd153dd0fa89ca4bc12efc1e26276844ff9431a
2025-02-25 09:04:43 +00:00
CloudBuild c9bbdc37a1 auto update translation
GitOrigin-RevId: 9948881e46548a02c38202ac0408c609c2c6f82b
2025-02-24 09:06:23 +00:00
CloudBuild 6b90f831ad auto update translation
GitOrigin-RevId: 2d057c8c8816407403ee26baebacbddf5f7d8946
2025-02-24 09:06:19 +00:00
Andrew Rumble b0ed2efdf9 Merge pull request #23812 from overleaf/ar-allow-debugging-for-remove-backup-blobs-script-errors
[history-v1] Minor improvements to AWS cleanup script

GitOrigin-RevId: bd01a72169b9cbc018612173294cfbf8649a9fbd
2025-02-24 09:06:15 +00:00
Antoine Clausse 47dd074c36 Merge pull request #23811 from overleaf/revert-23801-ac-remove-ds-nav-code-3
Revert "[web] Show DS Navigation for all SAAS users regardless of feature flag"

GitOrigin-RevId: 3a5b5603718da2fddabc9f1460151efd9cbf6178
2025-02-24 09:06:11 +00:00
Antoine Clausse c31dffc605 [web] Show DS Navigation for all SAAS users regardless of feature flag (#23801)
* Remove `sidebar-navigation-ui-update` as true from analytics events

* Hide "ds-nav" survey for users who have the feature flag

* Replace `useIsDsNav()` by `isOverleaf`

* Rename former `hideDsSurvey` to `hideDsSurvey`, and set `hasDsNav = isOverleaf` variable

so the intent is clearer.

* Update frontend tests

GitOrigin-RevId: 2be9f88a10da430c0429de15d777d98104327f9f
2025-02-24 09:06:04 +00:00
Antoine Clausse f2aa79f49d Replace xargs -d, by tr ',' '\0' | xargs -0 (#23800)
`xargs -d` doesn't work on Mac OS: `xargs: illegal option -- d`

There's a workaround using `tr`

See: https://stackoverflow.com/a/71409498/4823861
GitOrigin-RevId: 109c7e1e035b829122d96fd41824f18bdf81468a
2025-02-24 09:06:00 +00:00
Andrew Rumble a0d79d5871 Merge pull request #23742 from overleaf/ar-script-for-removing-blobs-in-wrong-place
[history-v1] Script for deleting blobs backed up to wrong location

GitOrigin-RevId: 6abe1dba5164f8fa7d41c4ee3e4a07764e73b7e1
2025-02-24 09:05:53 +00:00
Alf Eaton df671b2869 Revert "Use fixed width for project list checkbox cell (#23778)" (#23808)
This reverts commit 4d3f443f99f366a43a1b59a7556c0341c06d7af9.

GitOrigin-RevId: 1b111d9b4826ecdba1d40334f9c8e25e2b8561b1
2025-02-24 09:05:49 +00:00
Alf Eaton a0eb8baf72 Upgrade dompurify (#23748)
GitOrigin-RevId: a2aa1c40a454f8ff487b5de15da39de577c6ff16
2025-02-24 09:05:44 +00:00
Alf Eaton 3671e4d452 Update AI feedback form text (#23754)
GitOrigin-RevId: 29ca72963e912ee0e121dece9821bb90efa8eff3
2025-02-24 09:05:40 +00:00
Alf Eaton e151be6b89 Avoid selecting word when opening spell check context menu (#23756)
GitOrigin-RevId: 0276979d18583f5813476b2ac01a8eb33b352fcb
2025-02-24 09:05:36 +00:00
Alf Eaton 816410f2d4 Remove aria-hidden from theme menu divider option (#23704)
GitOrigin-RevId: c6df23ad5869aaff41beb767ecd5d1d86910a267
2025-02-24 09:05:31 +00:00
Alf Eaton 2139107f6b Block Safari 14, deprecate Safari 15 (#23740)
GitOrigin-RevId: ef1506bc58982c4fb8286d48137ca9c8557ee1a0
2025-02-24 09:05:27 +00:00
Alf Eaton dd2c213ac5 Upgrade PDF.js to 4.10.38 (#23745)
GitOrigin-RevId: d7264acd7c1a8e64042be799efa4c7ca133e64f8
2025-02-24 09:05:23 +00:00
Alf Eaton e8a6cb340e Remove link from DS in side nav (#23759)
GitOrigin-RevId: 0724fecd45ce3686be25d394aaea9c2c2b97f669
2025-02-24 09:05:18 +00:00
Alf Eaton c5f4fb5762 Show reviewers in the admin list of collaborators for a project (#23777)
GitOrigin-RevId: 6d7e5debc5619dab5b696ab8aab26496931e38b1
2025-02-24 09:05:11 +00:00
Alf Eaton cad8eb679c Use fixed width for project list checkbox cell (#23778)
* Use fixed width for project list checkbox
* Set word-break: break-word for project owner name (#23783)

GitOrigin-RevId: 4d3f443f99f366a43a1b59a7556c0341c06d7af9
2025-02-24 09:05:06 +00:00
Alf Eaton a7e00e19e2 Only dispatch doc:changed event for insert or delete operations (#23779)
GitOrigin-RevId: b3425d4edffb045b2a15e5fc5cb69210d9e97203
2025-02-24 09:05:02 +00:00
Alf Eaton 6688b81ece Ensure that the Chat pane is disabled for read-only link collaborators (#23785)
GitOrigin-RevId: 56e1b1d6b08ec7537386cab0b251e325d681e117
2025-02-24 09:04:58 +00:00
Rebeka Dekany 789db0d822 Remove bootstrap-5 feature flag from the Account Settings page (#23693)
GitOrigin-RevId: 0fc29f2cb904f9133fd26ad119909edba1518cbf
2025-02-24 09:04:54 +00:00
Eric Mc Sween 819e49aa17 Merge pull request #23784 from overleaf/em-find-dangling-comments-modified-since
Add --project-modified-since option to find_dangling_comments script

GitOrigin-RevId: 69483611dbfa71eeb16206387771b2b9d837f978
2025-02-24 09:04:49 +00:00
Domagoj Kriskovic ebab25058a Allow selecting comment text without changing scroll position (#23628)
* Allow selecting comment text without changing scroll position

* cursor:default on review content

* check text selection on mouseup

* update comment

GitOrigin-RevId: f867613f5b4d08c3b960abfa061b14b404f411a8
2025-02-24 09:04:45 +00:00
Domagoj Kriskovic d8b850f740 Convert track changes to proper format when reviewer role is enabled (#23683)
GitOrigin-RevId: 2ac696804491f61e52b4645dff7f64339c47afc5
2025-02-24 09:04:41 +00:00
Antoine Clausse 3976210485 Merge pull request #23798 from overleaf/revert-23767-ac-remove-ds-nav-code-small
Revert "[web] Show DS Navigation for all users regardless of feature flag "

GitOrigin-RevId: 569800d75e1ef3ed6af666325213f1615c8f3a43
2025-02-24 09:04:37 +00:00
Brian Gough 981e91f012 Merge pull request #21763 from overleaf/bg-backup-script
initial script for running backups

GitOrigin-RevId: d22c373de30738d8080d40dce10790f0bdcb9f51
2025-02-24 09:04:32 +00:00
Jakob Ackermann c3f94358eb [real-time] ignore error from duplicate send action on socket.io socket (#23787)
GitOrigin-RevId: 992a39a5cff04bcc0814ac6a620ad350d6e1da14
2025-02-21 09:05:52 +00:00
Antoine Clausse 7b2f51aad5 [web] Show DS Navigation for all users regardless of feature flag (#23767)
* Remove uses of `useIsDsNav`

* Remove `sidebar-navigation-ui-update` as true from analytics events

* Hide "ds-nav" survey for users who have the feature flag

* `make cleanup_unused_locales` & `bin/run web npm run extract-translations`

* Update frontend tests

GitOrigin-RevId: 83f429d81ca1b46e9eab4fc667a921026a85912f
2025-02-21 09:05:48 +00:00
Antoine Clausse 34cac93f9a [web] When switching primary email, delete the old primary if it's unconfirmed (#23688)
* Add note to ConfirmModal: unconfirmed primary will be deleted

* Change confirm button copy

* Promisify `UserEmailsController.setDefault`

* Update tests after promisification

* Delete unconfirmed primary when swapped

* Fixup apostrophe in translation

* `npm run extract-translations`

* Add unit tests

* Add acceptance tests

* Fix frontend tests

* Make email address bold

* Add "We removed the previous primary..." to the email

GitOrigin-RevId: c971e219e36e509f9963e1720acdd44f562a05b5
2025-02-21 09:05:44 +00:00
Jakob Ackermann f0d94f06ed [server-pro] fix ldap tests (#23771)
GitOrigin-RevId: 6540b7b8766eaf5fd2c7d0b3ff3c9d627382e56e
2025-02-21 09:05:40 +00:00
Jakob Ackermann 0be79e846c [server-pro] tests: make project invite tests more reliable (#23732)
* [web] wait for sending project invite notification, send email detached

Errors from sending the notification or email are still logged only.
Wait up-to ~one second for notification to be sent (API timeout is 1s).

* [server-pro] tests: wait for invite action to complete

GitOrigin-RevId: e6998e6134b5267c91b47785d616a46e9651b996
2025-02-21 09:05:30 +00:00
Miguel Serrano 2e72aa8a47 Merge pull request #23652 from overleaf/msm-update-path-to-regexp
[monorepo] Update express to 4.1.2

GitOrigin-RevId: b3db75257e1edc1a25a1a657def352ecca926920
2025-02-21 09:05:26 +00:00
Miguel Serrano 9a2a14f588 Merge pull request #23642 from overleaf/msm-update-cross-spawin
[monorepo] Updated cross-spawn to 7.0.6

GitOrigin-RevId: 42ca1ca19957a2cddd4968ceea276bc05f659071
2025-02-21 09:05:22 +00:00
Miguel Serrano d22ffb926d Merge pull request #23733 from overleaf/msm-configurable-login-title
[web] Add `OVERLEAF_LOGIN_SUPPORT_TITLE` for CE/SP

GitOrigin-RevId: 5a50d17ded67b68c72dbaeab5172fc283b5aaa01
2025-02-21 09:05:18 +00:00
Miguel Serrano 78297efeab Merge pull request #23680 from overleaf/msm-readonly-email-activation
[CE/SP] Fix `email` not sent on activation

GitOrigin-RevId: 3989bcc318086b3b10576138869296888be27998
2025-02-21 09:05:14 +00:00
Eric Mc Sween fb22d6f518 Merge pull request #23725 from overleaf/em-find-dangling-comments-archived-docs
Look at archived docs when looking for dangling comments

GitOrigin-RevId: fb04b9428ce83802b6e658153c5bbe70e983de65
2025-02-21 09:05:04 +00:00
Eric Mc Sween 12abf74620 Merge pull request #23689 from overleaf/em-dp-mj-interstitial-join-project-bs5
Migrate interstitial join project page to Bootstrap 5

GitOrigin-RevId: 10f45eecb33e087373a9605074ef9f8562ca2b8f
2025-02-21 09:05:00 +00:00
Eric Mc Sween 2710e37caf Merge pull request #23715 from overleaf/em-zoom-tooltips
Change copy for zoom tooltips

GitOrigin-RevId: e87d66d22bba93b9e9ee5e6938a99d003e70131a
2025-02-21 09:04:56 +00:00
roo hutton 14e76b5a72 Misc fixes for updated compile timeout paywall (#23741)
* hide cached files/logs and files buttons while primary paywall showing

* replace plans link with interstitial

* open checkout in new tab

* editors > collaborators, use correct collab count for student plan, refactor collab translations

* fix variable case

GitOrigin-RevId: 48f53aa385ed6d7e5c9b485fe4a045a47c448777
2025-02-21 09:04:52 +00:00
Andrew Rumble 0e64fe2b21 Merge pull request #23457 from overleaf/ar-recurly-account-mapping-initial
[web] setup Recurly -> Mongo account mapping

GitOrigin-RevId: ee08cad60ee04e62100f3d5a4f76fdbcf5543917
2025-02-21 09:04:45 +00:00
Andrew Rumble be247b8cc9 Merge pull request #23617 from overleaf/ar-lg-webpack
[web/latexqc] Bump webpack to 5.98.0

GitOrigin-RevId: 1124432fdce88df0636449d9bf0f8c99f582967c
2025-02-21 09:04:41 +00:00
David 64bb822e41 Merge pull request #23738 from overleaf/ae-blur-handler-timeout
Wrap "Add Comment" blur action in setTimeout

GitOrigin-RevId: 632555d94c8a33a095f3b9a10089714eeae2d962
2025-02-21 09:04:36 +00:00
David 3a9587797d Merge pull request #23710 from overleaf/dp-remove-file-tree-workaround
Remove pre-filetree work around for new editor

GitOrigin-RevId: 7b34e4e298324ad217b603b48abbfbfa78d21804
2025-02-21 09:04:32 +00:00
David 2d02111e06 Merge pull request #23697 from overleaf/dp-layout-switcher
Add layout switcher button to toolbar

GitOrigin-RevId: 33bf664c2e2cb5c2f992b70fd9ca90b5dfe2ee44
2025-02-21 09:04:28 +00:00
Domagoj Kriskovic 874b37c917 Added new properties to "project-opened" event (#23438)
GitOrigin-RevId: e7d3c665abfe485246281e949a645bb90f288dab
2025-02-21 09:04:21 +00:00
Domagoj Kriskovic b75917eb9f Prevent user name in review panel to break if larger than container (#23643)
GitOrigin-RevId: 9d4948e5dc595dc39510a558edc6a008d3ef7156
2025-02-21 09:04:17 +00:00
Domagoj Kriskovic 725db44392 Change scrollTo behavior when review panel entry is selected (#23720)
GitOrigin-RevId: 86fc08f437c49bdf00a9b7d8461b9476f2e9717f
2025-02-21 09:04:10 +00:00
Brian Gough 32983da29c Merge pull request #23700 from overleaf/bg-history-redis
add redis to history-v1

GitOrigin-RevId: def900c4b560ea0a297b11b6c0ecc8cc8caa5b49
2025-02-21 09:04:06 +00:00
Alf Eaton 8ca5360454 Reapply "Increase the length of unsaved doc time before the editor is locked" (#23723)
* Reapply "Increase the length of unsaved doc time before the editor is locked (#23431)"

This reverts commit d0efca398e59ca488c530ee9ec5ca76f29843679.

* Use pendingOpCreatedAt if inflightOpCreatedAt isn't set

GitOrigin-RevId: b3301d7cc1554215a4ba569537bd47beeefde20f
2025-02-20 09:06:31 +00:00
Alf Eaton aac5bccc54 Upgrade CodeMirror dependencies (#23707)
GitOrigin-RevId: b74813af84538f6d62bb3904be05c3782d1bdf45
2025-02-20 09:06:26 +00:00
Mathias Jakobsen 8fdefdc2bd Merge pull request #23687 from overleaf/mj-expose-font-lineheight
[web] Expose font family and lineheight to extensions

GitOrigin-RevId: 75462fd5b062b70feb152fe5e805ff5ab80f5e64
2025-02-20 09:06:22 +00:00
Alf Eaton 0d85fd775c Encapsulate left menu loading error (#23724)
GitOrigin-RevId: 6f53b4932f6e691b7aaaa5d308571561af636877
2025-02-20 09:06:14 +00:00
Jakob AckermannandJimmy Domagala-Tang a1755c1c08 [web] fix waiting for cdn upload on staging-main (#23729)
Co-authored-by: Jimmy Domagala-Tang <jimmy.domagala-tang@overleaf.com>
GitOrigin-RevId: fdf0f2c0b0b8c9e83a1ea6f6f71305f9ff822f1f
2025-02-20 09:06:09 +00:00
Eric Mc Sween 5f6de9caf0 Merge pull request #23706 from overleaf/em-fix-dangling-comments-script
Fix dangling comments script when doc does not have ranges

GitOrigin-RevId: 31cf25ecf79f7ab0ed872c403d31b2c5064b4c76
2025-02-20 09:06:05 +00:00
Alf Eaton 432bbe0db8 Merge pull request #23714 from overleaf/ae-revert-unsaved-docs
Revert "Increase the length of unsaved doc time before the editor is locked"

GitOrigin-RevId: 0f2d257a55ebc3353ded2b10d505bfdb2e85f402
2025-02-20 09:05:53 +00:00
Eric Mc Sween 483c97a484 Merge pull request #23691 from overleaf/em-resolve-comments-permissions
Add resolveAllComments and resolveOwnComments permissions

GitOrigin-RevId: 1fca9391dc3ff6e890532054582c49f11731e987
2025-02-20 09:05:45 +00:00
Eric Mc Sween ae491f910b Merge pull request #23692 from overleaf/em-history-errors
Move error boundary inside history container

GitOrigin-RevId: cd4c911cef18b50cd4187f655e818c9ab851cfe0
2025-02-20 09:05:40 +00:00
Davinder Singh b38c6eab7c Customer IO - Initial functions Setup (#22972)
* adding a hello world end point in analytics service for customerio

* adding updateCustomerIoUser handler function

* setting up the function recordUserAnalyticsEvent

* removing hello function and adding end points for update and track function

* installing the node js source for customer io

* adding the the functions for identify and track events

* adding a properties property

* adding new API key

* cleaning some code and making some changes to make it work

* renaming function to include identify keyword

* adding some detailed succes messages and try catch blocks

* adding a temporary key for testing

* adding the env variable for key

* adding a fallback value for acceptance test, this will need more investigation later on

* deleting the controller, as the handler functions will directly be linked to the customerio queue, so we do not want this path anynmore

GitOrigin-RevId: 38e0cb713e5d6a14c70cdbfb2a7463c633746bbe
2025-02-20 09:05:32 +00:00
Alf Eaton f40118e58b Increase the length of unsaved doc time before the editor is locked (#23431)
* Use opInflightSince to measure unsaved doc time
* Use performance.now() for lastAcked timestamp
* Use inflightOpCreatedAt
* Increase MAX_UNSAVED_ALERT_SECONDS to 15
* Increase MAX_UNSAVED_SECONDS to 30
* Increase FATAL_OP_TIMEOUT to 45000
* Convert "Connection lost" modal to a notification

GitOrigin-RevId: 2d4233723620fd03ce6d6c5795c48c33c0b2f92c
2025-02-20 09:05:20 +00:00
Alf Eaton 04a2e24a89 Use refs and timeout for editor heartbeat events (#23340)
GitOrigin-RevId: 4eb7697fb40c9aaf523765c256c870a21afb0844
2025-02-20 09:05:15 +00:00
Alf Eaton 97d7a60f68 Increase the maximum width of the search input (#23140)
GitOrigin-RevId: 70619c42cbbb16047a929e773a30ba4c0b5cfa50
2025-02-20 09:05:11 +00:00
Rebeka Dekany d1ddfadd0d Merge pull request #23639 from overleaf/rd-fix-scrollbar-text-admins
Fix tables and tabs responsiveness on the admin pages

GitOrigin-RevId: 94c8cea8933f4f908c50aa404e45f23642852c15
2025-02-20 09:05:06 +00:00
Eric Mc Sween 4152d3d796 Merge pull request #23667 from overleaf/em-read-only-label-version
Prevent read-only users from labelling a version

GitOrigin-RevId: 472e70f3860553b131f20afe3dfd01aa00bd48fa
2025-02-19 09:05:26 +00:00
Eric Mc Sween 79bb2e3d40 Merge pull request #23673 from overleaf/em-reviewer-role-delete-replies
Let reviewers delete their own comments

GitOrigin-RevId: bd5341a917a3e886dc573d7e42d12343da6700cd
2025-02-19 09:05:21 +00:00
Mathias Jakobsen a34ebd3c7e Merge pull request #23660 from overleaf/mj-history-tooltip
[web] Editor redesign: Add tooltip to history button

GitOrigin-RevId: c14dab2c6d62d10312f9d5097fd95cad5cae1397
2025-02-19 09:05:17 +00:00
Mathias Jakobsen fb12a1bc8e Merge pull request #23656 from overleaf/mj-ide-toolbar-buttons
[web] Reduce toolbar and rail size in editor redesign

GitOrigin-RevId: 9e9670c37664355f4bc287a5561b427768bb4436
2025-02-19 09:05:12 +00:00
David 46e9c69d8e Merge pull request #23597 from overleaf/dp-integrations-panel
Add integration panel to new editor

GitOrigin-RevId: 85e038c645e40d0ea596ed35d31448caa232e298
2025-02-19 09:05:02 +00:00
Antoine Clausse f096ffaa43 [web] Send security alert email when secondary is added (#23657)
* [web] Send security alert email when secondary is added

* [web] Add test: checkSecondaryEmailConfirmationCode - sends a security alert email

* Move `_sendSecurityAlertEmail` before `addEmailAddress`

GitOrigin-RevId: 8d9c496fffd953871e03d8c7f011c42459eeb0bc
2025-02-18 09:05:14 +00:00
Antoine ClausseandRebeka 98ea3664f2 Create script: remove_unconfirmed_emails.mjs (#23079)
* Create script: remove_unconfirmed_emails.mjs

* Update script remove_unconfirmed_emails.mjs after pairing

Co-authored-by: Rebeka <rebeka.dekany@overleaf.com>

* Add user counts. Add timing

* Revert previous changes: just remove the fully unconfirmed emails

* Add tests on scripts/remove_unconfirmed_emails.mjs

* Update audit log so `removedEmail` is a string and doesn't break the admin-panel audit logs list

* Update remove_unconfirmed_emails to have a `--generate` and a `--consume` mode

* Update tests on remove_unconfirmed_emails

* Add tests checking that `--consume` doesn't delete any email

* Update script so `--consume` checks that emails shouldn't be deleted again!

* Update CSV path to `/tmp/...`

* Add test cases: deleted users, deleted email, comma in email

---------

Co-authored-by: Rebeka <rebeka.dekany@overleaf.com>
GitOrigin-RevId: 8c60b56bcdfa33bc6143d66c32a5f430fb76f6d7
2025-02-18 09:05:10 +00:00
Jakob Ackermann b79af7f6d3 [server-ce] upgrade mongo to 6.0 in e2e tests (#23611)
* [server-ce] upgrade mongo to 6.0 in e2e tests

* [server-ce] upgrade mongo to 6.0 for CE dev-env

GitOrigin-RevId: 6a76297d32177a8b5a067d325e74bdb01971af30
2025-02-18 09:04:55 +00:00
Davinder Singh 39884d8199 Merge pull request #22733 from overleaf/ds-sso-login-redesign-bs5-2
Website Redesign & BS5 migration - SSO Login page (2)

GitOrigin-RevId: d0d5752e2ce84a70dfb50a3de0c200c468de0cb8
2025-02-18 09:04:43 +00:00
Davinder Singh 0c8e31708a Merge pull request #22716 from overleaf/ds-sso-login-redesign-bs5
Website Redesign & BS5 migration - SSO Login page

GitOrigin-RevId: 9c819479c7ca6510d2e683881564427c91c4f04e
2025-02-18 09:04:38 +00:00
Eric Mc Sween b507c8e1bb Merge pull request #23612 from overleaf/em-find-dangling-comments
Add script to find projects with dangling comments

GitOrigin-RevId: 31048defa2f33c2bf23d14ddc643366775df3104
2025-02-18 09:04:34 +00:00
roo hutton e954afa1c2 Merge pull request #23618 from overleaf/rh-compile-timeout-paywall-event-tracking
Add events to compile timeout paywall

GitOrigin-RevId: 2982e1a8c6494bafbc3137a25f5e9eb08182812b
2025-02-18 09:04:26 +00:00
Kristina 61f4e3f9d5 [web] fix UI regressions on share modal (#23542)
* restore `yellow-40` to the warning label
* adjust actions layout so dropdown always stays readable

GitOrigin-RevId: 60886cd71e7041976fe2467cf7ab946a6ef90be6
2025-02-18 09:04:21 +00:00
CloudBuild 3a898e2b61 auto update translation
GitOrigin-RevId: 3ef229bb22a6986ab693076b4386a0258acc8cbb
2025-02-17 09:05:18 +00:00
Antoine Clausse ed3442ada6 [web] Update socket diagnostics: 2 columns, copy to clipboard (#23581)
* Use 2 columns for socket diagnostics

* Fixup time so it's never negative

* Add "Copy to clipboard" feature

GitOrigin-RevId: ba7bcc672287c2697afadd904ade315b4a39f954
2025-02-17 09:05:07 +00:00
Antoine Clausse 5d42e51d3e Remove feature-flag bootstrap-5-subscription (#23114)
GitOrigin-RevId: 4a8dadb7e5ae65c2651b1eeb317bb43daca881c8
2025-02-17 09:05:02 +00:00
Andrew Rumble ccb2791a0d Merge pull request #22646 from overleaf/ar-address-mongo-count-deprecation-warning
[web] Switch from find.count to countDocuments

GitOrigin-RevId: cc607868334d54b3d5c375c06fec97a482a16cc5
2025-02-17 09:04:58 +00:00
Alf Eaton 784d107472 Skip "should not flag affiliations outside of notification period" test (#23619)
GitOrigin-RevId: 060158f5b3958577c3c1ebde8490cad2c763da88
2025-02-17 09:04:53 +00:00
Alf Eaton 4611de3f3d Update tooltip text for search buttons (#23448)
GitOrigin-RevId: d189aac06c5f68e009eeb125d7cc225b41e8cc0c
2025-02-17 09:04:45 +00:00
Davinder Singh cd7b1bf649 Compile timeout- Adding the paywall component (#23606)
* adding the upgrade prompt component

* adding the container queries for cards

* removing comment

* styles:lint:fix

* adding ? for checking

GitOrigin-RevId: 63250f73fa543b510423835633de04eff69c47c5
2025-02-17 09:04:40 +00:00
Mathias Jakobsen 05045ee9f7 Merge pull request #23607 from overleaf/mj-papers-default-on
[third-party-references+web] Default to personal library in Papers integration

GitOrigin-RevId: 0a5a3de273341c1f5d5bd50b9c0f8fe98cd7504e
2025-02-14 09:04:27 +00:00
Mathias Jakobsen 7cf2359a62 Merge pull request #23545 from overleaf/mj-dp-labs-bs5
[web] Convert labs participation page to BS5

GitOrigin-RevId: 6a471b5162ee8485f2744157f29d1b94b59c8d4c
2025-02-14 09:04:24 +00:00
Mathias Jakobsen f7c4df8d04 Merge pull request #23582 from overleaf/mj-material-icon-font-test
[web] Add cypress test for MaterialIcon variants

GitOrigin-RevId: 816ee12e8d50482c0b4fd05adc0511445d82ca8d
2025-02-14 09:04:20 +00:00
Davinder Singh 60eaca8301 only displaying the new paywall component for project owners (#23586)
GitOrigin-RevId: f30c5abd2db361742a1a35d5147ac83345fe44a8
2025-02-14 09:04:14 +00:00
Davinder Singh de50b9b76c Compile timeout paywall after message: Adding the correct translations (#23564)
* adding the right translations to match figma

* adding 2 more translations

* adding the correct styling for the translation

* adding the last translation

* removing unused button and extra line

* adding the p tags and necessary styling to remover margin bottom

GitOrigin-RevId: 97c47e53ee4ae13e95027c602521258f056a6bed
2025-02-14 09:04:10 +00:00
MoxAmber 420c3881c2 Merge pull request #23503 from overleaf/as-compile-timeout-paywall-primary
[web] Create UpgradePrompt paywall component

GitOrigin-RevId: 591eaae0c179c7419f8ec93284cebb3ecfc52154
2025-02-14 09:04:07 +00:00
Liangjun Song be33d0dd67 Merge pull request #23599 from overleaf/ii-flexible-group-licensing-vat
[web] Change "Sales tax" to "VAT"

GitOrigin-RevId: 549c6cea7bcb52d08d3b0967cf5fa446da901379
2025-02-14 09:04:03 +00:00
David 8e18162491 Merge pull request #23595 from overleaf/dk-can-review-order
Swap the order of "can view/can review" options

GitOrigin-RevId: d58a4633b02be1bcf28f7c483c046fa18a97adb6
2025-02-14 09:03:59 +00:00
ilkin-overleaf 4c60432229 Merge pull request #23563 from overleaf/ii-flexible-group-licensing-errors
[web] Flexible licensing error handling

GitOrigin-RevId: 9fd4992a81e67b0684d3e286492e0037dd56e2ea
2025-02-14 09:03:52 +00:00
roo hutton be8adaf142 Merge pull request #23472 from overleaf/rh-timeout-paywall-plans
Expose plan prices to compile timeout paywall

GitOrigin-RevId: 33ee11bc0b770a2786931894ba9ae57312a7efa9
2025-02-14 09:03:45 +00:00
Domagoj Kriskovic 8183c0785c Validate privilege levels when sending /invite request (#23533)
* Validate privilege levels when sending /invite request

* add acceptance tests

GitOrigin-RevId: 4ccd0ad3504c3c5770f5ee2b2f6d34ef746d1430
2025-02-14 09:03:37 +00:00
Brian Gough d2738fda73 Merge pull request #23565 from overleaf/bg-fix-history-metadata-in-projects-collection
fix history metadata in projects collection

GitOrigin-RevId: 18c821ef5966a8470b24dfa60313b09bdda9707d
2025-02-14 09:03:33 +00:00
Jakob Ackermann 6bea6a887d [web] decrease concurrency for thread-loader when running tests (#23567)
GitOrigin-RevId: 4aac1bf478af8a12c96765eafd4adfbaaf8b4a22
2025-02-13 09:07:04 +00:00
Jakob Ackermann add8c3d120 [web] start webpack/pug build with low priority before all tests passed (#23569)
GitOrigin-RevId: 6fa6c6cd3c12fd28aad3d46cf8870bcef6b67a37
2025-02-13 09:07:00 +00:00
Jakob Ackermann da31539306 [web] use a tmpfs for the data-dir of the acceptance tests (#23571)
Moving mongodb onto a tmpfs requires too much memory.

GitOrigin-RevId: e870ed8b5349c13e948f7037369fb52356cd562c
2025-02-13 09:06:55 +00:00
David b974b501f4 Merge pull request #23576 from overleaf/mj-ide-redesign-font
[web] Update material symbols unfilled font

GitOrigin-RevId: 1d6fab495d9b1a24702a94bcfc5a32673186f725
2025-02-13 09:06:47 +00:00
David 1d648f9755 Merge pull request #23502 from overleaf/dp-pdf-typescript
Convert PDF Preview components to typescript

GitOrigin-RevId: 34594d21143727fa42b8b595aa12125a4dd7ae5e
2025-02-13 09:06:41 +00:00
Jakob Ackermann 1a45b909c3 [web] tweak logging for CI containers (#23570)
The default logger is "json-file", which writes json blobs and splits
stdout and stderr. We do not need to split and also can save on extra
serialization overhead in the docker daemon by switching the driver.

- use the cheaper "local" driver for containers that we need logs from
  (test containers), the local driver streams stdout+stderr into a file
- use the no-op "none" driver for support containers that we do need any
  logs from.

GitOrigin-RevId: 55c7cb7c91860e192b6d54354f4550a0ee9a672c
2025-02-13 09:06:30 +00:00
Jakob Ackermann b928e865b7 [web] make user feature changes in tests more reliable (#23557)
* [web] tests: rename User.upgradeFeatures to User.upgradeSomeFeatures

The upgrades features do not match with any plan.

* [web] make user feature changes in tests more reliable

* [web] fix schema for featuresOverride in tests

* [web] log in after upgrading features

GitOrigin-RevId: ac5b19c798712926c118b221c553540b413802cd
2025-02-13 09:06:21 +00:00
Jakob Ackermann cd5d2da2d2 [web] tweak trigger for prefetching of test images (#23568)
GitOrigin-RevId: 53e7005049809627b071c4bf59493874762121fd
2025-02-13 09:06:16 +00:00
Jakob Ackermann d954fd5498 [web] dumpFolder is created on app start (#23559)
GitOrigin-RevId: e05c920f27a79a59e0c9408780b9c005b0dac350
2025-02-13 09:06:11 +00:00
M Fahru 84c66d5eae Merge pull request #23350 from overleaf/mf-nudge-to-annual-test
[web] Implement "Nudge to annual" split test

GitOrigin-RevId: 8dcd042fc54ede601f6db95a61feebaf15c849b6
2025-02-13 09:06:07 +00:00
M Fahru 9fe43e2f0d Merge pull request #22914 from overleaf/mf-remove-new-design-in-plans-page
[web] Remove "new-design" and "new" from plans and interstitial payment page file names

GitOrigin-RevId: d506ec53756ae4ebb4a314bd19773dfe34af9a85
2025-02-13 09:06:02 +00:00
M Fahru b4051e48d3 Merge pull request #23305 from overleaf/mf-onboarding-data-collection-bs5
[web] Migrate onboarding collection data page to bootstrap 5

GitOrigin-RevId: ebf91db34ff11313c262bf57ad45e70d30857cd6
2025-02-13 09:05:58 +00:00
Eric Mc Sween 879aa33cbe Merge pull request #23519 from overleaf/em-remove-ordered-rejections-flag
Remove orderedRejections flag on ops

GitOrigin-RevId: df464023e7e6c3b5899e6a424f423a374fd33df6
2025-02-13 09:05:53 +00:00
Miguel Serrano 1a5db4b385 Merge pull request #23551 from overleaf/msm-git-bridge-update-deps
[git-bridge] Upgrade dependencies, use aws-s3 lib

GitOrigin-RevId: a542810d425309e8356ebc77752266b41f6006f4
2025-02-13 09:05:49 +00:00
Mathias Jakobsen dfb7ab3433 Merge pull request #23496 from overleaf/mj-wc-dropdown-style
[web] Match dropdown styles in W&C RM settings

GitOrigin-RevId: 3765358c2f8ae7257054fb4f6b882930784dc39a
2025-02-13 09:05:40 +00:00
Domagoj Kriskovic 09110a0a76 If reviwer, show only from project files option in figure modal (#23500)
GitOrigin-RevId: 88796fb9a51f82ac79bc849ef9225efcdf29ad35
2025-02-13 09:05:36 +00:00
Domagoj Kriskovic 3251ebffdb Move "add comment" widget below edit mode switcher (#23507)
GitOrigin-RevId: cd1ca5b93bba5604ea312133dc2f9166d5fe8c84
2025-02-13 09:05:31 +00:00
Jakob Ackermann d1410f4636 [web] avoid setting up users more than once in tests (#23558)
* [web] avoid setting up users more than once in tests

* [web] tests: simplify user exists check in User.setExtraAttributes

GitOrigin-RevId: 4c526df7c933a38ab93d7760efbd0a9490d5582a
2025-02-13 09:05:27 +00:00
Mathias Jakobsen dc0b214bb5 Merge pull request #22638 from overleaf/mj-reference-search-paywall
[web] Add paywall to W&C settings modal

GitOrigin-RevId: 388c7c14092ca0190dd532d126760c8f755c383f
2025-02-13 09:05:15 +00:00
Mathias Jakobsen c86343dd1d Merge pull request #22401 from overleaf/mj-updated-rm-promo-new-file
[web] Update paywall for RM import

GitOrigin-RevId: 9576cce28c50a7a0ec7e66073189337cfd9094b6
2025-02-13 09:05:10 +00:00
Jakob Ackermann 3de76b848f [web] split test_frontend_ct_core/test_frontend_ct_editor into two jobs (#23556)
* [web] split test_frontend_ct_editor into two jobs

* [web] split test_frontend_ct_core into two jobs

GitOrigin-RevId: 30f47003ca24ae71e443f130819b3ec600339193
2025-02-13 09:05:06 +00:00
ilkin-overleaf b689c0d3b1 Merge pull request #23550 from overleaf/ls-add-missing-space-in-faq
Add space in FAQ

GitOrigin-RevId: 3f926b00a44b4cee0ce561d4cf4395ad37bcc820
2025-02-13 09:05:01 +00:00
ilkin-overleaf bebc32b11d Merge pull request #23547 from overleaf/ii-flexible-group-licensing-error-assist-2
[web] Hide flexible licensing buttons for pending plans (fix)

GitOrigin-RevId: ce5b4ce4138ed7a029b840a87c5498227e3204f4
2025-02-13 09:04:57 +00:00
Jimmy Domagala-Tang 9f438f0805 Merge pull request #23544 from overleaf/revert-23516-jdt-institution-buttons-temp
Revert "Jdt institution buttons temp"

GitOrigin-RevId: b2a59ab9f917443fc8c9fdfc3c5035ce4c523fdd
2025-02-12 09:06:07 +00:00
Rebeka Dekany a9d4341a26 Merge pull request #23489 from overleaf/rd-fix-label-alignment-project-dashboard
[web] Fix the label alignment of tags

GitOrigin-RevId: fe0a530131148fc166b16c968dcec12a082a7413
2025-02-12 09:06:02 +00:00
Jimmy Domagala-Tang 22bf2ced21 Merge pull request #23516 from overleaf/jdt-institution-buttons-temp
Jdt institution buttons temp

GitOrigin-RevId: 42771f3047088bfa2bd1dfdd89eb990392dd113c
2025-02-12 09:05:51 +00:00
Eric Mc Sween 761c184c8f Merge pull request #23540 from overleaf/revert-23483-ii-flexible-group-licensing-error-assist
Revert "[web] Hide flexible licensing buttons for pending plans"

GitOrigin-RevId: 6e19c2ae2663fc0cf3335e9517e80a1eee9e2659
2025-02-12 09:05:46 +00:00
Domagoj Kriskovic 126648e597 Script for updating comment id to match the one from history (#23460)
* Script for updating comment id to match the one from history

* update multiple comments in a single query

* use array filters for updating comments

* log doc id

GitOrigin-RevId: ca4337591735d0d76d5599c19cc42628421ed14f
2025-02-12 09:05:42 +00:00
Domagoj Kriskovic 01e8159801 Drop "project_id" index in rooms collection (#23423)
GitOrigin-RevId: ed0bcda9066f3ff595aae1ce6011335aaac7aaf0
2025-02-12 09:05:37 +00:00
Eric Mc Sween 510ad0ce9a Merge pull request #23509 from overleaf/em-fix-remove-change
Fix RangesTracker._removeChange() when multiple changes have the same id

GitOrigin-RevId: 2dafcf275b283da320bca70b460aba3051ca9575
2025-02-12 09:05:29 +00:00
Jakob Ackermann 8e5ebd5512 [web] disable recording of cypress videos in CI (#23530)
GitOrigin-RevId: d3a14418a69a8bc009a137e168ba679b72e7c420
2025-02-12 09:05:25 +00:00
Jakob Ackermann 4983e760bb [web] use tmpfs for transferring /overleaf into cypress image (#23529)
GitOrigin-RevId: e913a4388be6feb6e0cddd098f64452bfa0e7ef7
2025-02-12 09:05:20 +00:00
ilkin-overleaf f032b47744 Merge pull request #23508 from overleaf/ii-flexible-group-licensing-change-plan-cta
[web] Subscription page change plan cta

GitOrigin-RevId: aa1ae2e00cbe49fb2f661204025ef4c32393b457
2025-02-12 09:05:16 +00:00
ilkin-overleaf 58ece71c7a Merge pull request #23483 from overleaf/ii-flexible-group-licensing-error-assist
[web] Hide flexible licensing buttons for pending plans

GitOrigin-RevId: 8e9b65ae9b68cdd838442e8b45f3bd8f22e72349
2025-02-12 09:05:11 +00:00
ilkin-overleaf 93dd1fea2d Merge pull request #23498 from overleaf/ii-flexible-group-licensing-paused-subscription
[web] Paused subscription support

GitOrigin-RevId: 76482011f9a75786722b4cc0c074e8c2ac3d6fb4
2025-02-12 09:05:07 +00:00
ilkin-overleaf 61ddc73d87 Merge pull request #23488 from overleaf/ls-display-add-on-with-pending-cancellation
Display addOn that has pending cancellation

GitOrigin-RevId: 5fde493d1b706a1708e0cb4a2de6a7682fb1d1e0
2025-02-12 09:05:02 +00:00
Jakob Ackermann 0f57110de0 [web] upload to CDN buckets concurrently (#23494)
* [web] upload to CDN buckets concurrently

* [web] documentation for detaching, recording of pid and waiting

GitOrigin-RevId: abdb357771d9c5e34330827b146ae43eb6146675
2025-02-12 09:04:58 +00:00
Kristina 14cb64df6b [web] migrate secondary confirm email page to bootstrap 5 (#23452)
GitOrigin-RevId: 39ff8856d40033df802a3d811c53d12f94e7d0ed
2025-02-12 09:04:46 +00:00
Kristina 53d8f365c7 [web] update time period string on group plans (#23465)
GitOrigin-RevId: b62991ffe122cae877c0d05b71d29619e25684d9
2025-02-12 09:04:42 +00:00
Kristina 03cd878d94 [web] migrate token access page to bs5 (#23474)
GitOrigin-RevId: 2a6c148aa52bfa109ba8a072ff7fb6dbd559ebb3
2025-02-12 09:04:37 +00:00
Davinder Singh 09ab193239 Compile timeout Paywall - Adding the second component that will be displayed after paywall dismissal (#23413)
* copy pasting the code into new redesign file from old paywall file

* creating a new file for redesign - pdf-log-entry-redesign and copy pasting the old file content for now

* adding redesign file for header and copy pasting old file content for now

* using pdf-log-entry-redesign

* adding first round of styling for headint title under BS5 styling

* adding hasBorder property on the inhouse button component

* adding a cta container for 2 buttons

* adding the icon and fixing the class hierarchy

* fixing the spacing so spacing matches the figma design

* adding a translation for heading

* adding bg color and spacing for heading

* removing no thanks button

* changing the font size

* adding the link colors

* adding the required spacing on the new website redesign logs pane components

* seperating the whole component into a new component TimeoutMessageAfterPaywallDismissal for easy display later in

* removing the class that I had added earlier

* deleting the website redesign folder because files dupliocated in that folder did not have any content changes, redesign only needs styling changes for now

* adding try for free translation

* adding the unfilled icon and ficing the heading sizew

* fixing the padding of log-entry-formatted-content

* running npm run extract-translations

GitOrigin-RevId: 810ddd6037cbad0761ea23a9a2e0693a7ad7130a
2025-02-11 09:04:46 +00:00
Domagoj Kriskovic 32bb4d36bb Create new projectId_1_threadId_1 index for rooms collection (#23422)
GitOrigin-RevId: 180799e5b045ba7f07e1dbda5b9d25b52741bd14
2025-02-11 09:04:42 +00:00
Domagoj Kriskovic 0eaa0c47e4 Added new analytics events for reviewer role (#23382)
* Added analytics for review mode switcher

* Added "collaborator-role-change" analytics event to edit-member.tsx

GitOrigin-RevId: 030e9208de088898ef112e951fe301799a27277e
2025-02-11 09:04:37 +00:00
Jakob Ackermann 68edbab74f [web] split non-editor frontend cypress tests into core vs modules (#23490)
* [web] split non-editor frontend cypress tests into core vs modules

* [web] skip docker compose down before starting frontend tests

We are already skipping it for all the other test targets.

GitOrigin-RevId: 9f5938198b7885f0e5bcaf77964e776e66002037
2025-02-11 09:04:32 +00:00
Jakob Ackermann 0a7b2004d2 [misc] silence logger when running tests (#22243)
* [misc] silence logger when running tests

* [misc] re-enable logging in some tests for scripts

* [misc] make it easy to turn on verbose logging for tests

```
LOG_LEVEL=debug make test_unit
LOG_LEVEL=debug make test_acceptance
```
GitOrigin-RevId: 219bc6d1f9cbdb89ddd7d94742920913ddde4514
2025-02-10 09:06:02 +00:00
Eric Mc Sween 064baf31ad Merge pull request #23478 from overleaf/em-doc-hash-diff
Fix doc hash on delete + insert combination

GitOrigin-RevId: ecea5f8ab01f24a9064be88611256b502500d91f
2025-02-10 09:05:38 +00:00
Jakob Ackermann b5f96b50c0 [web] disable filestore writes (#23470)
GitOrigin-RevId: 96ccd9205f9bf21420e67aaa68f8bc035eeb87d8
2025-02-10 09:05:33 +00:00
Liangjun Song 12494acdf7 Merge pull request #23463 from overleaf/ii-flexible-group-licensing-supported-users-copy
[web] Subscription page additional licenses copy

GitOrigin-RevId: 5e14792798195718a98ee1efae1a964037a32b62
2025-02-10 09:05:25 +00:00
Liangjun Song f3950e20a0 Merge pull request #23464 from overleaf/ii-flexible-group-licensing-missing-billing-details-2
[web] Missing billing info billing details link

GitOrigin-RevId: a77f5d637848cc9ba5efa0941052ab5e10be16e4
2025-02-10 09:05:20 +00:00
Liangjun Song 4ab827bf0f Merge pull request #23442 from overleaf/dp-table-label-bug
Use css variable to set insert table label color

GitOrigin-RevId: f99de70c470ca15927ee7ad38d004f94365519ac
2025-02-10 09:05:15 +00:00
Liangjun Song eb5417fad5 Merge pull request #23462 from overleaf/ls-update-pricing-logic-for-small-educational-plans
Update pricing logic for small educational plans

GitOrigin-RevId: 0051f238ce50b2067b7dc75d08f55dc1c7ac3502
2025-02-10 09:05:11 +00:00
Jakob AckermannandBrian Gough 64e8d2b8b3 [history-v1] fix backup deletion for postgres projects (#23466)
* [history-v1] fix backup deletion for postgres projects

* [history-v1] convert historyId to string on assignment

Co-authored-by: Brian Gough <brian.gough@overleaf.com>

---------

Co-authored-by: Brian Gough <brian.gough@overleaf.com>
GitOrigin-RevId: 5e1033972745a9b72606638f56ebf2147406cc39
2025-02-10 09:05:06 +00:00
Tim Down 3082e4c5cc Merge pull request #23220 from overleaf/td-bs5-paused-plan-remove-bs3
Remove Bootstrap 3 styles from paused plan widget

GitOrigin-RevId: 1f04ab5c356f60330a9c5266b81de114dd81f943
2025-02-10 09:05:01 +00:00
Jakob Ackermann b0534b7f85 [web] restore downloading from history-v1 via legacy file endpoint (#23450)
GitOrigin-RevId: f6d12cfe445c7c41a62a563c9a5e7089bf94344f
2025-02-07 09:06:52 +00:00
CloudBuild 1aec79d726 auto update translation
GitOrigin-RevId: 3e637f00e1a54160e992e6c9cfc277e554677301
2025-02-07 09:06:45 +00:00
Jimmy Domagala-Tang a249c8e643 Merge pull request #23248 from overleaf/jdt-institutional-policies-include-past-affiliates
Policy checks apply for lapsed affiliates

GitOrigin-RevId: b4d42a2dc2d43b531886fb4eb8c4c6d990e324e7
2025-02-07 09:06:41 +00:00
David e43da5569c Merge pull request #23406 from overleaf/dp-share-submit-buttons
Connect up share and submit project buttons in new editor

GitOrigin-RevId: 6eb4ef82662b8de3f59417b6a2d8d5fcf125a579
2025-02-07 09:06:34 +00:00
David f219744fdd Merge pull request #23344 from overleaf/dp-file-tree-toolbar
Update file tree toolbar in new editor

GitOrigin-RevId: 11ca678b50e0c525ae60b806dfbc08773b661b7b
2025-02-07 09:06:30 +00:00
David bd76193eb5 Merge pull request #23300 from overleaf/mj-ide-menu-hover
[web] Introduce menu bar shared component

GitOrigin-RevId: c304cc4e1e5961fe4ef7d2112e8d9f91c47dd0ec
2025-02-07 09:06:26 +00:00
David b5c11370d6 Merge pull request #23384 from overleaf/mj-ide-collapsible-rail
[web] Make panels collapsible in editor redesign

GitOrigin-RevId: bc979e3b6028666d3e0aa751e341d838615c1aac
2025-02-07 09:06:22 +00:00
M Fahru 37444c5eef Merge pull request #23063 from overleaf/mf-teardown-bs5-homepage
[web] Tear down bs5-homepage feature flag and remove bs3 homepage code

GitOrigin-RevId: f7fca07c0fb958682c6eed7fdf824818c1039be7
2025-02-07 09:06:18 +00:00
M Fahru 431cba20ca Merge pull request #23400 from overleaf/mf-add-fedramp-group-tab
[web] Add FedRamp info in plans page group tab

GitOrigin-RevId: 4d3869f99ab63abb124a964f92069943f5212af4
2025-02-07 09:06:14 +00:00
Eric Mc Sween 9893f18ca5 Merge pull request #23447 from overleaf/em-reduce-validation-error-logs
Only log validation errors once per flush

GitOrigin-RevId: ee3f656c4c7c09fd7f3ff2462278c9aef81b9bb5
2025-02-07 09:06:10 +00:00
Eric Mc Sween 3c1f20a6d1 Merge pull request #23433 from overleaf/em-do-not-store-content-hashes
Do not store content hashes in chunks

GitOrigin-RevId: 65a255b92f9c4e216ad5a1fb5fb3fa5a6b9158c4
2025-02-07 09:06:03 +00:00
Eric Mc Sween ce4c8a4e47 Merge pull request #23398 from overleaf/em-log-doc-hash-mismatches
Validate content hashes in history (log only)

GitOrigin-RevId: ed772fc4e4d0aa9e980f9693a759647bd937e13a
2025-02-07 09:05:59 +00:00
Liangjun Song 735fd761cd Merge pull request #23372 from overleaf/ls-update-pricing-logic-for-seats-adding
Update pricing logic for seats adding

GitOrigin-RevId: 8312941c88ade2e5ee83c806939628714880b416
2025-02-07 09:05:55 +00:00
Liangjun Song 5facec8ed2 Merge pull request #23238 from overleaf/ls-analytic-events-for-flexible-licensing
Implement analytic events for flexible licensing

GitOrigin-RevId: 2ac0b471616d6e4f80ade18934d7240618195a8a
2025-02-07 09:05:48 +00:00
Eric Mc Sween e145667a81 Merge pull request #23282 from overleaf/em-async-await-persist-changes
Convert the history changes import code to async/await

GitOrigin-RevId: 6421fcaaf3bac69a3404754f935b4902979b4689
2025-02-07 09:05:44 +00:00
Liangjun Song 3d0632e916 Merge pull request #23380 from overleaf/ls-update-faq-for-group-plans
Update FAQ for group plans

GitOrigin-RevId: 090b3e512d4f2da4b8bed5b19a9c991665a138ee
2025-02-07 09:05:40 +00:00
Liangjun Song b941439461 Merge pull request #23395 from overleaf/ls-display-discount-in-cost-summary
Display discount information in cost summary

GitOrigin-RevId: 95ff56b21b15e55860968e8ce4519c897b85ebba
2025-02-07 09:05:36 +00:00
Liangjun Song 58660cc9f2 Merge pull request #23409 from overleaf/ls-translation-for-single-license-purchase-confirmation
Update translation for single license purchase confirmation

GitOrigin-RevId: 5503c8c838814e3a56be75483699d5d4502d0acc
2025-02-07 09:05:32 +00:00
Liangjun Song 8421bcc5d2 Merge pull request #23415 from overleaf/ii-flexible-group-licensing-manually-collected
[web] Manually collected subscriptions with flexible licensing

GitOrigin-RevId: ca7cf2abf5cfa1d873614bf3407fb5a259a78a76
2025-02-07 09:05:28 +00:00
Liangjun Song d66c11e786 Merge pull request #23435 from overleaf/ii-flexible-group-licensing-add-seats-links
[web] Add seats links handling

GitOrigin-RevId: d53264277c24ec64b6ff7744b4d7e10a4234ac86
2025-02-07 09:05:24 +00:00
Liangjun Song ad9b409cf9 Merge pull request #23439 from overleaf/ii-flexible-group-licensing-subscription-add-on
[web] Add-on cancel button

GitOrigin-RevId: bdbcbf8820aa683f7bdb365eca331aa71455b687
2025-02-07 09:05:20 +00:00
Jakob Ackermann 668e9428f8 [history-v1] speed up tests for back-fill script (#23440)
* [history-v1] speed up tests for back-fill script

* [history-v1] move "should process nothing on re-run" test to the end

GitOrigin-RevId: d5180cfaefca3c46c440230eb3566539de1582bd
2025-02-07 09:05:16 +00:00
Alf Eaton 294079d55e Remove uses of editor scope values (#23312)
GitOrigin-RevId: 97e2188bc1363618b60f722fa317a5b240d5013b
2025-02-07 09:05:12 +00:00
Alf Eaton 9854d37916 Minimise use of ide context provider (#23308)
GitOrigin-RevId: 468b8d4b33925bdb97bd46d2c4e7acb969f3d82b
2025-02-07 09:05:05 +00:00
Jakob AckermannandBrian Gough 26321c5dba [history-v1] block deletion of bucket prefix that is not a valid project prefix (#22889)
Co-authored-by: Brian Gough <brian.gough@overleaf.com>
GitOrigin-RevId: a3aff76a2e299b2e2ed030e34da0631fce51ad4b
2025-02-07 09:05:01 +00:00
Alf Eaton 185c53bd70 Restore return on join doc error (#23377)
GitOrigin-RevId: df03621221ecacffe50cb805fd3a2fd71ce773a7
2025-02-07 09:04:57 +00:00
Eric Mc Sween 7632bed1fe Fix full project search shortcut for Linux/Windows (#23430)
GitOrigin-RevId: e90baa04529ece283da794eeeb0bd322c7a74b51
2025-02-07 09:04:53 +00:00
Alf Eaton 91fb235030 Set font-variant-numeric: slashed-zero (#23416)
GitOrigin-RevId: 8a1ebecfe513226db75db431a05315064d6610d6
2025-02-07 09:04:36 +00:00
Alf Eaton 36392832d5 Remove unused EventLog (#23419)
GitOrigin-RevId: 25e09466c2a16545436fd9c312431f78e68b3194
2025-02-07 09:04:32 +00:00
Domagoj Kriskovic 543e15b846 Fix select widget width in share modal (#23426)
GitOrigin-RevId: 5912a315ac9bc634ca1b7ce9645c23a5e590461d
2025-02-07 09:04:25 +00:00
Domagoj Kriskovic e76baa9cb4 Prevent expanding for ide-react-main element (#23405)
GitOrigin-RevId: 099f603b206cfa062fccd7577368f32062f15df4
2025-02-07 09:04:21 +00:00
Kristina ac15073a52 [web] update e2e tests to look for new strings (#23425)
GitOrigin-RevId: 62c513369adcd003db0aac6a3777eb0a98bf3289
2025-02-07 09:04:17 +00:00
M Fahru 9b9d002f9b Merge pull request #22913 from overleaf/mf-remove-old-plans-page-css
[web] Remove old plans page `less` files

GitOrigin-RevId: 1216f87ce487848bf7d6dcf4ffea661761307e97
2025-02-06 09:04:55 +00:00
Brian Gough 25d9ef33c5 Merge pull request #23420 from overleaf/bg-add-plimit-to-history
add plimit to history-v1

GitOrigin-RevId: bae1b12b2031100144afc797094dba95524a8a3e
2025-02-06 09:04:48 +00:00
Jakob Ackermann 6b8a50eb92 [project-history] trim logging (#23408)
* [project-history] trim logging when projectVersion is out of order

* [editor-core] record reason rather than full pathname when not clean

* [editor-core] remove pathname from error messages

* [project-history] avoid logging updates when historyId is inconsistent

* [project-history] avoid logging failed history-v1 requests repeatedly

* [project-history] log once when doc version is out of order in chunk

GitOrigin-RevId: 5ac431ac87b57c00fac9d5ab486ca305b1775372
2025-02-06 09:04:35 +00:00
Jakob Ackermann 81aab1e159 [misc] fix logger.error(err) and logger.warn(err) calls (#23369)
* [misc] fix logger.error(err) calls

The signature is "logger.error({ err }, 'MESSAGE')".

* [project-history] remove duplicate logger.err calls in health check

The call-site is already logging any errors. Also, the logger.err call
signature was not quite right.

* [web] log userId when removeDropbox/removeGithub hook fails

* [misc] fix logger.warn(err) calls

The signature is "logger.warn({ err }, 'MESSAGE')".

* [misc] fix logger.error(OError.tag(err)) calls

* [web] make eslint happy

GitOrigin-RevId: 7f528113a3f7e9f6293b7d2d45adc079380325bb
2025-02-06 09:04:31 +00:00
Mathias Jakobsen 67f3c468a1 Merge pull request #23274 from overleaf/mj-restore-main-history
[web] Restore main documents with metadata as docs

GitOrigin-RevId: f3664689704e9098c2b9e317d65e4ab2633320cb
2025-02-06 09:04:26 +00:00
roo hutton 77fa5cf784 Merge pull request #23359 from overleaf/rh-roles-e2e-fix
Fix cross-module import in compile timeout paywall

GitOrigin-RevId: a54226c8bef65e0483a3eee614f0ab54f5828c97
2025-02-05 09:07:27 +00:00
Rebeka Dekany ff92b70a7f Merge pull request #23217 from overleaf/rd-deleted-project-admin-migration-bs5
Migrate the admin deleted project page to Bootstrap 5

GitOrigin-RevId: 14992922a3476248de5ca7a04bc478e817da51a1
2025-02-05 09:07:03 +00:00
CloudBuild 25378de222 auto update translation
GitOrigin-RevId: 3bf5e1471dd406eecb0fb6862f6b1d7b62f7aad4
2025-02-05 09:06:59 +00:00
Brian Gough b2ff14f669 Merge pull request #23375 from overleaf/bg-add-id-checks-for-chunks
guard against non-postgres projectIds

GitOrigin-RevId: eab2024e4e893591f4b1c6a507b26d935273ae5f
2025-02-05 09:06:54 +00:00
Brian Gough 9b073db24d Merge pull request #23368 from overleaf/bg-add-index-for-pending-change-at
add migration for creating index on overleaf.backup.pendingChangeAt

GitOrigin-RevId: b15f1b95d8dbbb08cd2ae4863a0501663130ab65
2025-02-05 09:06:50 +00:00
Jessica Lawshe c53a00eb48 Merge pull request #23087 from overleaf/jel-reg-no-sso
[web] Update message on registration page when org does not have SSO

GitOrigin-RevId: 4df9e33f60e9b12acb17fa56401d76a5188f121c
2025-02-05 09:06:43 +00:00
Jessica Lawshe 5e0dced989 Merge pull request #22966 from overleaf/jel-saml-error
[web] Check for requester errors in SAML callback

GitOrigin-RevId: 491d7c85e859c503bade3b225a4596656dbfe84f
2025-02-05 09:06:38 +00:00
Jessica Lawshe bcd61354a8 Merge pull request #22803 from overleaf/jel-sso-error-handling
[web] Better error when for missing user SAML callback data

GitOrigin-RevId: 0f781bc46a8684e183d4a860df00c29d6dc9193e
2025-02-05 09:06:31 +00:00
M Fahru 109cc90e34 Merge pull request #23303 from overleaf/mf-onboarding-confirm-email-bs5-migration
[web] Migrate onboarding confirm email page to bootstrap 5

GitOrigin-RevId: ccba9aa7c6b3767010d823a4373bf65bb026d3c4
2025-02-05 09:06:26 +00:00
Mathias Jakobsen d0c94a0a56 Merge pull request #23237 from overleaf/mj-ide-chat
[web] Add existing chat pane to the editor redesign

GitOrigin-RevId: 21b4c80b18ec1dc554f1eb2fac95994f0352fefc
2025-02-05 09:06:15 +00:00
Domagoj Kriskovic 69d309f6a0 Sync history and chat service resolve value on file restore (#23265)
* Sync history and chat service resolve value on file restore

* properly check resolved values

* delete resolved from emitted newCommentThreadData

* removed resolved from the comment range

GitOrigin-RevId: 6f3a14e2e14e48a2313d7b0942b6621bb42c472f
2025-02-05 09:06:11 +00:00
Domagoj Kriskovic 6d45fea773 Add "new-comment-threads" event handler for new review panel (#23298)
GitOrigin-RevId: 00628e6421a563f5157415d235ee5e7c2818e690
2025-02-05 09:06:07 +00:00
Domagoj Kriskovic 6ee3ff63e4 Dont show "add comment" tooltip when text is selected via search (#23341)
* Dont show "add comment" tooltip when text is selected via search

* remove the tooltip if selection changes

* handle empty selection

* use tr.effects.some for mouseUp check

* avoid creating new create function each time

* use useEventListener

GitOrigin-RevId: 18d96fe6fdefcd55f88849cf880f804d4c963f4d
2025-02-05 09:06:02 +00:00
Mathias Jakobsen 1ab971a2da Merge pull request #23374 from overleaf/dp-compile-button-2
Use old pdf compile button in new editor

GitOrigin-RevId: 85a1bacf94b3fb569f95fcea23a16f5f51f29bcd
2025-02-05 09:05:58 +00:00
ilkin-overleaf 4a927e45a6 Merge pull request #23117 from overleaf/ii-flexible-group-licensing-subscription-page
[web] Subscription page for flexible licensing

GitOrigin-RevId: 8f2fab1fc01e27063d716a86add66b1b9a72cbe6
2025-02-05 09:05:54 +00:00
ilkin-overleaf 16130b79db Merge pull request #23203 from overleaf/ii-flexible-group-licensing-no-billing-details
[web] FL handle subscriptions with missing billing info

GitOrigin-RevId: 34209299c039992a80da5739e086beb5d0ede7b0
2025-02-05 09:05:50 +00:00
ilkin-overleaf 72be034435 Merge pull request #23263 from overleaf/ii-flexible-licensing-subscription-group-handler
[web] FL check subscription existence

GitOrigin-RevId: b564d681245137955a8f1e7367b9bd1a6b404268
2025-02-05 09:05:45 +00:00
ilkin-overleaf fb8794921e Merge pull request #23314 from overleaf/ls-update-group-plan-upgrade-mapping
Update group plan upgrade mapping

GitOrigin-RevId: aca3d986477dbcf0561635dfd771413a2ba1ef15
2025-02-05 09:05:41 +00:00
ilkin-overleaf d9febc168e Merge pull request #23313 from overleaf/ls-feature-flag-for-consolidated-plans
Add a separate feature flag for consolidated plans

GitOrigin-RevId: e048bf51fa9481506f884ba04bb0ba1a0605b43c
2025-02-05 09:05:36 +00:00
ilkin-overleaf 667b97664c Merge pull request #23366 from overleaf/ii-flexible-licensing-add-seats-for-all-legacy-plans
[web] Add seats feature for smaller groups

GitOrigin-RevId: 7b0d1ea61eaaf603610d5fd8df399c00d328be70
2025-02-05 09:05:32 +00:00
Brian Gough 098d91f0bb Merge pull request #23345 from overleaf/bg-write-latest-history-version-to-project
update project entry with history metadata on chunk creation

GitOrigin-RevId: dd19898f3d16e2e3360ff1bcccbf79f7dd27addb
2025-02-05 09:05:28 +00:00
Alf Eaton c629355472 Only select content when opening a file if it matches the expected text (#23324)
GitOrigin-RevId: 8b180ab897bb9027743c37f2b7faf690b7177eb6
2025-02-05 09:05:23 +00:00
Alf Eaton 8406807552 Always wait for buffered ops before compiling (#23336)
GitOrigin-RevId: 1e586979897fb01378e449fe9dc9c7d269de83bb
2025-02-05 09:05:19 +00:00
Alf Eaton 87186eb568 Standardise naming of openDocId as openDocWithId or currentDocumentId (#23307)
GitOrigin-RevId: d71b6d878188c7b916f02a3749976ecd96d648a3
2025-02-05 09:05:15 +00:00
Alf Eaton d899144d43 Remove doc:opened event (#23310)
GitOrigin-RevId: e0613c4ac548b57786df6a28f433636485dbb2a7
2025-02-05 09:05:07 +00:00
Alf Eaton 341f84ca80 Return a promise from openDoc (#23309)
GitOrigin-RevId: a2801ce482e48a061269d819aff16a6c6e507955
2025-02-05 09:05:03 +00:00
Alf Eaton 797686939f Merge pull request #23284 from overleaf/ae-scope-event-types
Improve scope event types

GitOrigin-RevId: 5327c56a14244a2513748d3bcbac04413d104e12
2025-02-05 09:04:58 +00:00
Jimmy Domagala-Tang 4b1babd4ea Merge pull request #22965 from overleaf/jdt-async-institution-feats
Async await institution features utility

GitOrigin-RevId: ef24a189aab46d065925405a795709c94ff3d0b3
2025-02-04 09:05:29 +00:00
Jimmy Domagala-Tang 7f7c2408c8 Merge pull request #23281 from overleaf/jdt-opp-prompts-teardown
Opportunistic prompts teardown

GitOrigin-RevId: ccca9b043dce9abc5719371c3adcdf41ec6510c3
2025-02-04 09:05:25 +00:00
Jimmy Domagala-Tang 98b5bf2694 Merge pull request #23209 from overleaf/jdt-async-await-prj-entity-handler
Async/await the ProjectEntityHandler

GitOrigin-RevId: 873106c4ea56e13d864407b338a1924370ba6709
2025-02-04 09:05:21 +00:00
Miguel Serrano e73b3b4c9f [web] Ignore chat capability in CE/SP (#23297)
* [web] Ignore chat capability in CE/SP

* Allow usage of hasFeature('chat') for testing in saas

GitOrigin-RevId: 4ab5ffe2142353322e7955463f1beca524113d42
2025-02-04 09:05:14 +00:00
roo hutton 32793f7872 Merge pull request #23319 from overleaf/rh-compile-timeout-students
Expose ODC role to compile timeout paywall

GitOrigin-RevId: eca3983019200349e90b4681b59720c0028fb3b6
2025-02-04 09:05:10 +00:00
roo hutton 30335971cf Merge pull request #23339 from overleaf/rh-pause-subscription-id
Fix recurly subscription id in pause-scheduled event

GitOrigin-RevId: 94838bddd53c9b9a051cae8252eca11b01e96c60
2025-02-04 09:05:06 +00:00
Eric Mc Sween 39842c9857 Merge pull request #23250 from overleaf/em-project-history-doc-hash
Propagate the doc hash from project-history to history

GitOrigin-RevId: 341df52df41f7a5f8dbebbce53a47f9d5e1f8175
2025-02-04 09:05:03 +00:00
Jakob Ackermann f727389b2b [project-history] make logging of latency in resync script optional (#23325)
GitOrigin-RevId: ee6863e05be648757ccaa96a0321085fe42f508f
2025-02-04 09:04:59 +00:00
3a4c5a0d0f [history-v1] add readOnly lookup for raw chunks (#23318)
* [history-v1] add readOnly lookup for raw chunks

Co-authored-by: Eric Mc Sween <eric.mcsween@overleaf.com>

* [history-v1] reduce min poolsize for readOnly pool to 0

Co-authored-by: Brian Gough <brian.gough@overleaf.com>

---------

Co-authored-by: Eric Mc Sween <eric.mcsween@overleaf.com>
Co-authored-by: Brian Gough <brian.gough@overleaf.com>
GitOrigin-RevId: a711c4ee4f3ea3775bd090e620d1ef52689fa1f4
2025-02-04 09:04:52 +00:00
Brian Gough 01ed0c10a0 Merge pull request #23317 from overleaf/bg-improve-real-time-ping-logs
Add connection details to real-time ping logs

GitOrigin-RevId: f993d71deb1a512295af6c7146a19b730742e33f
2025-02-04 09:04:48 +00:00
roo hutton 864599b325 Merge pull request #23172 from overleaf/rh-pause-pending-plan-change
Don't offer subscription pause if plan change is pending

GitOrigin-RevId: e91897fab2d003dc3ef7486e609a8b907e376a1f
2025-02-04 09:04:41 +00:00
Jakob Ackermann 5404dcb93d [misc] update build scripts (#23316)
* [misc] update build scripts

* [misc] make shellcheck happy

GitOrigin-RevId: 343655fda54aa7e835dd666dcd4218d61c58fd09
2025-02-04 09:04:37 +00:00
Kristina 70a17768a3 Merge pull request #23268 from overleaf/kh-rm-dead-link-sharing-code
[web] remove deprecated project sharing modal

GitOrigin-RevId: 7b25918363c27154e0000e9497847217f2317fce
2025-02-04 09:04:33 +00:00
Kristina 229cae771e Merge pull request #23259 from overleaf/kh-rm-dead-manager-code
[web] remove unused functions to support legacy read/write link sharing

GitOrigin-RevId: 504c1eb721caa7131ed685b1e0fa5e0d0b460888
2025-02-04 09:04:29 +00:00
Kristina e3fdcdd601 Merge pull request #23131 from overleaf/kh-teardown-link-sharing-split-tests
[web] tear down link sharing split tests

GitOrigin-RevId: 449e9f368405aea1500035269428e7ae0c37d8fb
2025-02-04 09:04:25 +00:00
Brian Gough 8831fb9a18 Merge pull request #23169 from overleaf/bg-export-global-blobs
Add script to export global blobs to CSV

GitOrigin-RevId: 86c885981b150aae4541770a094c822e1fb364b9
2025-02-03 09:05:53 +00:00
Davinder Singh 423c2ba7e7 Merge pull request #23285 from overleaf/ds-compile-timeout-paywall-split-test
Compile timeout paywall - Setting up the split test

GitOrigin-RevId: c91c25c167daffdcd7b86fddf33e1867f90d0f4a
2025-02-03 09:05:48 +00:00
Jakob Ackermann c6c623da78 [project-history] script for fixing-up files/metadata with bulk resync (#23184)
* [history-v1] add cheap endpoint for checking time of last history write

The /raw endpoint skips the GCS lookup for the chunk.

* [project-history] script for fixing-up files/metadata with bulk resync

* [project-history] upgrade structure only resync when full sync is needed

* [project-history] start resync and process resync updates under lock

* [project-history] stop retrying during graceful shutdown

GitOrigin-RevId: 73184d5786e1d40f5b7e21f387fc37cf43f0ac2d
2025-02-03 09:05:43 +00:00
Jakob Ackermann b0c9176634 [project-history] add resync for project structure only (#23271)
* [project-history] add resync for project structure only

* [project-history] block resyncProjectStructureOnly that update docs

* [project-history] tweak test description

GitOrigin-RevId: ce2749566c36e04dab21c26dd60dd75d93c0d4c0
2025-02-03 09:05:39 +00:00
Jakob Ackermann 8df7f6772c [web] close connection permanently when opening out-of-sync modal (#23148)
* [web] close connection permanently when opening out-of-sync modal

* [web] disable generic forceDisconnected behavior for out-of-sync modal

* [web] hide "disconnected" banner when displaying out of sync modal

GitOrigin-RevId: 133b3e24d94279917298ce7fd5d0a76da2265512
2025-02-03 09:05:34 +00:00
Jakob AckermannandDr. Sasha Göbbels cebaebc356 [web] add migration for indexing onboardingDataCollection.updatedAt (#22918)
Co-authored-by: Dr. Sasha Göbbels <sasha.goebbels@overleaf.com>
GitOrigin-RevId: 6dbd3e994dc3ebc3ef9afd6d3e3efe00606ba127
2025-02-03 09:05:29 +00:00
Domagoj Kriskovic c0caaa20c3 Create missing dropboxEntities mongo index (#23257)
GitOrigin-RevId: cddcb63371f45c42482e42c6fdcc16f83aa41877
2025-02-03 09:05:21 +00:00
Domagoj Kriskovic f2c6a7ddb4 Refactor review panel position-items function (#22969)
GitOrigin-RevId: 929e7f2b90ac21cb68117d66ca599120cc765fab
2025-02-03 09:05:10 +00:00
Domagoj Kriskovic 97562c0042 Debounce position updates in review panel for improved performance (#23190)
* Debounce position updates in review panel for improved performance

* move debounce inside useMemo

* move 'review-panel:position' inside debounce

GitOrigin-RevId: 2b2d0e59537875f85036b0105ccb1a7d2035c0de
2025-02-03 09:05:05 +00:00
Domagoj Kriskovic 14dedf0101 Prevent adding multiple replies by hitting enter while submitting (#23240)
GitOrigin-RevId: 342aa30f89f3ac0b0b25ab931dd4df1d956aa4a1
2025-02-03 09:05:00 +00:00
Alf Eaton 32a27c14b4 Add memoized FormatTimeBasedOnYear component (#23199)
GitOrigin-RevId: 1f26ca9c0dbbda639939736f1e6a0c236e38a160
2025-02-03 09:04:52 +00:00
Alf Eaton 5e491cc0c0 Use thread id in removeNewCommentRangeEffect (#23205)
GitOrigin-RevId: 6082f5e6d6f548eff43da657526097118a2d3c11
2025-02-03 09:04:48 +00:00
Brian Gough a6bfbad5bd Merge pull request #23246 from overleaf/bg-real-time-server-ping
add real-time ping-pong messages for debugging lost connections

GitOrigin-RevId: 28feb8c8c7c660a5a23ca394acd0f69ac828c5a3
2025-02-03 09:04:39 +00:00
M Fahru e042233dd9 [web] Fix bug where VAT value isn't retained properly when changing plan without reloading (#23211)
Fix VAT info is not properly updated when changing plan without reloading.

I removed `setPlan` and created a new function: `updatePlan`. In the new function, I call the recurly function directly and the tracking code. This way, we can be sure that changing plan won't call useLayoutEffect.

Also, remove unused `useState` on the `planCode`

GitOrigin-RevId: 0d6d9fac32c15dcf13e35cf9cd9161aa07581938
2025-01-31 09:05:36 +00:00
M Fahru 438bd76c61 Use PaymentContextValue type instead of direct boolean (#23185)
GitOrigin-RevId: 2e1af64a40a4b98f84fbd7a024b1facd18e0fe90
2025-01-31 09:05:32 +00:00
Antoine Clausse 3312d97a6b [web] Add tests on find_malformed_filetrees and fix_malformed_filetree, partially fix fix_malformed_filetree (#23120)
* Create tests on find_malformed_filetrees and fix_malformed_filetrees

* Remove lines that are making fix_malformed_filetree fail

These lines are causing errors such as
```
Missing file hash: 586846800000000000000000/5891271c0000000000000000 (rootFolder.0.folders.2.fileRefs.7.hash)
SaaS: likely needs filestore restore
Server Pro: please reach out to support
```

* Add snapshots of projects after fix_malformed_filetree

* Set `WRITE_SNAPSHOT` as false

* Make `deleteProjectsRecordId0` constant

* Ignore duplicated ID errors in CreateMalformedFileTrees.mjs

* Move snapshots to directory folder

* Remove unnecessary code

* Update tests to cover use cases from the scripts

* Fix: Use `new ObjectId(projectId)` instead of the string in mongo queries

* Fix: Query `rootFolder: []` to fix more than `rootFolder: { $size: 0 }`

* Remove/rename files from first draft

* Remove empty strings from expects in unrelated tests, now that `filterOutput` removes them

* Add missing `expectFixStdout` to tests

* misc: rename test util to strId

* Add "well formed filetrees" to test cases

* Use `wellFormed` variable to remove some duplication

* Update tests:
- check Missing file hash path
- remove test on string/numbers as array items

* Add test "bug: shifted arrays in filetree"

* Rename `wellFormedFile` to `wellFormedFolder`

* Fix name of the root folder to `'rootFolder'`, not `'untitled'`

GitOrigin-RevId: dc098bb7ad3ca441fe2bb72b5f5f0e3bcedbdf67
2025-01-31 09:05:27 +00:00
Antoine Clausse 4738961f51 [web] Update secondary email addition: confirm with 6 digits code (#22851)
* Remove `Interstitial` from `ConfirmEmailForm`

* Allow adding `affiliationOptions` in `addWithConfirmationCode`

* Add confirmationStep in add-email.tsx

* Call `getEmails` once a secondary email is added

* Fix tests

* Lint fix

* Style confirm-email-form

Figma: https://www.figma.com/design/TWyeImDSZHhkl9akYaGmeb/24.5-Secondary-email-reconfirmation?node-id=1-449&p=f&m=dev

* Remove unnecessary `successMessage` and `successButtonText` from hidden ConfirmEmailForm

* Remove icon padding

* Rename file to confirm-email-form.tsx

* Use `OLButton`

* Add Cancel button

* Update loading states

* Remove redundant `className` with variants

GitOrigin-RevId: 62b1729cf2299da38f20fa3946273ad0193c7d54
2025-01-31 09:05:23 +00:00
Miguel Serrano 8ff8e7a4bf Merge pull request #23006 from overleaf/msm-chat-capabilities-poc-2
[web] Add option to disable chat for subscription

GitOrigin-RevId: 0052d060c74c39400496f7f9f54c820398d60012
2025-01-31 09:05:18 +00:00
Jakob Ackermann ba60f885a4 [project-history] fetch most recent chunk once when processing updates (#23261)
GitOrigin-RevId: 08ddd1f953b0dbae0541a60b45fec0f88e0a1d06
2025-01-31 09:05:14 +00:00
Jakob Ackermann 72b4083318 [project-history] forward all the optional file attributes during resync (#23260)
Notably, 'createdBlob' was missing. And others like metadata should not
be added if not set.

GitOrigin-RevId: c4a6746c4824d637f7c54b4c68a7025b60c15ff2
2025-01-31 09:05:09 +00:00
roo hutton 50f5a4e909 Merge pull request #23161 from overleaf/rh-pause-no-plan-change
Prevent downgrade to personal plan during subscription pause

GitOrigin-RevId: e3ba2e8e4d9b909fa2ee9c3c7e15db2ed257e43b
2025-01-31 09:04:58 +00:00
roo hutton 347cade55f Merge pull request #23177 from overleaf/rh-pause-tracking
Add tracking for subscription-pause-scheduled event

GitOrigin-RevId: 802899e53d22f2be49f2d20adb45a4a47d0f6beb
2025-01-31 09:04:53 +00:00
CloudBuild 4858efd06f auto update translation
GitOrigin-RevId: afd78e117c45b7ab3c28cacfc9ec29b2e7c20e70
2025-01-30 09:05:46 +00:00
Miguel Serrano f157dd419e [CE/SP] Hotfix 5.3.1 (#23008)
* [CE/SP] Hotfix 5.3.1

* Added mongoose upgrade for services/templates

* Fix mongodb transitive dependency

* cleaned npm cache and /tmp

GitOrigin-RevId: 139cf7776ba053c3763613cc3a6cdea4dfd3db44
2025-01-30 09:05:38 +00:00
Domagoj Kriskovic 461818810c Ensure editor decorations for comments are removed in the old review panel (#23239)
GitOrigin-RevId: d41d9b9701fc792c0190f4648ce9c4ddf035a967
2025-01-30 09:05:30 +00:00
Domagoj Kriskovic 3a918a58e5 Prevent submitting comment on enter if input is empty (#23221)
* Prevent submitting comment on enter if input is empty

* check for content in keyPress event

GitOrigin-RevId: 1abef229782265836a49d74aa93625797d50dc3a
2025-01-30 09:05:26 +00:00
Eric Mc Sween 76dd6d1e20 Merge pull request #23212 from overleaf/em-docupdater-send-doc-hash
Send doc hash with history updates from docupdater

GitOrigin-RevId: 119475d4198c6603cecd4fd579a64ff4448261ce
2025-01-30 09:05:21 +00:00
David d731afed90 Merge pull request #23134 from overleaf/dp-remove-math-preview-flag
Remove math-preview feature flag

GitOrigin-RevId: a5235cf36b692b0e3dc36ff6185ebc7ef169d21e
2025-01-30 09:05:17 +00:00
David f523358d08 Merge pull request #23182 from overleaf/dp-pdf-error-state
Add pdf error state for new ide

GitOrigin-RevId: 35fe07744996375db9cb3b860bdc128b509ee438
2025-01-30 09:05:12 +00:00
David 069624029a Merge pull request #23080 from overleaf/dp-file-outline-in-editor
Add file outline to new editor

GitOrigin-RevId: c9b36d480b243905de8e98dcb838c56a2fe9d2b0
2025-01-30 09:05:08 +00:00
Rebeka Dekany 646e7c2ef0 Merge pull request #23071 from overleaf/rd-migrate-project-id-bs5
Migrate the admin project info page to Bootstrap 5

GitOrigin-RevId: 36ce714ca56e4aeea9f20a84fda6991fb53627c4
2025-01-30 09:05:00 +00:00
Alf Eaton af86239f03 Reject out-of-order op ack messages (#23163)
GitOrigin-RevId: 50c48282e93925a8c40be72e8fc0b8a72d39d82d
2025-01-30 09:04:56 +00:00
Alf Eaton 8f11bc6270 Call event.preventDefault on the "full project search" keyboard shortcut (#23147)
GitOrigin-RevId: 7cd7b2fa3eaf978377fc6f402bce92229fda2c51
2025-01-30 09:04:51 +00:00
Alf Eaton 1ca47334f7 Throttle range rebuilding on edits (#23193)
GitOrigin-RevId: 86d9465af663c346805445cd57dd6f6e06049d7b
2025-01-30 09:04:47 +00:00
Alf Eaton 90aec12e84 Ensure that review panel components are memoized (#23194)
GitOrigin-RevId: 271b8b00394d6b87fddc503a70f17f8f41144ec7
2025-01-30 09:04:42 +00:00
Mathias Jakobsen 57e535af52 Merge pull request #23173 from overleaf/mj-fix-e2e
[web+server-ce] Fix E2E tests

GitOrigin-RevId: cc22952bf828c32ce01eacc707935d3e7b156d71
2025-01-29 09:06:04 +00:00
Mathias Jakobsen fd8fcb11f8 Merge pull request #23170 from overleaf/mj-ide-resize-handle-bg
[web] Override resize handle background colour in editor redesign

GitOrigin-RevId: b429dc5d0f0369c7bd54f29b5e499411ac9398d6
2025-01-29 09:06:00 +00:00
M Fahru 51bf63a32a Merge pull request #23125 from overleaf/mf-change-case-settings-page-form
[web] Change settings page form labels to sentence case (instead of capitalizing each word)

GitOrigin-RevId: 70cc94c2883e782928b5cfdf81ea5ed2d4ff4363
2025-01-29 09:05:47 +00:00
M Fahru 33bbb32d07 Merge pull request #23149 from overleaf/mf-disable-paypal-submit-unchecked-student-confirm
[web] Disable paypal submit button if student confirmation checkbox is not checked

GitOrigin-RevId: 3c8ca624399e249a48ac0be48cb0c5c0b4170d30
2025-01-29 09:05:43 +00:00
Domagoj Kriskovic cd48caeaa1 Updated mongo index for ProjectDeleter (#23138)
GitOrigin-RevId: aa26f29b8917b0d6ff836cc03f82b74066a7dcd4
2025-01-29 09:05:36 +00:00
Domagoj Kriskovic ff9ee2f5a9 Use "can write or review project content" authorization middleware (#23111)
GitOrigin-RevId: c5d1cb955e5833347f7e0c3610c5b8d768026478
2025-01-29 09:05:33 +00:00
Domagoj Kriskovic ea918f3674 Disable restore project/file and project settings for a reviewer (#23104)
* Disable restore project/file and project settings for a reviewer

* hide github menu

* use permissions context

GitOrigin-RevId: a705ecf8bc1f722b8818baef85c5411e7a762989
2025-01-29 09:05:29 +00:00
Liangjun Song 6245e81f42 Merge pull request #22518 from overleaf/ii-flexible-group-licensing-add-seats-legacy
[web] Unlock self-served license purchasing for legacy plans

GitOrigin-RevId: bf3083d00a77417f0e78d2145f6192c57b163273
2025-01-29 09:05:25 +00:00
Liangjun Song 8808e8dfa2 Merge pull request #23128 from overleaf/ii-flexible-group-licensing-add-seats-cost-summary
[web] FL cost summary billing info

GitOrigin-RevId: eae6a7f02aa37e304144ccf75b952406567ca5d5
2025-01-29 09:05:21 +00:00
Liangjun Song e91079d493 Merge pull request #23129 from overleaf/ii-flexible-group-licensing-sales-tax-percentage
[web] Fix sales tax percentage in add seats page

GitOrigin-RevId: 0cb0ab537fbe190d7291deb5942c244a5b0bd3af
2025-01-29 09:05:17 +00:00
Liangjun Song d893bb76cf Merge pull request #22816 from overleaf/enable-group-plan-upgrade-for-legacy-plans
Enable group plan upgrade for legacy plans

GitOrigin-RevId: 9dde0371eeb791a6331ab50733fd457e28837ba9
2025-01-29 09:05:13 +00:00
Liangjun Song eba4418672 Merge pull request #23060 from overleaf/ls-support-new-group-plan-in-redesigned-checkout-page
Support new group plan in the redesigned checkout page

GitOrigin-RevId: 2564477b36ee93ca4b4b6dd8210f140a3104c6ed
2025-01-29 09:05:09 +00:00
Mathias Jakobsen ec73bbcfa0 Merge pull request #23045 from overleaf/mj-errors-tab
[web] Add errors to rail

GitOrigin-RevId: 484e28b1ff1578ec46aa6811f1d1bd1d03a02f59
2025-01-29 09:04:59 +00:00
Mathias Jakobsen 4b46120ec1 Merge pull request #22928 from overleaf/mj-ide-toolbar
[web] Initial editor toolbar

GitOrigin-RevId: 33658d886bf86cbaa22a161f2ff463ef608e5f6b
2025-01-29 09:04:55 +00:00
Alf Eaton 71ab3a41ed Remove ColorManager (#22974)
GitOrigin-RevId: 32cb6fd599345eaf8e474553da5c6d3080575ee8
2025-01-29 09:04:48 +00:00
Alf Eaton cce8d12bf7 Remove bootstrap-5-ide split test (#23059)
GitOrigin-RevId: a812f676b6dab1d3efec4ea8ff962e144baf4299
2025-01-29 09:04:45 +00:00
Alf Eaton 6ccf61e1f2 Disable spell check if WebAssembly is not available (#23136)
GitOrigin-RevId: c209540579e0d8ff7f62dc66ff5d850450b18600
2025-01-29 09:04:41 +00:00
Alf Eaton 4e736a9e96 Check that op ack message version matches the client ShareJS doc version (#23108)
GitOrigin-RevId: f262f63ed5012aabb1bffbf0fb44d677816443be
2025-01-29 09:04:37 +00:00
Alf Eaton 9e040d6946 Select matched text when a file is opened from a full project search result (#23139)
GitOrigin-RevId: bd3b66e89b70c4fa1d77e401d9e5fa755876ce9f
2025-01-29 09:04:33 +00:00
M Fahru 8ed4199245 Merge pull request #22615 from overleaf/mf-reconfirm-page-migrate-bs5
[web] Migrate reconfirm account page to bootstrap 5 and website-redesign styling

GitOrigin-RevId: b65f3ad69a5914ce42dc58c21436c8616393f724
2025-01-28 09:05:47 +00:00
M Fahru 1916a0bbf6 Merge pull request #22613 from overleaf/mf-migrate-primary-email-check-bs5
[web] Migrate "Primary email check" page to bootstrap 5 and website-redesign styling

GitOrigin-RevId: e233edafb8c5033c8fbd97088fa1ac840e2e572e
2025-01-28 09:05:43 +00:00
M Fahru 0558761482 Merge pull request #22610 from overleaf/mf-migrate-setpassword-page-bs5
[web] Migrate set password page to bootstrap 5 and website-redesign styling

GitOrigin-RevId: a9168b4171739cd49d0b76505800bcd171bd9572
2025-01-28 09:05:39 +00:00
M Fahru 7fbcca6ed1 Merge pull request #22609 from overleaf/mf-migrate-aux-password-pages-to-bs5
[web] Migrate reset password page to bootstrap 5 and website redesign

GitOrigin-RevId: 613865379d094b305c6dc78f74dc70341214f4ed
2025-01-28 09:05:35 +00:00
Jimmy Domagala-Tang c6824f8649 Merge pull request #21838 from overleaf/jdt-ae-wf-codec-challenge
[Web] Enable PKCE flows for Oauth server

GitOrigin-RevId: e9a61596ed64e2be8b038b35eb8ea3e21b772e97
2025-01-28 09:05:31 +00:00
Jimmy Domagala-Tang 0baaed6cdf Merge pull request #22994 from overleaf/jdt-diasble-assist
Add a toggle to hide all AI features on a users account

GitOrigin-RevId: 978b02609c40f3975daa267aa6c10ac49e13d6f3
2025-01-28 09:05:27 +00:00
Jimmy Domagala-Tang e228b77c14 Merge pull request #22840 from overleaf/revert-22795-jdt-offline-survey
Revert "feat: enable temporary survey hardcoded to only non ds-nav users"

GitOrigin-RevId: d48b629572e1b6b29121c3e1b54a70f3a8b4c884
2025-01-28 09:05:20 +00:00
Eric Mc Sween db44d0b6ee Merge pull request #22915 from overleaf/em-blob-caching
Improved caching for blobs

GitOrigin-RevId: c5113106ef239b201ae8f66bb3539a52c65ddb60
2025-01-28 09:05:16 +00:00
Jakob AckermannandAlf Eaton 45a5d090d9 [web] add external 15s heartbeat to socket.io connection (#22853)
* [web] add external 15s heartbeat to socket.io connection

* [web] extend debugging context for client errors

- include performance.now() timestamp for correlating other timings
- include connectionState, especially for new externalHeartbeat detail
- include spellCheckLanguage to check on client-side spelling impact

* [web] remove unnecessary hook dependency

Co-authored-by: Alf Eaton <alf.eaton@overleaf.com>

* Refactor externalHeartbeat

* Add connectionManager to context

* Clear the interval earlier, and on connect

* [web] refactor handling of socket debugging info

* [web] add split-test for external socket heartbeat

* [web] fully remove connectionManager from connection context

---------

Co-authored-by: Alf Eaton <alf.eaton@overleaf.com>
GitOrigin-RevId: fbebe64f8aa207eb4fd4a8f27d522d1cac35f9d4
2025-01-28 09:05:12 +00:00
Andrew Rumble 342bbe5f0b Merge pull request #22943 from overleaf/ar-ss-migrate-sync-group-memberships-to-raw
[web] migrate sync group memberships to raw

GitOrigin-RevId: 8c2ea9fef84ec1abcc99deef841e085d62739050
2025-01-28 09:05:05 +00:00
Alf Eaton b0a1a4e9d8 Remove equation preview beta badge (#23133)
GitOrigin-RevId: 1fb233dbceaf7f006f29b4f457084c802696e108
2025-01-28 09:04:58 +00:00
Alf Eaton daaf134b07 Fix Vim search input color (#23094)
GitOrigin-RevId: bf0d5e3417f3ba9fe669c3baf4a34a54c4b61900
2025-01-28 09:04:54 +00:00
Alf Eaton 4351805f7c Remove CM6 performance measurement (#22663)
GitOrigin-RevId: 2178f2b66c200005517ed8ff52afadd8b5fda14b
2025-01-28 09:04:50 +00:00
Alf Eaton 47663fbe35 Improve full project search error handling (#23092)
GitOrigin-RevId: aded8cfbe1d4b24cb3128c8c377afe35f17cc8cf
2025-01-28 09:04:46 +00:00
David f3077599bc Merge pull request #23082 from overleaf/dp-file-outline-typescript
Convert outline components to typescript

GitOrigin-RevId: 9fd057f70d9de7b9b209697a5d33ea72d5d64daa
2025-01-28 09:04:39 +00:00
David 8acbafcb05 Merge pull request #22979 from overleaf/dp-file-tree-in-editor
Add file tree to editor

GitOrigin-RevId: 493ecf88d632bed92c6b2b5ae2e5c0b7eef968cc
2025-01-28 09:04:35 +00:00
David 377f641dd4 Merge pull request #23035 from overleaf/dp-pdf-scroll-cmd
Only zoom pdf if CTRL/CMD is pressed before mousewheel event fires

GitOrigin-RevId: 772f2f699d57f0ebded2132efc1d6e62f1c5a5d5
2025-01-28 09:04:31 +00:00
Jakob Ackermann 54c70e9311 [web] create project-history indexes in Server Pro and CE (#23122)
GitOrigin-RevId: f361d3509037ea8b5e7af186895066a81f6b2922
2025-01-28 09:04:27 +00:00
DerEchteJoghurt a20735426d docker-compose: Replace deprecated mongo with mongosh 2025-01-27 09:54:54 +00:00
CloudBuild 3f57c66510 auto update translation
GitOrigin-RevId: 2a7ec611581d1db6eba5dbd43646a24bddc049f3
2025-01-27 09:05:26 +00:00
Jakob Ackermann ae171dbced [project-history] fix name for error in logging statement (#23110)
Only the err/error fields will use the Error serializer and emit all the
OError details into the log.

GitOrigin-RevId: 4b0e16c00be5ea7c0aea747f49b46897ebd100cc
2025-01-27 09:05:22 +00:00
M Fahru dfbb4dde6c Merge pull request #23109 from overleaf/mf-switch-to-standard-text-change
[web] Change text from "Switch to standard" to "Switch to Standard plan"

GitOrigin-RevId: 1ad1df2a686a4c976ee5dcb16db1df860dd7f982
2025-01-27 09:05:18 +00:00
Mathias Jakobsen 9baddf78f6 Merge pull request #23101 from overleaf/mj-wc-unknown-groups
[web] Allow users to deselect unknown groups in Write and Cite

GitOrigin-RevId: 8bc814b70a206c4e66ccf04615705fff3ad2316b
2025-01-27 09:05:14 +00:00
Domagoj Kriskovic 09195a9b5d Allow reviewers to reopen comment threads (#23075)
GitOrigin-RevId: 065acf5931213c288dbdcb3bc06da988b094a1f4
2025-01-27 09:05:10 +00:00
Eric Mc Sween 3e4e9b298f Merge pull request #23089 from overleaf/em-fix-ranges-snapshot
Fix edge cases when restoring comments

GitOrigin-RevId: 6ce2426bfb7233a3c0915bcc8c53bf0588702847
2025-01-27 09:05:06 +00:00
Domagoj Kriskovic 7e5a0a9bea Delete unused canUserReviewProjectContent function (#23073)
GitOrigin-RevId: 5c2e17a44623916e494a24bf18dbff4e846734d3
2025-01-27 09:05:02 +00:00
Domagoj Kriskovic 6e314e07a1 Remove aria-hidden property from hidden textarea (#23077)
GitOrigin-RevId: d1f7389ae594b9cb686e96a7548fc2abe241eb95
2025-01-27 09:04:58 +00:00
Jakob Ackermann 762266cd87 [project-history] block filestore reads from old queue entries (#23096)
GitOrigin-RevId: 9952cb66e542b17a6a3b5e3b2609d53dc8c371fd
2025-01-27 09:04:54 +00:00
Jakob Ackermann 8d99ad3964 [web] do not send filestore URLs when feature is disabled (#23095)
* [web] do not return createdBlob=true from error path

Defense in-depth, currently the only call-site bails out on error.

* [web] do not send filestore URLs when feature is disabled

GitOrigin-RevId: 7e90cf4c4babffeec337702502234bac73c1f116
2025-01-27 09:04:50 +00:00
Jakob Ackermann 3b602ed93a [project-history] log previous error when retrying createBlob operation (#23103)
GitOrigin-RevId: ff59d15e93c406e17775e5e4acac1f13da9a7788
2025-01-27 09:04:46 +00:00
Jakob Ackermann 5c3353b3de Merge pull request #23099 from overleaf/jpa-fix-sessions-test
[web] add missing await in acceptance test

GitOrigin-RevId: d18d62c55609c46c5b8a583e572a415b55a81af7
2025-01-27 09:04:38 +00:00
Antoine Clausse 272108a213 Run bin/update_node 20.18.0 20.18.2 (#23074)
GitOrigin-RevId: 3f1ab14c4c36ea54408e0ce2c404a323bfe8d9a6
2025-01-24 09:06:05 +00:00
M Fahru 52498c26c8 Merge pull request #23064 from overleaf/mf-add-writeful-to-contact-form
[web] Add "Using Writefull" option to all contact forms

GitOrigin-RevId: 21b97d49b5657e21779c7854c490f68fbde18b82
2025-01-24 09:05:57 +00:00
M Fahru 7acd8ea64c Merge pull request #23030 from overleaf/mf-swap-trial-cta
[web] Swap "Try for free" and "Buy now" button for individual & student plans on plans page & interstitial payment page

GitOrigin-RevId: 4ee778dfa4c92da66d02da46a339d3d41c6e6bc5
2025-01-24 09:05:53 +00:00
M Fahru 7af423173c Merge pull request #22475 from overleaf/rh-student-hurdle
[web] Add friction to student plans

GitOrigin-RevId: 506f1e96a8430069ba5e9f7bfd6c709124e7857c
2025-01-24 09:05:48 +00:00
Jakob Ackermann 36c9772e0e [project-history] log context of failed history-v1 requests (#23078)
GitOrigin-RevId: a597efc46e00fc07cc6e5b71938c82f513c0b288
2025-01-24 09:05:44 +00:00
Domagoj Kriskovic c300d0adb1 Show "Upgrade to track changes" modal for redesigned review panel (#23003)
GitOrigin-RevId: c4809784783af740d6b7d9fa24110e915c36d794
2025-01-24 09:05:40 +00:00
Domagoj Kriskovic 48d08f5b28 Allow reviewers to delete their own comment threads (#23044)
GitOrigin-RevId: 2165e0f549c9df923fb1c124a7622a49d579c2e3
2025-01-24 09:05:35 +00:00
Brian Gough d6e89c7338 Merge pull request #23058 from overleaf/bg-export-backed-up-blobs
export backed up blobs to csv file

GitOrigin-RevId: 5a176055dc85c56ced64cbf13aa705b56071cdae
2025-01-24 09:05:31 +00:00
Kristina 0bbe4b2e5a [web] show monthly rates on group plans (#23019)
GitOrigin-RevId: e500869be9def2c150b4773f2f18883021ab356b
2025-01-24 09:05:26 +00:00
Mathias Jakobsen 77dd468c20 Merge pull request #23026 from overleaf/mj-wc-settings-second-try
[web] Move write and cite setting storage

GitOrigin-RevId: 88a234c15b4dd2a9b451170e3b474d88bb6d45f7
2025-01-24 09:05:22 +00:00
Kristina 0d42173034 [web] add annual-prices-monthly-rates experiment (#22956)
* [web] add annual-prices-monthly-rates experiment
* [web] add annualMonthly to plans.mjs and update settings.overrides.saas.js
* [web] display monthly rates on individual plans on desktop
* [web] display monthly rates on individual plans on mobile
* [web] add monthly rates split test to view event segmentation

GitOrigin-RevId: 4ddbdc2fc6a9ec5a868643d3fc0e3f78ef27772d
2025-01-24 09:05:17 +00:00
Jakob Ackermann 2640d4a566 [project-history] fixes for checking blob exists (#23051)
* [project-history] skip HEAD on blob without file-hash

* [project-history] only 404s indicate a missing blob

* [project-history] error checking for existing blob is fatal

* [project-history] always skip creating blob if already exists

Ignore createdBlob detail after performing check on blob. It might not
 exist on old operations that have been queued.

* [project-history] fix unit tests

* [project-history] migrate test to new fetch call

GitOrigin-RevId: 457963042e9d836647d3c122516329d4dc9b544f
2025-01-24 09:05:09 +00:00
Alf Eaton f1e1d55d8c Merge pull request #22964 from overleaf/ae-project-search-flush
Ensure that open docs are flushed before running full project search

GitOrigin-RevId: 6707cf982018908a37957503add73a085c749f61
2025-01-24 09:05:05 +00:00
Alf Eaton 4898b15dea Add eslint-plugin-testing-library (#23017)
* Add eslint-plugin-testing-library

* Update .eslintrc.js

* Only import from @testing-library/react

* Fix issues

GitOrigin-RevId: c225f1f70020d4431866119423cd839ce1ee5ed2
2025-01-24 09:04:59 +00:00
Jessica Lawshe e1a2bccf53 Merge pull request #22967 from overleaf/jel-user-settings-sso-institution
[web]  Fix SSO available check on user settings page

GitOrigin-RevId: e8322eb9d9cacad26054fc4a6186e41f66de7d22
2025-01-23 09:06:30 +00:00
Rebeka Dekany 207f9d1fc4 Merge pull request #22954 from overleaf/rd-admin-survey-bs5
Migrate the admin survey page to Bootstrap 5

GitOrigin-RevId: 220bcdca929d060e0ef5ae7a7d30fa0a1b7d3be1
2025-01-23 09:06:22 +00:00
Rebeka Dekany 2fe874e56d Merge pull request #22989 from overleaf/rd-split-test-list-migrate-bs5
Migrate the split test page to Bootstrap 5

GitOrigin-RevId: cac1cebc5ada032656f82428199fe60367b293f8
2025-01-23 09:06:17 +00:00
Andrew Rumble 47db5c1236 Merge pull request #23039 from overleaf/ar-bump-mongo-6.12
[many] Bump mongodb to 6.12.0 universally

GitOrigin-RevId: 6df934518e95217b6157ca5a41cf8acf4beb7689
2025-01-23 09:06:13 +00:00
roo hutton ad096f82bf Merge pull request #21905 from overleaf/rh-pause-sub
Add support for pausing subscription

GitOrigin-RevId: f939ea4e7f3c2b1fa16dcb8aff1b2460d091d4e2
2025-01-23 09:06:04 +00:00
Domagoj Kriskovic f79e2c8333 Expose fontSize to scopeSettings (for extensions) (#23033)
* Expose fontSize to scopeSettings (for extensions)

* Updated comment with fontSize property in IdeProvider context

GitOrigin-RevId: 3f622d75aa206f2760a3a9ce0db0f31a91e73089
2025-01-23 09:05:56 +00:00
Domagoj Kriskovic 6fa75eb905 Workaround for editor updating file when not focused in Safari (#23023)
GitOrigin-RevId: da9341b2cadf4b073eb4062619a9fa7bcba17c6b
2025-01-23 09:05:51 +00:00
Domagoj Kriskovic 8ae5e1dc5d Fix main height when system messages are shown (#22988)
GitOrigin-RevId: 0b5c6d22f61788475fc2c8595fd34e927a9f2303
2025-01-23 09:05:47 +00:00
Andrew Rumble 6cb1528495 Merge pull request #23020 from overleaf/ar-prevent-rootFolder-deletion
[web] Prevent deletes on a project's rootFolder

GitOrigin-RevId: 6d0506f207425f65d3de990a78bb1ea9b136ed1e
2025-01-23 09:05:42 +00:00
Alf Eaton 793d900ba5 Remove hover style from table header (#22121)
GitOrigin-RevId: 02253aeadcb3047ce5eef2241658cc670a0c6d53
2025-01-23 09:05:33 +00:00
Alf Eaton 25c401f2a7 Restore padding on search form inputs (#22132)
GitOrigin-RevId: da5826711072fc39ecc8f8db05881bb0dc0eea87
2025-01-23 09:05:29 +00:00
Alf Eaton 54a4f7a75b Upgrade @codemirror/autocomplete (#22921)
GitOrigin-RevId: e1b1205c1d577fcc338b429551038dba92ec23f4
2025-01-23 09:05:24 +00:00
Alf Eaton 50c6b8a831 Avoid mutating the previous state in a set function (#22935)
GitOrigin-RevId: b3613b8476bbb60a10ef6b293487b1017f56ea68
2025-01-23 09:05:19 +00:00
Alf Eaton 604471bfe9 Improve types for window.metaAttributesCache (#22983)
GitOrigin-RevId: cc962bf7eeaac525267ba04080889b0d58051914
2025-01-23 09:05:14 +00:00
Alf Eaton 53214d4222 Create shared PanelHeading and CollapsibleFileList components (#22995)
GitOrigin-RevId: ffe524cc0ddf6a1cf532a50f37900b1747b2afee
2025-01-23 09:05:09 +00:00
Alf Eaton 25027e0155 Use MEMFS in Hunspell worker (#22998)
GitOrigin-RevId: ef60b2c333484499e6289c51eacab04b983e1090
2025-01-23 09:05:04 +00:00
CloudBuild 958d889cbe auto update translation
GitOrigin-RevId: 9d4df12b84ae4e63c54b8039c8e35eab506d8fa5
2025-01-22 09:05:25 +00:00
Jakob Ackermann 9c377b74c1 [history-v1] add flag for back-filling hashes for projectIds from file (#23005)
* [history-v1] delay process exit to give logging time to flush

* [history-v1] add flag for back-filling hashes for projectIds from file

GitOrigin-RevId: 887a1e1c72d6f5a13bfc8d0e54023afbf5bc671c
2025-01-22 09:05:21 +00:00
Jakob Ackermann 6884338a34 [history-v1] fix remaining files with missing hashes (#22985)
GitOrigin-RevId: df382732954538f9db177180aee0a44c5d5679ca
2025-01-22 09:05:16 +00:00
Jakob Ackermann 04c1497673 [web] extend scripts for finding and fixing broken file-trees (#22984)
- Validate _id fields to be ObjectIds
- Include more debug output, notably include the folder/doc/file id
- Emit and consume JSON output
- Read broken file-tree details from (ad-hoc) file
- Use generator instead of accumulating all results per project first
- Use batchedUpdate to be able to pause and resume processing

GitOrigin-RevId: 606ac431fff65891e09479c0ba9bcb7e7dc5cbe4
2025-01-22 09:05:12 +00:00
David 037cc3b7a4 Merge pull request #22930 from overleaf/dp-filetree
Convert filetree components to typescript

GitOrigin-RevId: f06abb9705013d3da1a87c8f4bef4a82c4fab5d2
2025-01-22 09:05:01 +00:00
David 2365d8c199 Merge pull request #22836 from overleaf/dp-filetree-typescript
Convert file-tree util files to typescript

GitOrigin-RevId: bdf8d0655a543a216f028bc8477c3ee47aba5566
2025-01-22 09:04:56 +00:00
Rebeka Dekany 84deec4e5a Merge pull request #22993 from overleaf/rd-searchbar-button-fix-migration
[web] Fix close button alignment of search bar

GitOrigin-RevId: ef6761f6f068090d8cbf7e8922b257bd499ee5c3
2025-01-21 09:06:15 +00:00
Rebeka Dekany 6c69266c0a Merge pull request #22934 from overleaf/rd-admin-split-test-edit-id
Migrate the split test edit admin page to Bootstrap 5

GitOrigin-RevId: 34c690e00f74a68fb4018f7546d77aefd3e84a51
2025-01-21 09:06:10 +00:00
Rebeka Dekany 2d12ef6b78 Merge pull request #22863 from overleaf/rd-migrate-admin-user-bs5
Migrate the admin users page to Bootstrap 5

GitOrigin-RevId: 34165b5d0f91c45e24a7fc94086871a0f22e50f9
2025-01-21 09:06:06 +00:00
Domagoj Kriskovic 1072f836ae Hide reply input if no comment permissions (#22955)
GitOrigin-RevId: eeb323e8d7426388f4291906299397f58095b46a
2025-01-21 09:05:58 +00:00
Domagoj Kriskovic 741b65d0eb Add ensureUserCanSendComment authorization middleware (#22959)
* Add ensureUserCanSendComment authorization middleware

* added tests

GitOrigin-RevId: d1f58bd6bc63275456e5280ccb8c99aaa02c4e5f
2025-01-21 09:05:53 +00:00
Domagoj Kriskovic e5a4a8606f Prevent scrolling when reply input is focused (#22968)
* Prevent scrolling when reply textarea is focused

* remove focusIsOnTextarea check as it is handled above

* remove unnecessery setSelected

GitOrigin-RevId: 5ce3fc6691a19fe2566875785607bb4faa3e9f52
2025-01-21 09:05:49 +00:00
Eric Mc Sween 71c2dc7d2d Merge pull request #22970 from overleaf/em-log-user-id
Add userId to request logs when user is logged in

GitOrigin-RevId: c7c907375af20c83f2ac762aa634b8d8cd1d9404
2025-01-21 09:05:44 +00:00
Eric Mc Sween 6ee70550c4 Merge pull request #22960 from overleaf/em-promisify-filestore-controller
Promisify FileStoreController

GitOrigin-RevId: b5f5861a7601a1bf4af3024394f910a0f5a14206
2025-01-21 09:05:40 +00:00
Eric Mc Sween 3d0a9017a4 Merge pull request #22973 from overleaf/em-fix-project-snapshot-concurrency
Fix concurrency in project snapshot

GitOrigin-RevId: 83710b84e5ff5c10d55b1a915a310db1ca431973
2025-01-21 09:05:35 +00:00
Mathias Jakobsen 6fba73c66a Merge pull request #22987 from overleaf/revert-22866-mj-typing-delay
Revert "[web] Remove activateOnTypingDelay from CM6 autocomplete"

GitOrigin-RevId: 1b598c8790bec1076db4d5a9feb551585565af05
2025-01-21 09:05:27 +00:00
Mathias Jakobsen d34d15242e Merge pull request #22855 from overleaf/mj-ide-settings
[web] Add settings modal skeleton to editor redesign

GitOrigin-RevId: bc2e7f07f7ab737a67965fa615a04c8ee88b1271
2025-01-21 09:05:23 +00:00
Mathias Jakobsen 144334ec58 Merge pull request #22866 from overleaf/mj-typing-delay
[web] Remove activateOnTypingDelay from CM6 autocomplete

GitOrigin-RevId: 79c39932fce818f13bada824ceaecedd15d36b21
2025-01-21 09:05:18 +00:00
Mathias Jakobsen 5b7ca476a7 Merge pull request #22940 from overleaf/mj-font-script
[web] Add script for updating unfilled font

GitOrigin-RevId: c25a470e5263f62a9d445b10e66fa222b9fa8fa5
2025-01-21 09:05:14 +00:00
Jakob Ackermann 01ab32c029 [web] bump copyright year for Server Pro/CE to 2025 (#22950)
GitOrigin-RevId: 7747e64e787e22beb5caf6e47255ab6eeeb74d23
2025-01-21 09:05:06 +00:00
Antoine ClausseandJakob Ackermann d4a10c7b41 [web] Socket diagnostics updates (#22951)
* Increase threshold for "latency in red color"

* Fix online status in Chrome and Safari

* Add "Auto ping" checkbox

* Put `/socket-diagnostics` behind `AuthenticationController.requireLogin`

* Set logs to `logger.info` when debugging

* Add `publicId` and `clientId` to logs

* Fix disconnect logs when debugging

* Refresh UI every second. Display red "Ping Count" if unanswered for 3s

* Update services/web/frontend/js/features/socket-diagnostics/components/socket-diagnostics.tsx

Co-authored-by: Jakob Ackermann <jakob.ackermann@overleaf.com>

* Update services/web/frontend/js/features/socket-diagnostics/components/socket-diagnostics.tsx

Co-authored-by: Jakob Ackermann <jakob.ackermann@overleaf.com>

* `npm run format:fix`

---------

Co-authored-by: Jakob Ackermann <jakob.ackermann@overleaf.com>
GitOrigin-RevId: 9faf2abdac51fa4b87c67d8fe89c4125d01d826f
2025-01-21 09:05:01 +00:00
Antoine Clausse c8be2e25cf [web] Promisify ensureAffiliationMiddleware and refactor InstitutionHubsController (#22242 feedback) (#22261)
* Promisify `ensureAffiliationMiddleware`

* In `ensureAffiliationMiddleware`, throw when UserNotFoundError

* Unnest object `_InstitutionHubsController`

* Format fix

GitOrigin-RevId: 5b3c6c24724520353540b8d8dd05005b6fa749ff
2025-01-21 09:04:57 +00:00
Andrew Rumble de7cd8900a Merge pull request #22948 from overleaf/ar-ac-mongoose-8.9.5
Upgrade mongoose to 8.9.5

GitOrigin-RevId: 0b58af36e3732c18f58fde7f3e8d33234d4b4629
2025-01-21 09:04:51 +00:00
CloudBuild 9332b42edd auto update translation
GitOrigin-RevId: 449c0fd0236464e412723bacc9bfeba2522a4a73
2025-01-20 09:05:30 +00:00
Jessica Lawshe b735cac588 Merge pull request #22912 from overleaf/jel-cms-tabs-bs5
[web] Update admin panel to use `.ol-tabs` style

GitOrigin-RevId: c9e808c5534e5f033a8e829b35b0c6bd865cb596
2025-01-20 09:05:22 +00:00
Jakob Ackermann ab4d1e0986 Merge pull request #22870 from overleaf/jpa-back-fill-fix-up
[history-v1] add script for fixing up back-fill errors

GitOrigin-RevId: 118992a32c1f6da4289cd35399ddd07a741da4ee
2025-01-20 09:05:14 +00:00
Alf Eaton 413c108c28 Improve project search UI (#22909)
GitOrigin-RevId: 83bc59269250afef3d25434b14151dbde5be5e5c
2025-01-20 09:05:06 +00:00
Alf Eaton 17ae05a055 Add cause to "spell check loading failed" error (#22923)
GitOrigin-RevId: 37772c842bb9d92200c08fa7ce89ec0b85fe1b94
2025-01-20 09:05:02 +00:00
Alf Eaton ce1d63d92c Create a shared module for CSS styles from user settings (#22925)
GitOrigin-RevId: 1e62258e1e38d8ab2ce8debc51c53a98f4e915f6
2025-01-20 09:04:57 +00:00
Alf Eaton fdf7a34f8f Avoid shifting the layout of the project dashboard when items are selected (#22937)
GitOrigin-RevId: 98f153efddfcc3c11712010e607cc1a308e74279
2025-01-20 09:04:53 +00:00
Jakob Ackermann f03d346a32 Merge pull request #22882 from overleaf/jpa-file-tree-script
[web] scripts/find_malformed_filetrees: flag missing file hash and folder arrays

GitOrigin-RevId: 8561a59856486bd6903f84a99434d0bd81acb175
2025-01-20 09:04:45 +00:00
Domagoj Kriskovic 58c9f6e76e Hide resolve/edit/delete comment options for users without permissions (#22891)
GitOrigin-RevId: b3d2c1ba03ee836596abfc3da1260dec5a0a7714
2025-01-20 09:04:40 +00:00
Antoine Clausse 7bef003c56 [real-time, web] Create a UI to test socket connection (#22907)
* Create a UI to test socket connection

* Add Clock Delta to the measurements

* Add colors to DiagnosticItem

* Update icon

* Add more info to the diagnostics screen

* Add logs in backend on debug messages, disconnections and connection

* Add last received ping info

* Reorder DiagnosticItems

* Remove "warning" text color (too light)

* Replace Phosphor icons by Material Icons

GitOrigin-RevId: 6a015b4928cd19849ff287cf254f671840ed44af
2025-01-17 09:05:49 +00:00
Antoine Clausse f9cc0c3bf4 [web] Scope ds-nav split test to project list (#22689)
* Add `dsNavStyle` prop, so `sidebar-navigation-ui-update` doesn't change all pages

* Use `useIsDsNav` instead of `useSplitTestContext`

* Create a `useDsNavStyle` hook

* Use `useDsNavStyle`

* Add comment on `useIsDsNav` and `NavStyleContext`

* Revert "Hide nav dropdown chevron icon in welcome page"

This reverts commit 78b5ba85

* Move `DsNavStyleProvider` usage to project-list-ds-nav.tsx

* Fix typo

* Simplify `useDsNavStyle` conditions

GitOrigin-RevId: df3fe66d772919c40df69d357bee6949ab413928
2025-01-17 09:05:41 +00:00
Antoine Clausse b9fb636f0b [web] Remove promises exports from Controller modules (#22242)
* Remove promises object from CollaboratorsInviteController.mjs

* Define functions at root

* Remove mentions of undefined `revokeInviteForUser`

* Remove unused `doLogout`

* Remove promises object from UserController.js

* Remove unused `makeChangePreview`

* Remove promises object from SubscriptionController.js (`getRecommendedCurrency` and `getLatamCountryBannerDetails`)

* Remove promises object from CollabratecController.mjs

* Remove promises object from SSOController.mjs

* Remove promises object from ReferencesApiController.mjs

* Remove promises object from MetricsEmailController.mjs

* Remove promises object from InstitutionHubsController.mjs

* Remove promises object from DocumentUpdaterController.mjs

* Remove promises object from SubscriptionAdminController.mjs

* Fixup unit tests

* Add expects that controllers don't error

* Promisify `ensureAffiliationMiddleware`

GitOrigin-RevId: 311c8afa7d5c8e4f051408d305b6b4147a020edc
2025-01-17 09:05:36 +00:00
CloudBuild ae34c4b8cc auto update translation
GitOrigin-RevId: fc3c6ea47100bc446d4a6290c2ba530083d9b717
2025-01-17 09:05:32 +00:00
Jessica Lawshe feacd61408 Merge pull request #22684 from overleaf/jel-gallery-test-end
[web] Tear down gallery redesign test

GitOrigin-RevId: 907585c7d0e27c0c511e9d5f95096d82225f9aba
2025-01-17 09:05:24 +00:00
Eric Mc Sween ab9d4d4c9c Merge pull request #22845 from overleaf/em-project-snapshot-queue-refreshes
Concurrency control in ProjectSnapshot

GitOrigin-RevId: b62b886b59a67f2c694ef7cefcff5c32da3e4457
2025-01-17 09:05:09 +00:00
Eric Mc Sween 84bd994345 Merge pull request #22892 from overleaf/em-filter-tracked-deletes
Filter tracked deletes on project snapshot

GitOrigin-RevId: 5146e00b67af8dc15bf17f587cb6173a0a21544d
2025-01-17 09:05:05 +00:00
Eric Mc Sween 30e5c95a27 Merge pull request #22871 from overleaf/em-history-flush-metrics
History flush metrics

GitOrigin-RevId: eb8b357427942e9816ad92ccd46c0dd8a65ab939
2025-01-17 09:05:00 +00:00
David c919960d2b Merge pull request #22902 from overleaf/dp-remove-presentation-mode-flag
Remove pdf-presentation-mode feature flag

GitOrigin-RevId: 14e64115c539fe2721150ed6f09dfcc4ce9cbaaa
2025-01-17 09:04:49 +00:00
Mathias Jakobsen 849275c4b8 Merge pull request #22787 from overleaf/mj-ide-rail
[web] Create rail tabbed layout

GitOrigin-RevId: be54a224087aad8e6e2762d9c26463e37aecd9aa
2025-01-17 09:04:45 +00:00
Mathias Jakobsen 539e96c62b Merge pull request #22802 from overleaf/mj-outline-icons
[web] Add some unfilled material symbols

GitOrigin-RevId: 2b5c477e6ff32f62ab40cacf666aeb98b311f126
2025-01-17 09:04:40 +00:00
M Fahru 03bb4c57f9 Merge pull request #22742 from overleaf/mf-remove-frontend-plans-page-dead-code
[web] Remove frontend plans page dead code

GitOrigin-RevId: 6db07b909f99a7afd17880698787a2c3527e879f
2025-01-16 09:06:55 +00:00
M Fahru 545f990837 Merge pull request #22744 from overleaf/mf-update-blog-tagged-text
[web] On tagged blog pages, update "Posts tagged X" text color to neutral-70

GitOrigin-RevId: ad8e14ac275761f441e0db9760ba9c91de9019cd
2025-01-16 09:06:50 +00:00
M Fahru 685db9935a Merge pull request #22636 from overleaf/mf-remove-list-group-item-variant
[web] Remove `list-group-item-variant` mixin since it's no longer used

GitOrigin-RevId: f7d01acf1537d40060598d9ed68e602c1fc12609
2025-01-16 09:06:45 +00:00
M Fahru da6f332269 Merge pull request #22821 from overleaf/kh-cop-on-upgrade-modal
[web] limit COP group plans to 20 seats in upgrade modal

GitOrigin-RevId: b1d2713b978d0269892d8f547eeccc5ab702ea77
2025-01-16 09:06:37 +00:00
Jessica Lawshe 76c0e6f84d Merge pull request #22824 from overleaf/jel-saml-tests
[web] SAML test helper update

GitOrigin-RevId: 6a721901b0026286e0ef28ed9168c8b97cd4a200
2025-01-16 09:06:33 +00:00
Jessica Lawshe 5c188939d6 Merge pull request #22740 from overleaf/jel-mono-text
[web] Eyebrow text margin

GitOrigin-RevId: cdf1eadf8ad1da4d81724e8aeb9994cc931388ce
2025-01-16 09:06:28 +00:00
Rebeka Dekany bdd91358ef Merge pull request #22817 from overleaf/rd-migrate-admin-split-test-create-bs5
Migrate the split test create admin page to Bootstrap 5

GitOrigin-RevId: 897f634b00136605ce3faf0e2489902d41f51566
2025-01-16 09:06:16 +00:00
Rebeka Dekany 971a5d9de4 Merge pull request #22717 from overleaf/rd-migrate-admin-bootstrap5
[web] Migrate the admin page to Bootstrap 5

GitOrigin-RevId: 8d283f7ce4a7d73f033a69a4c075311ff756f06a
2025-01-16 09:06:12 +00:00
Rebeka Dekany 4fae817573 Merge pull request #22761 from overleaf/rd-migrate-admin-project-bs5
Migrate admin project URL lookup page to Bootstrap 5

GitOrigin-RevId: d8c58bbeb924da4e94a361ab59a66c2c6048dbfd
2025-01-16 09:06:07 +00:00
Jakob Ackermann 98e0ed6a06 Merge pull request #22894 from overleaf/jpa-large-chunk
[history-v1] add test case for large text file

GitOrigin-RevId: 5d7cc37d74c67e1927785ea9c544d897491e6abd
2025-01-16 09:06:02 +00:00
Miguel Serrano 68dcacea93 Merge pull request #22890 from overleaf/msm-fix-migrations
Fix module import in migrations

GitOrigin-RevId: 462eb54c68942118f3f76b166c3f27d923227e6c
2025-01-16 09:05:58 +00:00
Eric Mc Sween 9f1b6d480b Merge pull request #22869 from overleaf/em-remove-sanity-check
Remove RangesManager sanity check

GitOrigin-RevId: 376c2a197aa68cbde9259ec8c2cea1e9d43c8f69
2025-01-16 09:05:53 +00:00
Alf Eaton f069adaf15 Add full project search UI (#22671)
GitOrigin-RevId: f40c85f40f4c16b4b3c26a197924cd9ac9b3db1f
2025-01-16 09:05:45 +00:00
Miguel Serrano 0d3be44f6a [web] Remove partial from oauthAccessTokens.user_id index (#22886)
* [web] Remove partial from `oauthAccessTokens.user_id` index

GitOrigin-RevId: 22b2bc136bef2c45b4bdf1e6a5d6a20eeefea3f7
2025-01-16 09:05:40 +00:00
Alf Eaton 2fbb4615f9 Convert utility functions to TypeScript (#22658)
* Convert event-tracking to TypeScript

* Convert local-storage to TypeScript

* Convert mapSeries to TypeScript

* Convert SessionStorage to TypeScript

* Convert account-upgrade to TypeScript

* Convert isValidTeXFile to TypeScript

* Convert date functions to TypeScript

* Convert EventEmitter to TypeScript

* Convert isNetworkError to TypeScript

* Convert webpack-public-path to TypeScript

* Convert displayNameForUser to TypeScript

GitOrigin-RevId: 79c5a2d1101fcd520f3116f0f4af29d974189d94
2025-01-16 09:05:36 +00:00
Alf Eaton 386d6f8ffd Wrap range building in setTimeout (#22796)
GitOrigin-RevId: a0841e6eb9f2f637653dd0b8a37a61136097cc4f
2025-01-16 09:05:31 +00:00
Alf Eaton f2f1178bcd Refactor isMac to a utility module (#22829)
GitOrigin-RevId: c6ab1dbeb1c56c35af121e7f657325a89fc847ea
2025-01-16 09:05:26 +00:00
Kristina 7994390967 [web] tear down group-pricing-2025 split test on non-plans pages (#22785)
* [web] rm split test from the change to group modal
* [web] rm split test from cancel flow
* [web] rm split test from checkout flow
* [web] rm unused translations

GitOrigin-RevId: 0188f2631ed18e79fdf55dabedac7cdea4f213d3
2025-01-16 09:05:22 +00:00
Kristina 23c455d7b9 [web] tear down group-pricing-2025 split test on plans page (#22786)
* [web] rm split test from new plans page
* [web] rm showDiscountPercentage from group_member_picker (always false)
* [web] rm now unused classes on edu discount checkbox
* [web] rm split test from FAQ
* [web] rm unused translation

GitOrigin-RevId: 262d97f317d8aaef6e5a07a8ecd4edc67557408b
2025-01-16 09:05:17 +00:00
Domagoj Kriskovic 36f2e52167 Add comment option in editor toolbar (#22849)
* Add comment option in editor toolbar

* move addComment to commands

GitOrigin-RevId: 690b70f67abe5653f28ec9ec61deb3f201a78131
2025-01-16 09:05:12 +00:00
Domagoj Kriskovic 3d543b20b5 [web] Show most recently resolved comments at the top (#22835)
GitOrigin-RevId: cb42a0fe3d6bf5d23d329b6ef9732f7cb9612907
2025-01-16 09:05:07 +00:00
CloudBuild 22d007e8f4 auto update translation
GitOrigin-RevId: 087736340479ca8ef4b974e9b652e9e49011c764
2025-01-15 09:05:10 +00:00
M Fahru 292308d546 Merge pull request #22540 from overleaf/mf-remove-plans-page-default-variant-code
[web] Remove dead backend (include pug template) code after `website-redesign-plans` test has been concluded and `new-design` variant is fully activated

GitOrigin-RevId: 143129da71d43b88535f971b13e9e72c98bad798
2025-01-15 09:05:06 +00:00
M Fahru 4150baefcb Merge pull request #22539 from overleaf/mf-move-plansbanners-helper-to-module
[web] Move "plansBanners" function (along with its tests) to subscription module

GitOrigin-RevId: a231ecd862e7f052ca2597eb07d6612b23f2c7d3
2025-01-15 09:05:01 +00:00
M Fahru ef5a52b29d Merge pull request #22493 from overleaf/mf-remove-website-redesign-plans-test-config
[web] Remove `website-redesign-plans` test config from acceptance test and redirection tests from unit tests

GitOrigin-RevId: f1b30231be06748726ec2921fe23deadf2a701b6
2025-01-15 09:04:57 +00:00
Eric Mc Sween c9591e250a Merge pull request #22822 from overleaf/em-ai-manually-collected
Hide Error Assist from manually collected group admins

GitOrigin-RevId: fd4d851d1d427b1978649129674d74cb375bc3f5
2025-01-15 09:04:49 +00:00
Eric Mc Sween a69036e005 Merge pull request #22825 from overleaf/em-move-project-snapshot
Move full project on client code to the main web tree

GitOrigin-RevId: a2afd0d7fceaef213841e662df0b20587e9fef69
2025-01-15 09:04:45 +00:00
M Fahru 2ef5db2938 Merge pull request #22340 from overleaf/mf-clean-up-currency-format-test
[web] Clean up localized currency format test (`local-ccy-format-v2`)

GitOrigin-RevId: 30d671479522b87ee9205994508b745d2b0ae4c3
2025-01-14 09:05:49 +00:00
David bf789a2635 Merge pull request #22799 from overleaf/dp-new-pdf-toolbar
Add toolbar styles and update pdf toolbar to match new editor designs

GitOrigin-RevId: 4d5d9c6fa3353c10dd135aa35440c8512a5d3226
2025-01-14 09:05:45 +00:00
Jimmy Domagala-Tang 1b5fb1ef9e Merge pull request #22702 from overleaf/jdt-assistant-button-shrinking
Refactor AI error assistant ctas to reduce visual space

GitOrigin-RevId: 33f85849d250368e7ff53242b1d155573b0a1a43
2025-01-14 09:05:41 +00:00
Eric Mc Sween e9c1c0f9c8 Merge pull request #22650 from overleaf/em-tracked-deletes-at-same-position
Handle multiple tracked deletes at same position

GitOrigin-RevId: 3cbf1c418bcd50cf08e1b90ce6ba3bc480236079
2025-01-14 09:05:34 +00:00
Domagoj Kriskovic 39d1ba7fe0 Allow rejecting reviewers own track changes (#22793)
* Allow rejecting reviewers own track changes

* reject option only for change authors

GitOrigin-RevId: ecbc5ee9dfe6c468a5df3c1ce7b147561802a8c0
2025-01-14 09:05:25 +00:00
David c0ccb57100 Merge pull request #22756 from overleaf/dp-preload-pdf-presentation
Load full pdf document in background when entering presentation mode

GitOrigin-RevId: 514ef838b155a7f13f3bc12690aef45fd3f2c3fc
2025-01-14 09:05:20 +00:00
Domagoj Kriskovic 1f23b78de2 Fixed equation preview overflow (#22769)
* Fixed equation preview overflow

* Decrease max-height to 200px

GitOrigin-RevId: 4a733d25e86b0d4adfb2dc697bc251ad244949b4
2025-01-14 09:05:15 +00:00
Domagoj Kriskovic 30ebad91b7 Allow reviewers to resolve their own comments (#22582)
* Allow reviewers to resolve their own comments

* check if reviewer is comment author

* add missing translation

* add CommentsController tests

* added DocumentManagerTests

* added HttpControllerTests

* Add AuthorizationManagerTests

* added AuthorizationMiddlewareTests

* added DocumentUpdaterHandler test

* fix test descriptions

* remove returns from CommentsControllerTests

* use ensureUserCanResolveThread in authorizationMiddleware

* move canResolveThread to AuthorizationManager

* commentId as param in NotFoundError

* refactor canUserResolveThread

GitOrigin-RevId: 131c3d1eb9ac916eaaa9221d351a92bc07b80cdc
2025-01-14 09:05:11 +00:00
Alf Eaton 19ee929d65 Allow currentUserId to be null when calculating user colour (#22830)
GitOrigin-RevId: 70ef0c5a7319fa952690b5e23fae7aef9703eed9
2025-01-14 09:05:07 +00:00
Alf Eaton cffa9c1a28 Improve spell check when dictionary is edited (#22635)
GitOrigin-RevId: 20d36cb987d014809423240a46c7c577781dfde6
2025-01-14 09:05:03 +00:00
Alf Eaton 47af13c8a8 Delete unused iconTypeFromName file (#22662)
GitOrigin-RevId: 3c768cacebcf229d932a7b03a4068291e3cf60b1
2025-01-14 09:04:58 +00:00
Alf Eaton f79aac8d01 Convert endpoints to TypeScript (#22664)
GitOrigin-RevId: 159f0f38333ad2944c3f25c5076432e5f5dc7ba3
2025-01-14 09:04:54 +00:00
Alf Eaton a8a61db23e Convert shared utils modules to TypeScript (#22665)
GitOrigin-RevId: de40a0aaba35336ec59499a047356b0b9d161b38
2025-01-14 09:04:50 +00:00
Alf Eaton 003fa536df Convert Chat components to TypeScript (#22672)
GitOrigin-RevId: b47a7fc3f77055335990ee0215bd32ae65b1ebfe
2025-01-14 09:04:45 +00:00
Alf Eaton db78629e5c Remove deprecated apple-mobile-web-app-* meta tags (#22734)
GitOrigin-RevId: b146d74e94a215a222d403bd852e9b21b74614b1
2025-01-14 09:04:41 +00:00
Jakob Ackermann 62119de408 Merge pull request #22815 from overleaf/jpa-docker-compose-update
[server-ce] upgrade mongo and cleanup temporary env var

GitOrigin-RevId: 94be18c7d3074b5f707ad696384a583224b2f8a4
2025-01-13 09:05:11 +00:00
Tim Down 8f29870334 Merge pull request #22818 from overleaf/td-storybook-overall-editor-theme
Make theme switcher work in BS5 editor Storybook stories

GitOrigin-RevId: ff9a9a14c2e9bdaccefab2652fbfbd54c544635e
2025-01-13 09:05:07 +00:00
Jakob Ackermann a343c010c1 Merge pull request #22800 from overleaf/jpa-fix-ce
[server-ce] fix mongo replica setup in public monorepo

GitOrigin-RevId: 98e0d3337c34b389b499520e85c1b72e0e91e07a
2025-01-13 09:05:03 +00:00
Alexandre Bourdin 356212ecde Merge pull request #22252 from overleaf/ab-gradual-rollout-continuity
[web] Ensure continuity for gradual rollouts

GitOrigin-RevId: c5bada71ae476862c782dc669024944f12d77097
2025-01-13 09:04:59 +00:00
Mathias Jakobsen 182e9deada Merge pull request #22768 from overleaf/mj-ide-source-editor
[web] Add editor to editor redesign

GitOrigin-RevId: cdda3d5391866b882d6696ba833316aa91cf2856
2025-01-13 09:04:55 +00:00
Andrew Rumble dc157392ae Merge pull request #22765 from overleaf/ar-convert-final-acceptance-tests-to-es-modules
[web] convert final acceptance tests to es modules

GitOrigin-RevId: d0d0cd3dfedbe494ce51dd6f8c180dff02429ad8
2025-01-13 09:04:50 +00:00
1928 changed files with 64276 additions and 79135 deletions
+856 -17
View File
@@ -14,30 +14,872 @@
<a href="#license">License</a>
</p>
<img src="doc/screenshot.png" alt="A screenshot of a project being edited in Overleaf Community Edition">
<img src="doc/screenshot.png" alt="A screenshot of a project being edited in Overleaf Extended Community Edition">
<p align="center">
Figure 1: A screenshot of a project being edited in Overleaf Community Edition.
Figure 1: A screenshot of a project being edited in Overleaf Extended Community Edition.
</p>
## Community Edition
[Overleaf](https://www.overleaf.com) is an open-source online real-time collaborative LaTeX editor. We run a hosted version at [www.overleaf.com](https://www.overleaf.com), but you can also run your own local version, and contribute to the development of Overleaf.
[Overleaf](https://www.overleaf.com) is an open-source online real-time collaborative LaTeX editor. Overleaf runs a hosted version at [www.overleaf.com](https://www.overleaf.com), but you can also run your own local version, and contribute to the development of Overleaf.
## Extended Community Edition
The present "extended" version of Overleaf CE includes:
- Sandboxed Compiles with TeX Live image selection
- LDAP authentication
- SAML authentication
- OpenID Connect authentication
- Real-time track changes and comments
- Autocomplete of reference keys
- Symbol Palette
## Enterprise
If you want help installing and maintaining Overleaf in your lab or workplace, we offer an officially supported version called [Overleaf Server Pro](https://www.overleaf.com/for/enterprises). It also includes more features for security (SSO with LDAP or SAML), administration and collaboration (e.g. tracked changes). [Find out more!](https://www.overleaf.com/for/enterprises)
## Keeping up to date
Sign up to the [mailing list](https://mailchi.mp/overleaf.com/community-edition-and-server-pro) to get updates on Overleaf releases and development.
If you want help installing and maintaining Overleaf in your lab or workplace, Overleaf offers an officially supported version called [Overleaf Server Pro](https://www.overleaf.com/for/enterprises).
## Installation
We have detailed installation instructions in the [Overleaf Toolkit](https://github.com/overleaf/toolkit/).
Detailed installation instructions can be found in the [Overleaf Toolkit](https://github.com/overleaf/toolkit/).
To run a custom image, add a file named docker-compose.override.yml with the following or similar content into the `overleaf-toolkit/config directory`:
## Upgrading
```yml
---
services:
sharelatex:
image: sharelatex/sharelatex:ext-ce
volumes:
- ../config/certs:/overleaf/certs
```
Here, the attached volume provides convenient access for the container to the certificates needed for SAML or LDAP authentication.
If you are upgrading from a previous version of Overleaf, please see the [Release Notes section on the Wiki](https://github.com/overleaf/overleaf/wiki#release-notes) for all of the versions between your current version and the version you are upgrading to.
If you want to build a Docker image of the extended CE based on the upstream v5.4.0 codebase, you can check out the corresponding tag by running:
```
git checkout v5.4.0-ext-v1
```
After building the image, switch to the latest state of the repository and check the `server-ce/hotfix` directory. If a subdirectory matching your version (e.g., `5.4.0`) exists, build a patched image.
Alternatively, you can download a prebuilt image from Docker Hub:
```
docker pull overleafcep/sharelatex:5.4.0-ext-v1
```
Make sure to update the image name in overleaf-toolkit/config/docker-compose.override.yml accordingly.
## Sandboxed Compiles
To enable sandboxed compiles (also known as "Sibling containers"), set the following configuration options in `overleaf-toolkit/config/overleaf.rc`:
```
SERVER_PRO=true
SIBLING_CONTAINERS_ENABLED=true
```
The following environment variables are used to specify which TeX Live images to use for sandboxed compiles:
- `ALL_TEX_LIVE_DOCKER_IMAGES` **(required)**
* A comma-separated list of TeX Live images to use. These images will be downloaded or updated.
To skip downloading the images, set `SIBLING_CONTAINERS_PULL=false` in `config/overleaf.rc`.
- `ALL_TEX_LIVE_DOCKER_IMAGE_NAMES`
* A comma-separated list of friendly names for the images. If omitted, the version name will be used (e.g., `latest-full`).
- `TEX_LIVE_DOCKER_IMAGE` **(required)**
* The default TeX Live image that will be used for compiling new projects. The environment variable `ALL_TEX_LIVE_DOCKER_IMAGES` must include this image.
Users can select the image for their project in the project menu.
Here is an example where the default TeX Live image is `latest-full` from Docker Hub, but the `TL2024-historic` image can be used for older projects:
```
ALL_TEX_LIVE_DOCKER_IMAGES=texlive/texlive:latest-full, texlive/texlive:TL2024-historic
ALL_TEX_LIVE_DOCKER_IMAGE_NAMES=TeXLive 2025, TeXLive 2024
TEX_LIVE_DOCKER_IMAGE=texlive/texlive:latest-full
```
For additional details refer to
[Server Pro: Sandboxed Compiles](https://github.com/overleaf/overleaf/wiki/Server-Pro:-Sandboxed-Compiles) and
[Toolkit: Sandboxed Compiles](https://github.com/overleaf/toolkit/blob/master/doc/sandboxed-compiles.md).
When the compilation takes place in a dedicated container, it is relatively safe to permit running external commands from inside the TeX
file during compilation. This is required for packages like `minted`. For this purpose, the following environment variable can be used:
- `TEX_COMPILER_EXTRA_FLAGS`
* A list of extra flags for TeX compiler. Example: `-shell-escape -file-line-error`
<details>
<summary><h4>Sample variables.env file</h4></summary>
```
OVERLEAF_APP_NAME="Our Overleaf Instance"
ENABLED_LINKED_FILE_TYPES=project_file,project_output_file
# Enables Thumbnail generation using ImageMagick
ENABLE_CONVERSIONS=true
# Disables email confirmation requirement
EMAIL_CONFIRMATION_DISABLED=true
## Nginx
# NGINX_WORKER_PROCESSES=4
# NGINX_WORKER_CONNECTIONS=768
## Set for TLS via nginx-proxy
# OVERLEAF_BEHIND_PROXY=true
# OVERLEAF_SECURE_COOKIE=true
OVERLEAF_SITE_URL=http://my-overleaf-instance.com
OVERLEAF_NAV_TITLE=Our Overleaf Instance
# OVERLEAF_HEADER_IMAGE_URL=http://somewhere.com/mylogo.png
OVERLEAF_ADMIN_EMAIL=support@example.com
OVERLEAF_LEFT_FOOTER=[{"text": "Contact your support team", "url": "mailto:support@example.com"}]
OVERLEAF_RIGHT_FOOTER=[{"text":"Hello, I am on the Right", "url":"https://github.com/yu-i-i/overleaf-cep"}]
OVERLEAF_EMAIL_FROM_ADDRESS=team@example.com
OVERLEAF_EMAIL_SMTP_HOST=smtp.example.com
OVERLEAF_EMAIL_SMTP_PORT=587
OVERLEAF_EMAIL_SMTP_SECURE=false
# OVERLEAF_EMAIL_SMTP_USER=
# OVERLEAF_EMAIL_SMTP_PASS=
# OVERLEAF_EMAIL_SMTP_NAME=
OVERLEAF_EMAIL_SMTP_LOGGER=false
OVERLEAF_EMAIL_SMTP_TLS_REJECT_UNAUTH=true
OVERLEAF_EMAIL_SMTP_IGNORE_TLS=false
OVERLEAF_CUSTOM_EMAIL_FOOTER=This system is run by department x
OVERLEAF_PROXY_LEARN=true
NAV_HIDE_POWERED_BY=true
########################
## Sandboxed Compiles ##
########################
ALL_TEX_LIVE_DOCKER_IMAGES=texlive/texlive:latest-full, texlive/texlive:TL2023-historic
ALL_TEX_LIVE_DOCKER_IMAGE_NAMES=TeXLive 2024, TeXLive 2023
TEX_LIVE_DOCKER_IMAGE=texlive/texlive:latest-full
TEX_COMPILER_EXTRA_FLAGS=-shell-escape
```
</details>
## Authentication Methods
The following authentication methods are supported: local authentication, LDAP authentication, SAML authentication,
and OpenID Connect (OIDC) authentication. Local authentication is always active. The environment variable `EXTERNAL_AUTH`
specifies which external authentication methods are activated. The value of this variable is a list. If the list includes `ldap`, `saml`, or `oidc`,
then LDAP authentication, SAML authentication, and OIDC authentication will be activated, respectively.
For example: `EXTERNAL_AUTH=ldap saml oidc`
This configuration activates all available authentication methods, although this is rarely necessary.
<details>
<summary><h3>Local Authentication</h3></summary>
Password of local users stored in the MongoDB database. An admin user can create a new local user. For details, visit the
[wiki of Overleaf project](https://github.com/overleaf/overleaf/wiki/Creating-and-managing-users).
It is possible to enforce password restrictions on local users:
* `OVERLEAF_PASSWORD_VALIDATION_MIN_LENGTH`: The minimum length required
* `OVERLEAF_PASSWORD_VALIDATION_MAX_LENGTH`: The maximum length allowed
* `OVERLEAF_PASSWORD_VALIDATION_PATTERN`: is used to validate password strength
- `abc123` – password requires 3 letters and 3 numbers and be at least 6 characters long
- `aA` – password requires lower and uppercase letters and be at least 2 characters long
- `ab$3` – it must contain letters, digits and symbols and be at least 4 characters long
- There are 4 groups of characters: letters, UPPERcase letters, digits, symbols. Anything that is neither a letter nor a digit is considered to be a symbol.
</details>
<details>
<summary><h3>LDAP Authentication</h3></summary>
Internally, Overleaf LDAP uses the [passport-ldapauth](https://github.com/vesse/passport-ldapauth) library. Most of these configuration options are passed through to the `server` config object which is used to configure `passport-ldapauth`. If you are having issues configuring LDAP, it is worth reading the README for `passport-ldapauth` to understand the configuration it expects.
When using Local and LDAP authentication methods, a user enters a `username` and `password` in the login form. If LDAP authentication is enabled, it is attempted first:
1. An LDAP user is searched for in the LDAP directory using the filter defined by `OVERLEAF_LDAP_SEARCH_FILTER` and authenticated.
2. If authentication is successful, the Overleaf users database is checked for a user with the primary email address that matches the email address of the authenticated LDAP user:
- If a matching user is found, the `hashedPassword` field for this user is deleted (if it exists). This ensures that the user can only log in via LDAP authentication in the future.
- If no matching user is found, a new Overleaf user is created using the email, first name, and last name retrieved from the LDAP server.
3. If LDAP authentication fails or is unsuccessful, local authentication is attempted.
#### Environment Variables
- `OVERLEAF_LDAP_URL` **(required)**
* URL of the LDAP server.
- Example: `ldaps://ldap.example.com:636` (LDAP over SSL)
- Example: `ldap://ldap.example.com:389` (unencrypted or STARTTLS, if configured).
- `OVERLEAF_LDAP_EMAIL_ATT`
* The email attribute returned by the LDAP server, default `mail`. Each LDAP user must have at least one email address.
If multiple addresses are provided, only the first one will be used.
- `OVERLEAF_LDAP_FIRST_NAME_ATT`
* The property name holding the first name of the user which is used in the application, usually `givenName`.
- `OVERLEAF_LDAP_LAST_NAME_ATT`
* The property name holding the family name of the user which is used in the application, usually `sn`.
- `OVERLEAF_LDAP_NAME_ATT`
* The property name holding the full name of the user, usually `cn`. If either of the two previous variables is not defined,
the first and/or last name of the user is extracted from this variable. Otherwise, it is not used.
- `OVERLEAF_LDAP_PLACEHOLDER`
* The placeholder for the login form, defaults to `Username`.
- `OVERLEAF_LDAP_UPDATE_USER_DETAILS_ON_LOGIN`
* If set to `true`, updates the LDAP user `first_name` and `last_name` field on login, and turn off the user details form on the `/user/settings`
page for LDAP users. Otherwise, details will be fetched only on first login.
- `OVERLEAF_LDAP_BIND_DN`
* The distinguished name of the LDAP user that should be used for the LDAP connection
(this user should be able to search/list accounts on the LDAP server),
e.g., `cn=ldap_reader,dc=example,dc=com`. If not defined, anonymous binding is used.
- `OVERLEAF_LDAP_BIND_CREDENTIALS`
* Password for `OVERLEAF_LDAP_BIND_DN`.
- `OVERLEAF_LDAP_BIND_PROPERTY`
* Property of the user to bind against the client, defaults to `dn`.
- `OVERLEAF_LDAP_SEARCH_BASE` **(required)**
* The base DN from which to search for users. E.g., `ou=people,dc=example,dc=com`.
- `OVERLEAF_LDAP_SEARCH_FILTER`
* LDAP search filter with which to find a user. Use the literal '{{username}}' to have the given username be interpolated in for the LDAP search.
- Example: `(|(uid={{username}})(mail={{username}}))` (user can login with email or with login name).
- Example: `(sAMAccountName={{username}})` (Active Directory).
- `OVERLEAF_LDAP_SEARCH_SCOPE`
* The scope of the search can be `base`, `one`, or `sub` (default).
- `OVERLEAF_LDAP_SEARCH_ATTRIBUTES`
* JSON array of attributes to fetch from the LDAP server, e.g., `["uid", "mail", "givenName", "sn"]`.
By default, all attributes are fetched.
- `OVERLEAF_LDAP_STARTTLS`
* If `true`, LDAP over TLS is used.
- `OVERLEAF_LDAP_TLS_OPTS_CA_PATH`
* Path to the file containing the CA certificate used to verify the LDAP server's SSL/TLS certificate. If there are multiple certificates, then
it can be a JSON array of paths to the certificates. The files must be accessible to the docker container.
- Example (one certificate): `/overleaf/certs/ldap_ca_cert.pem`
- Example (multiple certificates): `["/overleaf/certs/ldap_ca_cert1.pem", "/overleaf/certs/ldap_ca_cert2.pem"]`
- `OVERLEAF_LDAP_TLS_OPTS_REJECT_UNAUTH`
* If `true`, the server certificate is verified against the list of supplied CAs.
- `OVERLEAF_LDAP_CACHE`
* If `true`, then up to 100 credentials at a time will be cached for 5 minutes.
- `OVERLEAF_LDAP_TIMEOUT`
* How long the client should let operations live for before timing out, ms (Default: Infinity).
- `OVERLEAF_LDAP_CONNECT_TIMEOUT`
* How long the client should wait before timing out on TCP connections, ms (Default: OS default).
- `OVERLEAF_LDAP_IS_ADMIN_ATT` and `OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE`
* When both environment variables are set, the login process updates `user.isAdmin = true` if the LDAP profile contains the attribute specified by
`OVERLEAF_LDAP_IS_ADMIN_ATT` and its value either matches `OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE` or is an array containing `OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE`,
otherwise `user.isAdmin` is set to `false`. If either of these variables is not set, then the admin status is only set to `true` during admin user
creation in Launchpad.
The following five variables are used to configure how user contacts are retrieved from the LDAP server.
- `OVERLEAF_LDAP_CONTACTS_FILTER`
* The filter used to search for users in the LDAP server to be loaded into contacts. The placeholder '{{userProperty}}' within the filter is replaced with the value of
the property specified by `OVERLEAF_LDAP_CONTACTS_PROPERTY` from the LDAP user initiating the search. If not defined, no users are retrieved from the LDAP server into contacts.
- `OVERLEAF_LDAP_CONTACTS_SEARCH_BASE`
* Specifies the base DN from which to start searching for the contacts. Defaults to `OVERLEAF_LDAP_SEARCH_BASE`.
- `OVERLEAF_LDAP_CONTACTS_SEARCH_SCOPE`
* The scope of the search can be `base`, `one`, or `sub` (default).
- `OVERLEAF_LDAP_CONTACTS_PROPERTY`
* Specifies the property of the user object that will replace the '{{userProperty}}' placeholder in the `OVERLEAF_LDAP_CONTACTS_FILTER`.
- `OVERLEAF_LDAP_CONTACTS_NON_LDAP_VALUE`
* Specifies the value of the `OVERLEAF_LDAP_CONTACTS_PROPERTY` if the search is initiated by a non-LDAP user. If this variable is not defined, the resulting filter
will match nothing. The value `*` can be used as a wildcard.
<details>
<summary><h5>Example</h5></summary>
OVERLEAF_LDAP_CONTACTS_FILTER=(gidNumber={{userProperty}})
OVERLEAF_LDAP_CONTACTS_PROPERTY=gidNumber
OVERLEAF_LDAP_CONTACTS_NON_LDAP_VALUE=1000
The above example results in loading into the contacts of the current LDAP user all LDAP users who have the same UNIX `gid`. Non-LDAP users will have all LDAP users with UNIX `gid=1000` in their contacts.
</details>
<details>
<summary><h4>Sample variables.env file</h4></summary>
```
OVERLEAF_APP_NAME="Our Overleaf Instance"
ENABLED_LINKED_FILE_TYPES=project_file,project_output_file
# Enables Thumbnail generation using ImageMagick
ENABLE_CONVERSIONS=true
# Disables email confirmation requirement
EMAIL_CONFIRMATION_DISABLED=true
## Nginx
# NGINX_WORKER_PROCESSES=4
# NGINX_WORKER_CONNECTIONS=768
## Set for TLS via nginx-proxy
# OVERLEAF_BEHIND_PROXY=true
# OVERLEAF_SECURE_COOKIE=true
OVERLEAF_SITE_URL=http://my-overleaf-instance.com
OVERLEAF_NAV_TITLE=Our Overleaf Instance
# OVERLEAF_HEADER_IMAGE_URL=http://somewhere.com/mylogo.png
OVERLEAF_ADMIN_EMAIL=support@example.com
OVERLEAF_LEFT_FOOTER=[{"text": "Contact your support team", "url": "mailto:support@example.com"}]
OVERLEAF_RIGHT_FOOTER=[{"text":"Hello, I am on the Right", "url":"https://github.com/yu-i-i/overleaf-cep"}]
OVERLEAF_EMAIL_FROM_ADDRESS=team@example.com
OVERLEAF_EMAIL_SMTP_HOST=smtp.example.com
OVERLEAF_EMAIL_SMTP_PORT=587
OVERLEAF_EMAIL_SMTP_SECURE=false
# OVERLEAF_EMAIL_SMTP_USER=
# OVERLEAF_EMAIL_SMTP_PASS=
# OVERLEAF_EMAIL_SMTP_NAME=
OVERLEAF_EMAIL_SMTP_LOGGER=false
OVERLEAF_EMAIL_SMTP_TLS_REJECT_UNAUTH=true
OVERLEAF_EMAIL_SMTP_IGNORE_TLS=false
OVERLEAF_CUSTOM_EMAIL_FOOTER=This system is run by department x
OVERLEAF_PROXY_LEARN=true
NAV_HIDE_POWERED_BY=true
#################
## LDAP for CE ##
#################
EXTERNAL_AUTH=ldap
OVERLEAF_LDAP_URL=ldap://ldap.example.com:389
OVERLEAF_LDAP_STARTTLS=true
OVERLEAF_LDAP_TLS_OPTS_CA_PATH=/overleaf/certs/ldap_ca_cert.pem
OVERLEAF_LDAP_SEARCH_BASE=ou=people,dc=example,dc=com
OVERLEAF_LDAP_SEARCH_FILTER=(|(uid={{username}})(mail={{username}}))
OVERLEAF_LDAP_BIND_DN=cn=ldap_reader,dc=example,dc=com
OVERLEAF_LDAP_BIND_CREDENTIALS=GoodNewsEveryone
OVERLEAF_LDAP_EMAIL_ATT=mail
OVERLEAF_LDAP_FIRST_NAME_ATT=givenName
OVERLEAF_LDAP_LAST_NAME_ATT=sn
# OVERLEAF_LDAP_NAME_ATT=cn
OVERLEAF_LDAP_SEARCH_ATTRIBUTES=["uid", "sn", "givenName", "mail"]
OVERLEAF_LDAP_UPDATE_USER_DETAILS_ON_LOGIN=true
OVERLEAF_LDAP_PLACEHOLDER='Username or email address'
OVERLEAF_LDAP_IS_ADMIN_ATT=mail
OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE=admin@example.com
OVERLEAF_LDAP_CONTACTS_FILTER=(gidNumber={{userProperty}})
OVERLEAF_LDAP_CONTACTS_PROPERTY=gidNumber
OVERLEAF_LDAP_CONTACTS_NON_LDAP_VALUE='*'
```
</details>
<details>
<summary><i>Deprecated variables</i></summary>
**These variables will be removed soon**, use `OVERLEAF_LDAP_IS_ADMIN_ATT` and `OVERLEAF_LDAP_IS_ADMIN_ATT_VALUE` instead.
The following variables are used to determine if the user has admin rights.
Please note: the user gains admin status if the search result is not empty, not when the user is explicitly included in the search results.
- `OVERLEAF_LDAP_ADMIN_SEARCH_BASE`
* Specifies the base DN from which to start searching for the admin group. If this variable is defined,
`OVERLEAF_LDAP_ADMIN_SEARCH_FILTER` must also be defined for the search to function properly.
- `OVERLEAF_LDAP_ADMIN_SEARCH_FILTER`
* Defines the LDAP search filter used to identify the admin group. The placeholder `{{dn}}` within the filter
is replaced with the value of the property specified by `OVERLEAF_LDAP_ADMIN_DN_PROPERTY`. The placeholder `{{username}}` is also supported.
- `OVERLEAF_LDAP_ADMIN_DN_PROPERTY`
* Specifies the property of the user object that will replace the '{{dn}}' placeholder
in the `OVERLEAF_LDAP_ADMIN_SEARCH_FILTER`, defaults to `dn`.
- `OVERLEAF_LDAP_ADMIN_SEARCH_SCOPE`
* The scope of the LDAP search can be `base`, `one`, or `sub` (default)
<details>
<summary><h5>Example</h5></summary>
In the following example admins are members of a group `admins`, the objectClass of the entry `admins` is `groupOfNames`:
OVERLEAF_LDAP_ADMIN_SEARCH_BASE='cn=admins,ou=group,dc=example,dc=com'
OVERLEAF_LDAP_ADMIN_SEARCH_FILTER='(member={{dn}})'
In the following example admins are members of a group 'admins', the objectClass of the entry `admins` is `posixGroup`:
OVERLEAF_LDAP_ADMIN_SEARCH_BASE='cn=admins,ou=group,dc=example,dc=com'
OVERLEAF_LDAP_ADMIN_SEARCH_FILTER='(memberUid={{username}})'
In the following example admins are users with UNIX gid=1234:
OVERLEAF_LDAP_ADMIN_SEARCH_BASE='ou=people,dc=example,dc=com'
OVERLEAF_LDAP_ADMIN_SEARCH_FILTER='(&(gidNumber=1234)(uid={{username}}))'
In the following example admin is the user with `uid=someuser`:
OVERLEAF_LDAP_ADMIN_SEARCH_BASE='ou=people,dc=example,dc=com'
OVERLEAF_LDAP_ADMIN_SEARCH_FILTER='(&(uid=someuser)(uid={{username}}))'
The filter
OVERLEAF_LDAP_ADMIN_SEARCH_FILTER='(uid=someuser)'
where `someuser` is the uid of an existing user, will always produce a non-empty search result.
As a result, **every user will be granted admin rights**, not just `someuser`, as one might expect.
</details>
</details>
</details>
<details>
<summary><h3>SAML Authentication</h3></summary>
Internally, Overleaf SAML module uses the [passport-saml](https://github.com/node-saml/passport-saml) library, most of the following
configuration options are passed through to `passport-saml`. If you are having issues configuring SAML, it is worth reading the README
for `passport-saml` to get a feel for the configuration it expects.
When using the SAML authentication method, a user is redirected to the Identity Provider (IdP) authentication site.
If the IdP successfully authenticates the user, the Overleaf users database is checked for a record containing a `samlIdentifiers` field structured as follows:
```
samlIdentifiers: [
{
externalUserId: "...",
providerId: "1",
userIdAttribute: "..."
}
]
```
The `externalUserId` must match the value of the property specified by `userIdAttribute` in the user profile returned by the IdP server.
If no matching record is found, the database is searched for a user with the primary email address matching the email in the IdP user profile:
- If such a user is found, the `hashedPassword` field is deleted to disable local authentication, and the `samlIdentifiers` field is added.
- If no matching user is found, a new user is created with the email address and `samlIdentifiers` from the IdP profile.
**Note:** Currently, only one SAML IdP is supported. The `providerId` field in `samlIdentifiers` is fixed to `'1'`.
#### Environment Variables
- `OVERLEAF_SAML_IDENTITY_SERVICE_NAME`
* Display name for the identity service, used on the login page (default: `Log in with SAML IdP`).
- `OVERLEAF_SAML_USER_ID_FIELD`
* The value of this attribute will be used by Overleaf as the external user ID, defaults to `nameID`.
- `OVERLEAF_SAML_EMAIL_FIELD`
* Name of the Email field in user profile, defaults to `nameID`.
- `OVERLEAF_SAML_FIRST_NAME_FIELD`
* Name of the firstName field in user profile, defaults to `givenName`.
- `OVERLEAF_SAML_LAST_NAME_FIELD`
* Name of the lastName field in user profile, defaults to `lastName`
- `OVERLEAF_SAML_UPDATE_USER_DETAILS_ON_LOGIN`
* If set to `true`, updates the user `first_name` and `last_name` field on login,
and turn off the user details form on `/user/settings` page.
- `OVERLEAF_SAML_ENTRYPOINT` **(required)**
* Entrypoint URL for the SAML identity service.
- Example: `https://idp.example.com/simplesaml/saml2/idp/SSOService.php`
- Azure Example: `https://login.microsoftonline.com/8b26b46a-6dd3-45c7-a104-f883f4db1f6b/saml2`
- `OVERLEAF_SAML_ISSUER` **(required)**
* The Issuer name.
- `OVERLEAF_SAML_AUDIENCE`
* Expected saml response Audience, defaults to value of `OVERLEAF_SAML_ISSUER`.
- `OVERLEAF_SAML_IDP_CERT` **(required)**
* Path to a file containing the Identity Provider's public certificate, used to validate the signatures of incoming SAML responses. If the Identity Provider has multiple valid signing certificates, then
it can be a JSON array of paths to the certificates.
- Example (one certificate): `/overleaf/certs/idp_cert.pem`
- Example (multiple certificates): `["/overleaf/certs/idp_cert.pem", "/overleaf/certs/idp_cert_old.pem"]`
- `OVERLEAF_SAML_PUBLIC_CERT`
* Path to a file containing public signing certificate used to embed in auth requests in order for the IdP to validate the signatures of the incoming SAML Request. It's required when setting up the [metadata endpoint](#metadata-for-the-identity-provider)
when the strategy is configured with a `OVERLEAF_SAML_PRIVATE_KEY`. A JSON array of paths to certificates can be provided to support certificate rotation. When supplying an array of certificates, the first entry in the array should match the
current `OVERLEAF_SAML_PRIVATE_KEY`. Additional entries in the array can be used to publish upcoming certificates to IdPs before changing the `OVERLEAF_SAML_PRIVATE_KEY`.
- `OVERLEAF_SAML_PRIVATE_KEY`
* Path to a file containing a PEM-formatted private key matching the `OVERLEAF_SAML_PUBLIC_CERT` used to sign auth requests sent by passport-saml.
- `OVERLEAF_SAML_DECRYPTION_CERT`
* Path to a file containing public certificate, used for the [metadata endpoint](#metadata-for-the-identity-provider).
- `OVERLEAF_SAML_DECRYPTION_PVK`
* Path to a file containing private key matching the `OVERLEAF_SAML_DECRYPTION_CERT` that will be used to attempt to decrypt any encrypted assertions that are received.
- `OVERLEAF_SAML_SIGNATURE_ALGORITHM`
* Optionally set the signature algorithm for signing requests,
valid values are 'sha1' (default), 'sha256' (prefered), 'sha512' (most secure, check if your IdP supports it).
- `OVERLEAF_SAML_ADDITIONAL_PARAMS`
* JSON dictionary of additional query params to add to all requests.
- `OVERLEAF_SAML_ADDITIONAL_AUTHORIZE_PARAMS`
* JSON dictionary of additional query params to add to 'authorize' requests.
- Example: `{"some_key": "some_value"}`
- `OVERLEAF_SAML_IDENTIFIER_FORMAT`
* Name identifier format to request from the identity provider (default: `urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress`).
If using `urn:oasis:names:tc:SAML:2.0:nameid-format:persistent`, ensure the `OVERLEAF_SAML_EMAIL_FIELD` envirionment variable is defined.
If `urn:oasis:names:tc:SAML:2.0:nameid-format:transient` is required, you must also define the `OVERLEAF_SAML_ID_FIELD` environment variable,
which can, for example, be set to the user's email address.
- `OVERLEAF_SAML_ACCEPTED_CLOCK_SKEW_MS`
* Time in milliseconds of skew that is acceptable between client and server when checking OnBefore and NotOnOrAfter assertion
condition validity timestamps. Setting to -1 will disable checking these conditions entirely. Default is 0.
- `OVERLEAF_SAML_ATTRIBUTE_CONSUMING_SERVICE_INDEX`
* `AttributeConsumingServiceIndex` attribute to add to AuthnRequest to instruct the IdP which attribute set to attach
to the response ([link](http://blog.aniljohn.com/2014/01/data-minimization-front-channel-saml-attribute-requests.html)).
- `OVERLEAF_SAML_AUTHN_CONTEXT`
* JSON array of name identifier format values to request auth context. Default: `["urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport"]`.
- `OVERLEAF_SAML_FORCE_AUTHN`
* If `true`, the initial SAML request from the service provider specifies that the IdP should force re-authentication of the user,
even if they possess a valid session.
- `OVERLEAF_SAML_DISABLE_REQUESTED_AUTHN_CONTEXT`
* If `true`, do not request a specific auth context. For example, you can this this to `true` to allow additional contexts such as password-less logins (`urn:oasis:names:tc:SAML:2.0:ac:classes:X509`). Support for additional contexts is dependant on your IdP.
- `OVERLEAF_SAML_AUTHN_REQUEST_BINDING`
* If set to `HTTP-POST`, will request authentication from IdP via HTTP POST binding, otherwise defaults to HTTP-Redirect.
- `OVERLEAF_SAML_VALIDATE_IN_RESPONSE_TO`
* If `always`, then InResponseTo will be validated from incoming SAML responses.
* If `never`, then InResponseTo won't be validated (default).
* If `ifPresent`, then InResponseTo will only be validated if present in the incoming SAML response.
- `OVERLEAF_SAML_WANT_ASSERTIONS_SIGNED` and `OVERLEAF_SAML_WANT_AUTHN_RESPONSE_SIGNED`
* When set to `true` (default), Overleaf expects the SAML Assertions, respectively the entire SAML Authentication Response, to be signed by the IdP.
When both options are `false`, at least one of the assertions or the response must be signed.
- `OVERLEAF_SAML_REQUEST_ID_EXPIRATION_PERIOD_MS`
* Defines the expiration time when a Request ID generated for a SAML request will not be valid if seen
in a SAML response in the `InResponseTo` field. Default: 28800000 (8 hours).
- `OVERLEAF_SAML_LOGOUT_URL`
* base address to call with logout requests (default: `entryPoint`).
- Example: `https://idp.example.com/simplesaml/saml2/idp/SingleLogoutService.php`
- `OVERLEAF_SAML_ADDITIONAL_LOGOUT_PARAMS`
* JSON dictionary of additional query params to add to 'logout' requests.
- `OVERLEAF_SAML_IS_ADMIN_FIELD` and `OVERLEAF_SAML_IS_ADMIN_FIELD_VALUE`
* When both environment variables are set, the login process updates `user.isAdmin = true` if the profile returned by the SAML IdP contains the attribute specified by
`OVERLEAF_SAML_IS_ADMIN_FIELD` and its value either matches `OVERLEAF_SAML_IS_ADMIN_FIELD_VALUE` or is an array containing `OVERLEAF_SAML_IS_ADMIN_FIELD_VALUE`,
otherwise `user.isAdmin` is set to `false`. If either of these variables is not set, then the admin status is only set to `true` during admin user
creation in Launchpad.
#### Metadata for the Identity Provider
The current version of Overleaf CE includes and endpoint to retrieve Service Provider Metadata: `http://my-overleaf-instance.com/saml/meta`
The Identity Provider will need to be configured to recognize the Overleaf server as a "Service Provider". Consult the documentation for your SAML server for instructions on how to do this.
Below is an example of appropriate Service Provider metadata:
<details>
<summary><h5>ol-meta.xml</h5></summary>
```
<?xml version="1.0"?>
<EntityDescriptor xmlns="urn:oasis:names:tc:SAML:2.0:metadata"
xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
entityID="MyOverleaf"
ID="_b508c83b7dda452f5b269383fb391107116f8f57">
<SPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol" AuthnRequestsSigned="true" WantAssertionsSigned="true">
<KeyDescriptor use="signing">
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>MII...
[skipped]
</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</KeyDescriptor>
<KeyDescriptor use="encryption">
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>MII...
[skipped]
</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
<EncryptionMethod Algorithm="http://www.w3.org/2009/xmlenc11#aes256-gcm"/>
<EncryptionMethod Algorithm="http://www.w3.org/2009/xmlenc11#aes128-gcm"/>
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc"/>
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"/>
</KeyDescriptor>
<SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
Location="https://my-overleaf-instance.com/saml/logout/callback"/>
<NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</NameIDFormat>
<AssertionConsumerService index="1"
isDefault="true"
Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
Location="https://my-overleaf-instance.com/saml/login/callback"/>
</SPSSODescriptor>
</EntityDescriptor>
```
</details>
Note the certificates, `AssertionConsumerService.Location`, `SingleLogoutService.Location` and `EntityDescriptor.entityID`
and set as appropriate in your IdP configuration, or send the metadata file to the IdP admin.
<details>
<summary><h4>Sample variables.env file</h4></summary>
```
OVERLEAF_APP_NAME="Our Overleaf Instance"
ENABLED_LINKED_FILE_TYPES=project_file,project_output_file
# Enables Thumbnail generation using ImageMagick
ENABLE_CONVERSIONS=true
# Disables email confirmation requirement
EMAIL_CONFIRMATION_DISABLED=true
## Nginx
# NGINX_WORKER_PROCESSES=4
# NGINX_WORKER_CONNECTIONS=768
## Set for TLS via nginx-proxy
# OVERLEAF_BEHIND_PROXY=true
# OVERLEAF_SECURE_COOKIE=true
OVERLEAF_SITE_URL=http://my-overleaf-instance.com
OVERLEAF_NAV_TITLE=Our Overleaf Instance
# OVERLEAF_HEADER_IMAGE_URL=http://somewhere.com/mylogo.png
OVERLEAF_ADMIN_EMAIL=support@example.com
OVERLEAF_LEFT_FOOTER=[{"text": "Contact your support team", "url": "mailto:support@example.com"}]
OVERLEAF_RIGHT_FOOTER=[{"text":"Hello, I am on the Right", "url":"https://github.com/yu-i-i/overleaf-cep"}]
OVERLEAF_EMAIL_FROM_ADDRESS=team@example.com
OVERLEAF_EMAIL_SMTP_HOST=smtp.example.com
OVERLEAF_EMAIL_SMTP_PORT=587
OVERLEAF_EMAIL_SMTP_SECURE=false
# OVERLEAF_EMAIL_SMTP_USER=
# OVERLEAF_EMAIL_SMTP_PASS=
# OVERLEAF_EMAIL_SMTP_NAME=
OVERLEAF_EMAIL_SMTP_LOGGER=false
OVERLEAF_EMAIL_SMTP_TLS_REJECT_UNAUTH=true
OVERLEAF_EMAIL_SMTP_IGNORE_TLS=false
OVERLEAF_CUSTOM_EMAIL_FOOTER=This system is run by department x
OVERLEAF_PROXY_LEARN=true
NAV_HIDE_POWERED_BY=true
#################
## SAML for CE ##
#################
EXTERNAL_AUTH=saml
OVERLEAF_SAML_IDENTITY_SERVICE_NAME='Log in with My IdP'
OVERLEAF_SAML_EMAIL_FIELD=mail
OVERLEAF_SAML_FIRST_NAME_FIELD=givenName
OVERLEAF_SAML_LAST_NAME_FIELD=sn
OVERLEAF_SAML_ENTRYPOINT=https://idp.example.com/simplesamlphp/saml2/idp/SSOService.php
OVERLEAF_SAML_CALLBACK_URL=https://my-overleaf-instance.com/saml/login/callback
OVERLEAF_SAML_LOGOUT_URL=https://idp.example.com/simplesamlphp/saml2/idp/SingleLogoutService.php
OVERLEAF_SAML_LOGOUT_CALLBACK_URL=https://my-overleaf-instance.com/saml/logout/callback
OVERLEAF_SAML_ISSUER=MyOverleaf
OVERLEAF_SAML_IDP_CERT=/overleaf/certs/idp_cert.pem
OVERLEAF_SAML_PUBLIC_CERT=/overleaf/certs/myol_cert.pem
OVERLEAF_SAML_PRIVATE_KEY=/overleaf/certs/myol_key.pem
OVERLEAF_SAML_DECRYPTION_CERT=/overleaf/certs/myol_decr_cert.pem
OVERLEAF_SAML_DECRYPTION_PVK=/overleaf/certs/myol_decr_key.pem
OVERLEAF_SAML_IS_ADMIN_FIELD=mail
OVERLEAF_SAML_IS_ADMIN_FIELD_VALUE=overleaf.admin@example.com
```
</details>
</details>
<details>
<summary><h3>OIDC Authentication</h3></summary>
Internally, Overleaf OIDC module uses the [passport-openidconnect](https://github.com/jaredhanson/passport-openidconnect) library.
If you are having issues configuring OpenID Connect, it is worth reading the README for `passport-openidconnect` to get a feel for the configuration it expects.
When using the OIDC authentication method, a user is redirected to the Identity Provider (IdP) authentication site.
If the IdP successfully authenticates the user, the Overleaf users database is checked for a record containing a `thirdPartyIdentifiers` field structured as follows:
```
thirdPartyIdentifiers: [
{
externalUserId: "...",
externalData: null,
providerId: "..."
}
]
```
The `externalUserId` must match the user ID in the profile returned by the IdP server (see the `OVERLEAF_OIDC_USER_ID_FIELD` environment variable), and `providerId`
must match the ID of the OIDC provider (see the `OVERLEAF_OIDC_PROVIDER_ID`).
If no matching record is found, the database is searched for a user with the primary email address matching the email in the IdP user profile:
- If such a user is found, the `thirdPartyIdentifiers` field is updated.
- If no matching user is found, a new user is created with the email address and `thirdPartyIdentifiers` from the IdP profile.
In both cases, the user is said to be 'linked' to the external OIDC user. The user can be unlinked from the OIDC provider on the `/user/settings` page.
#### Environment Variables
The values of the following five required variables can be found using `.well-known/openid-configuration` endpoint of your OpenID Provider (OP).
- `OVERLEAF_OIDC_ISSUER` **(required)**
- `OVERLEAF_OIDC_AUTHORIZATION_URL` **(required)**
- `OVERLEAF_OIDC_TOKEN_URL` **(required)**
- `OVERLEAF_OIDC_USER_INFO_URL` **(required)**
- `OVERLEAF_OIDC_LOGOUT_URL` **(required)**
The values of the following two required variables will be provided by the admin of your OP
- `OVERLEAF_OIDC_CLIENT_ID` **(required)**
- `OVERLEAF_OIDC_CLIENT_SECRET` **(required)**
- `OVERLEAF_OIDC_SCOPE`
* Default: `openid profile email`
- `OVERLEAF_OIDC_PROVIDER_ID`
* Arbitrary ID of the OP, defaults to `oidc`.
- `OVERLEAF_OIDC_PROVIDER_NAME`
* The name of the OP, used in the `Linked Accounts` section of the `/user/settings` page, defaults to `OIDC Provider`.
- `OVERLEAF_OIDC_IDENTITY_SERVICE_NAME`
* Display name for the identity service, used on the login page (default: `Log in with $OVERLEAF_OIDC_PROVIDER_NAME`).
- `OVERLEAF_OIDC_PROVIDER_DESCRIPTION`
* Description of OP, used in the `Linked Accounts` section (default: `Log in with $OVERLEAF_OIDC_PROVIDER_NAME`).
- `OVERLEAF_OIDC_PROVIDER_INFO_LINK`
* `Learn more` URL in the OP description, default: no `Learn more` link in the description.
- `OVERLEAF_OIDC_PROVIDER_HIDE_NOT_LINKED`
* Do not show OP on the `/user/settings` page, if the user's account is not linked with the OP, default `false`.
- `OVERLEAF_OIDC_USER_ID_FIELD`
* The value of this attribute will be used by Overleaf as the external user ID, defaults to `id`.
Other possible reasonable values are `email` and `username` (corresponding to `preferred_username` OIDC claim).
- `OVERLEAF_OIDC_UPDATE_USER_DETAILS_ON_LOGIN`
* If set to `true`, updates the user `first_name` and `last_name` field on login,
and disables the user details form on `/user/settings` page.
- `OVERLEAF_OIDC_IS_ADMIN_FIELD` and `OVERLEAF_OIDC_IS_ADMIN_FIELD_VALUE`
* When both environment variables are set, the login process updates `user.isAdmin = true` if the profile returned by the OP contains the attribute specified by
`OVERLEAF_OIDC_IS_ADMIN_FIELD` and its value matches `OVERLEAF_OIDC_IS_ADMIN_FIELD_VALUE`, otherwise `user.isAdmin` is set to `false`.
If `OVERLEAF_OIDC_IS_ADMIN_FIELD` is `email` then the value of the attribute `emails[0].value` is used for match checking.
The redirect URL for your OpenID Provider is `https://my-overleaf-instance.com/oidc/login/callback`.
<details>
<summary><h4>Sample variables.env file</h4></summary>
```
OVERLEAF_APP_NAME="Our Overleaf Instance"
ENABLED_LINKED_FILE_TYPES=project_file,project_output_file
# Enables Thumbnail generation using ImageMagick
ENABLE_CONVERSIONS=true
# Disables email confirmation requirement
EMAIL_CONFIRMATION_DISABLED=true
## Nginx
# NGINX_WORKER_PROCESSES=4
# NGINX_WORKER_CONNECTIONS=768
## Set for TLS via nginx-proxy
# OVERLEAF_BEHIND_PROXY=true
# OVERLEAF_SECURE_COOKIE=true
OVERLEAF_SITE_URL=http://my-overleaf-instance.com
OVERLEAF_NAV_TITLE=Our Overleaf Instance
# OVERLEAF_HEADER_IMAGE_URL=http://somewhere.com/mylogo.png
OVERLEAF_ADMIN_EMAIL=support@example.com
OVERLEAF_LEFT_FOOTER=[{"text": "Contact your support team", "url": "mailto:support@example.com"}]
OVERLEAF_RIGHT_FOOTER=[{"text":"Hello, I am on the Right", "url":"https://github.com/yu-i-i/overleaf-cep"}]
OVERLEAF_EMAIL_FROM_ADDRESS=team@example.com
OVERLEAF_EMAIL_SMTP_HOST=smtp.example.com
OVERLEAF_EMAIL_SMTP_PORT=587
OVERLEAF_EMAIL_SMTP_SECURE=false
# OVERLEAF_EMAIL_SMTP_USER=
# OVERLEAF_EMAIL_SMTP_PASS=
# OVERLEAF_EMAIL_SMTP_NAME=
OVERLEAF_EMAIL_SMTP_LOGGER=false
OVERLEAF_EMAIL_SMTP_TLS_REJECT_UNAUTH=true
OVERLEAF_EMAIL_SMTP_IGNORE_TLS=false
OVERLEAF_CUSTOM_EMAIL_FOOTER=This system is run by department x
OVERLEAF_PROXY_LEARN=true
NAV_HIDE_POWERED_BY=true
#################
## OIDC for CE ##
#################
EXTERNAL_AUTH=oidc
OVERLEAF_OIDC_PROVIDER_ID=oidc
OVERLEAF_OIDC_ISSUER=https://keycloak.provider.com/realms/example
OVERLEAF_OIDC_AUTHORIZATION_URL=https://keycloak.provider.com/realms/example/protocol/openid-connect/auth
OVERLEAF_OIDC_TOKEN_URL=https://keycloak.provider.com/realms/example/protocol/openid-connect/token
OVERLEAF_OIDC_USER_INFO_URL=https://keycloak.provider.com/realms/example/protocol/openid-connect/userinfo
OVERLEAF_OIDC_LOGOUT_URL=https://keycloak.provider.com/realms/example/protocol/openid-connect/logout
OVERLEAF_OIDC_CLIENT_ID=Overleaf-OIDC
OVERLEAF_OIDC_CLIENT_SECRET=DoNotUseThisATGgaAcTgCcATgGATTACAagGtTCaGcGTAG
OVERLEAF_OIDC_IDENTITY_SERVICE_NAME='Log in with Keycloak OIDC Provider'
OVERLEAF_OIDC_PROVIDER_NAME=OIDC Keycloak Provider
OVERLEAF_OIDC_PROVIDER_INFO_LINK=https://openid.net
OVERLEAF_OIDC_IS_ADMIN_FIELD=email
OVERLEAF_OIDC_IS_ADMIN_FIELD_VALUE=overleaf.admin@example.com
OVERLEAF_OIDC_UPDATE_USER_DETAILS_ON_LOGIN=false
```
</details>
</details>
## Overleaf Docker Image
@@ -60,17 +902,14 @@ in which to run the Overleaf services. Baseimage uses the `runit` service
manager to manage services, and we add our init-scripts from the `server-ce/runit`
folder.
## Contributing
Please see the [CONTRIBUTING](CONTRIBUTING.md) file for information on contributing to the development of Overleaf.
## Authors
[The Overleaf Team](https://www.overleaf.com/about)
<br>
Extensions for CE by: [yu-i-i](https://github.com/yu-i-i/overleaf-cep)
## License
The code in this repository is released under the GNU AFFERO GENERAL PUBLIC LICENSE, version 3. A copy can be found in the [`LICENSE`](LICENSE) file.
Copyright (c) Overleaf, 2014-2024.
Copyright (c) Overleaf, 2014-2025.
+1 -6
View File
@@ -11,12 +11,6 @@ bin/build
> [!NOTE]
> If Docker is running out of RAM while building the services in parallel, create a `.env` file in this directory containing `COMPOSE_PARALLEL_LIMIT=1`.
Next, initialize the database:
```shell
bin/init
```
Then start the services:
```shell
@@ -83,6 +77,7 @@ each service:
| `filestore` | 9235 |
| `notifications` | 9236 |
| `real-time` | 9237 |
| `references` | 9238 |
| `history-v1` | 9239 |
| `project-history` | 9240 |
-6
View File
@@ -1,6 +0,0 @@
#!/usr/bin/env bash
docker compose up --detach mongo
curl --max-time 10 --retry 5 --retry-delay 5 --retry-all-errors --silent --output /dev/null localhost:27017
docker compose exec mongo mongosh --eval "rs.initiate({ _id: 'overleaf', members: [{ _id: 0, host: 'mongo:27017' }] })"
docker compose down mongo
+1
View File
@@ -13,6 +13,7 @@ NOTIFICATIONS_HOST=notifications
PROJECT_HISTORY_HOST=project-history
REALTIME_HOST=real-time
REDIS_HOST=redis
REFERENCES_HOST=references
SESSION_SECRET=foo
WEBPACK_HOST=webpack
WEB_API_PASSWORD=overleaf
+11
View File
@@ -112,6 +112,17 @@ services:
- ../services/real-time/app.js:/overleaf/services/real-time/app.js
- ../services/real-time/config:/overleaf/services/real-time/config
references:
command: ["node", "--watch", "app.js"]
environment:
- NODE_OPTIONS=--inspect=0.0.0.0:9229
ports:
- "127.0.0.1:9238:9229"
volumes:
- ../services/references/app:/overleaf/services/references/app
- ../services/references/config:/overleaf/services/references/config
- ../services/references/app.js:/overleaf/services/references/app.js
web:
command: ["node", "--watch", "app.js", "--watch-locales"]
environment:
+17 -1
View File
@@ -88,12 +88,20 @@ services:
- history-v1-buckets:/buckets
mongo:
image: mongo:5
image: mongo:6.0
command: --replSet overleaf
ports:
- "127.0.0.1:27017:27017" # for debugging
volumes:
- mongo-data:/data/db
- ../bin/shared/mongodb-init-replica-set.js:/docker-entrypoint-initdb.d/mongodb-init-replica-set.js
environment:
MONGO_INITDB_DATABASE: sharelatex
extra_hosts:
# Required when using the automatic database setup for initializing the
# replica set. This override is not needed when running the setup after
# starting up mongo.
- mongo:127.0.0.1
notifications:
build:
@@ -123,6 +131,13 @@ services:
volumes:
- redis-data:/data
references:
build:
context: ..
dockerfile: services/references/Dockerfile
env_file:
- dev.env
web:
build:
context: ..
@@ -153,6 +168,7 @@ services:
- notifications
- project-history
- real-time
- references
webpack:
build:
Binary file not shown.

Before

Width:  |  Height:  |  Size: 587 KiB

After

Width:  |  Height:  |  Size: 1.0 MiB

+3 -7
View File
@@ -40,10 +40,6 @@ services:
# Disables email confirmation requirement
EMAIL_CONFIRMATION_DISABLED: 'true'
# temporary fix for LuaLaTex compiles
# see https://github.com/overleaf/overleaf/issues/695
TEXMFVAR: /var/lib/overleaf/tmp/texmf-var
## Set for SSL via nginx-proxy
#VIRTUAL_HOST: 103.112.212.22
@@ -102,12 +98,12 @@ services:
mongo:
restart: always
image: mongo:5.0
image: mongo:6.0
container_name: mongo
command: '--replSet overleaf'
volumes:
- ~/mongo_data:/data/db
- ./mongodb-init-replica-set.js:/docker-entrypoint-initdb.d/mongodb-init-replica-set.js
- ./bin/shared/mongodb-init-replica-set.js:/docker-entrypoint-initdb.d/mongodb-init-replica-set.js
environment:
MONGO_INITDB_DATABASE: sharelatex
extra_hosts:
@@ -115,7 +111,7 @@ services:
# This override is not needed when running the setup after starting up mongo.
- mongo:127.0.0.1
healthcheck:
test: echo 'db.stats().ok' | mongo localhost:27017/test --quiet
test: echo 'db.stats().ok' | mongosh localhost:27017/test --quiet
interval: 10s
timeout: 10s
retries: 5
+1 -1
View File
@@ -1 +1 @@
20.18.0
20.18.2
@@ -5,6 +5,6 @@ access-token-encryptor
--env-pass-through=
--esmock-loader=False
--is-library=True
--node-version=20.18.0
--node-version=20.18.2
--public-repo=False
--script-version=4.5.0
@@ -21,7 +21,7 @@
"devDependencies": {
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
"mocha": "^10.2.0",
"mocha": "^11.1.0",
"sandboxed-module": "^2.0.4",
"typescript": "^5.0.4"
}
+1 -1
View File
@@ -1 +1 @@
20.18.0
20.18.2
+1 -1
View File
@@ -5,6 +5,6 @@ fetch-utils
--env-pass-through=
--esmock-loader=False
--is-library=True
--node-version=20.18.0
--node-version=20.18.2
--public-repo=False
--script-version=4.5.0
+15 -1
View File
@@ -95,6 +95,19 @@ async function fetchNothing(url, opts = {}) {
* @throws {RequestFailedError} if the response has a non redirect status code or missing Location header
*/
async function fetchRedirect(url, opts = {}) {
const { location } = await fetchRedirectWithResponse(url, opts)
return location
}
/**
* Make a request and extract the redirect from the response.
*
* @param {string | URL} url - request URL
* @param {object} opts - fetch options
* @return {Promise<{location: string, response: Response}>}
* @throws {RequestFailedError} if the response has a non redirect status code or missing Location header
*/
async function fetchRedirectWithResponse(url, opts = {}) {
const { fetchOpts } = parseOpts(opts)
fetchOpts.redirect = 'manual'
const response = await performRequest(url, fetchOpts)
@@ -112,7 +125,7 @@ async function fetchRedirect(url, opts = {}) {
)
}
await discardResponseBody(response)
return location
return { location, response }
}
/**
@@ -297,6 +310,7 @@ module.exports = {
fetchStreamWithResponse,
fetchNothing,
fetchRedirect,
fetchRedirectWithResponse,
fetchString,
fetchStringWithResponse,
RequestFailedError,
+2 -2
View File
@@ -20,8 +20,8 @@
"body-parser": "^1.20.3",
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
"express": "^4.21.0",
"mocha": "^10.2.0",
"express": "^4.21.2",
"mocha": "^11.1.0",
"typescript": "^5.0.4"
},
"dependencies": {
+1 -1
View File
@@ -1 +1 @@
20.18.0
20.18.2
+1 -1
View File
@@ -5,6 +5,6 @@ logger
--env-pass-through=
--esmock-loader=False
--is-library=True
--node-version=20.18.0
--node-version=20.18.2
--public-repo=False
--script-version=4.5.0
+3 -1
View File
@@ -14,8 +14,10 @@ const LoggingManager = {
initialize(name) {
this.isProduction =
(process.env.NODE_ENV || '').toLowerCase() === 'production'
const isTest = (process.env.NODE_ENV || '').toLowerCase() === 'test'
this.defaultLevel =
process.env.LOG_LEVEL || (this.isProduction ? 'info' : 'debug')
process.env.LOG_LEVEL ||
(this.isProduction ? 'info' : isTest ? 'fatal' : 'debug')
this.loggerName = name
this.logger = bunyan.createLogger({
name,
+1 -1
View File
@@ -27,7 +27,7 @@
},
"devDependencies": {
"chai": "^4.3.6",
"mocha": "^10.2.0",
"mocha": "^11.1.0",
"sandboxed-module": "^2.0.4",
"sinon": "^9.2.4",
"sinon-chai": "^3.7.0",
+1 -1
View File
@@ -1 +1 @@
20.18.0
20.18.2
+1 -1
View File
@@ -5,6 +5,6 @@ metrics
--env-pass-through=
--esmock-loader=False
--is-library=True
--node-version=20.18.0
--node-version=20.18.2
--public-repo=False
--script-version=4.5.0
+1 -1
View File
@@ -23,7 +23,7 @@
"devDependencies": {
"bunyan": "^1.0.0",
"chai": "^4.3.6",
"mocha": "^10.2.0",
"mocha": "^11.1.0",
"sandboxed-module": "^2.0.4",
"sinon": "^9.2.4",
"typescript": "^5.0.4"
+1 -1
View File
@@ -1 +1 @@
20.18.0
20.18.2
+1 -1
View File
@@ -5,6 +5,6 @@ mongo-utils
--env-pass-through=
--esmock-loader=False
--is-library=True
--node-version=20.18.0
--node-version=20.18.2
--public-repo=False
--script-version=4.5.0
+2 -2
View File
@@ -16,12 +16,12 @@
"author": "Overleaf (https://www.overleaf.com)",
"license": "AGPL-3.0-only",
"dependencies": {
"mongodb": "6.10.0",
"mongodb": "6.12.0",
"mongodb-legacy": "6.1.3"
},
"devDependencies": {
"chai": "^4.3.6",
"mocha": "^10.2.0",
"mocha": "^11.1.0",
"sandboxed-module": "^2.0.4",
"sinon": "^9.2.4",
"sinon-chai": "^3.7.0",
+1 -1
View File
@@ -1 +1 @@
20.18.0
20.18.2
+1 -1
View File
@@ -5,6 +5,6 @@ o-error
--env-pass-through=
--esmock-loader=False
--is-library=True
--node-version=20.18.0
--node-version=20.18.2
--public-repo=False
--script-version=4.5.0
+1 -1
View File
@@ -34,7 +34,7 @@
"@types/chai": "^4.3.0",
"@types/node": "^18.17.4",
"chai": "^4.3.6",
"mocha": "^10.2.0",
"mocha": "^11.1.0",
"typescript": "^5.0.4"
}
}
+1 -1
View File
@@ -1 +1 @@
20.18.0
20.18.2
+1 -1
View File
@@ -5,6 +5,6 @@ object-persistor
--env-pass-through=
--esmock-loader=False
--is-library=True
--node-version=20.18.0
--node-version=20.18.2
--public-repo=False
--script-version=4.5.0
+2 -2
View File
@@ -34,9 +34,9 @@
"devDependencies": {
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
"mocha": "^10.2.0",
"mocha": "^11.1.0",
"mock-fs": "^5.2.0",
"mongodb": "6.10.0",
"mongodb": "6.12.0",
"sandboxed-module": "^2.0.4",
"sinon": "^9.2.4",
"sinon-chai": "^3.7.0",
@@ -343,9 +343,10 @@ class PerProjectEncryptedS3Persistor extends S3Persistor {
}
async deleteDirectory(bucketName, path, continuationToken) {
// Let [Settings.pathToProjectFolder] validate the project path before deleting things.
const { projectFolder, dekPath } = this.#buildProjectPaths(bucketName, path)
// Note: Listing/Deleting a prefix does not require SSE-C credentials.
await super.deleteDirectory(bucketName, path, continuationToken)
const { projectFolder, dekPath } = this.#buildProjectPaths(bucketName, path)
if (projectFolder === path) {
await super.deleteObject(
this.#settings.dataEncryptionKeyBucketName,
@@ -413,6 +414,16 @@ class CachedPerProjectEncryptedS3Persistor {
return await this.sendStream(bucketName, path, fs.createReadStream(fsPath))
}
/**
*
* @param {string} bucketName
* @param {string} path
* @return {Promise<number>}
*/
async getObjectSize(bucketName, path) {
return await this.#parent.getObjectSize(bucketName, path)
}
/**
* @param {string} bucketName
* @param {string} path
+1 -1
View File
@@ -1 +1 @@
20.18.0
20.18.2
@@ -5,6 +5,6 @@ overleaf-editor-core
--env-pass-through=
--esmock-loader=False
--is-library=True
--node-version=20.18.0
--node-version=20.18.2
--public-repo=False
--script-version=4.5.0
@@ -100,6 +100,9 @@ class Change {
)
}
/**
* @return {Operation[]}
*/
getOperations() {
return this.operations
}
@@ -248,6 +251,24 @@ class Change {
* @param {boolean} [opts.strict] - Do not ignore recoverable errors
*/
applyTo(snapshot, opts = {}) {
// eslint-disable-next-line no-unused-vars
for (const operation of this.iterativelyApplyTo(snapshot, opts)) {
// Nothing to do: we're just consuming the iterator for the side effects
}
}
/**
* Generator that applies this change to a snapshot and yields each
* operation after it has been applied.
*
* Recoverable errors (caused by historical bad data) are ignored unless
* opts.strict is true
*
* @param {Snapshot} snapshot modified in place
* @param {object} opts
* @param {boolean} [opts.strict] - Do not ignore recoverable errors
*/
*iterativelyApplyTo(snapshot, opts = {}) {
assert.object(snapshot, 'bad snapshot')
for (const operation of this.operations) {
@@ -261,6 +282,7 @@ class Change {
throw err
}
}
yield operation
}
// update project version if present in change
+12 -7
View File
@@ -22,7 +22,7 @@ class NonUniquePathnameError extends PathnameError {
* @param {string[]} pathnames
*/
constructor(pathnames) {
super('pathnames are not unique: ' + pathnames, { pathnames })
super('pathnames are not unique', { pathnames })
this.pathnames = pathnames
}
}
@@ -30,9 +30,13 @@ class NonUniquePathnameError extends PathnameError {
class BadPathnameError extends PathnameError {
/**
* @param {string} pathname
* @param {string} reason
*/
constructor(pathname) {
super(pathname + ' is not a valid pathname', { pathname })
constructor(pathname, reason) {
if (pathname.length > 10) {
pathname = pathname.slice(0, 5) + '...' + pathname.slice(-5)
}
super('invalid pathname', { reason, pathname })
this.pathname = pathname
}
}
@@ -42,7 +46,7 @@ class PathnameConflictError extends PathnameError {
* @param {string} pathname
*/
constructor(pathname) {
super(`pathname '${pathname}' conflicts with another file`, { pathname })
super('pathname conflicts with another file', { pathname })
this.pathname = pathname
}
}
@@ -52,7 +56,7 @@ class FileNotFoundError extends PathnameError {
* @param {string} pathname
*/
constructor(pathname) {
super(`file ${pathname} does not exist`, { pathname })
super('file does not exist', { pathname })
this.pathname = pathname
}
}
@@ -315,8 +319,9 @@ function checkPathnamesAreUnique(files) {
*/
function checkPathname(pathname) {
assert.nonEmptyString(pathname, 'bad pathname')
if (safePathname.isClean(pathname)) return
throw new FileMap.BadPathnameError(pathname)
const [isClean, reason] = safePathname.isCleanDebug(pathname)
if (isClean) return
throw new FileMap.BadPathnameError(pathname, reason)
}
/**
@@ -56,18 +56,34 @@ class TextOperation extends EditOperation {
constructor() {
super()
// When an operation is applied to an input string, you can think of this as
// if an imaginary cursor runs over the entire string and skips over some
// parts, removes some parts and inserts characters at some positions. These
// actions (skip/remove/insert) are stored as an array in the "ops" property.
/** @type {ScanOp[]} */
/**
* When an operation is applied to an input string, you can think of this as
* if an imaginary cursor runs over the entire string and skips over some
* parts, removes some parts and inserts characters at some positions. These
* actions (skip/remove/insert) are stored as an array in the "ops" property.
* @type {ScanOp[]}
*/
this.ops = []
// An operation's baseLength is the length of every string the operation
// can be applied to.
/**
* An operation's baseLength is the length of every string the operation
* can be applied to.
*/
this.baseLength = 0
// The targetLength is the length of every string that results from applying
// the operation on a valid input string.
/**
* The targetLength is the length of every string that results from applying
* the operation on a valid input string.
*/
this.targetLength = 0
/**
* The expected content hash after this operation is applied
*
* @type {string | null}
*/
this.contentHash = null
}
/**
@@ -223,7 +239,12 @@ class TextOperation extends EditOperation {
* @returns {RawTextOperation}
*/
toJSON() {
return { textOperation: this.ops.map(op => op.toJSON()) }
/** @type {RawTextOperation} */
const json = { textOperation: this.ops.map(op => op.toJSON()) }
if (this.contentHash != null) {
json.contentHash = this.contentHash
}
return json
}
/**
@@ -231,7 +252,7 @@ class TextOperation extends EditOperation {
* @param {RawTextOperation} obj
* @returns {TextOperation}
*/
static fromJSON = function ({ textOperation: ops }) {
static fromJSON = function ({ textOperation: ops, contentHash }) {
const o = new TextOperation()
for (const op of ops) {
if (isRetain(op)) {
@@ -250,6 +271,9 @@ class TextOperation extends EditOperation {
throw new UnprocessableError('unknown operation: ' + JSON.stringify(op))
}
}
if (contentHash != null) {
o.contentHash = contentHash
}
return o
}
@@ -64,17 +64,57 @@ function cleanPart(filename) {
* @return {String}
*/
exports.clean = function (pathname) {
return exports.cleanDebug(pathname)[0]
}
/**
* See clean
* @param {string} pathname
* @return {[string,string]}
*/
exports.cleanDebug = function (pathname) {
let prev = pathname
let reason = ''
/**
* @param {string} label
*/
function recordReasonIfChanged(label) {
if (pathname === prev) return
if (reason) reason += ','
reason += label
prev = pathname
}
pathname = path.normalize(pathname)
pathname = pathname.replace(/\\/g, '/') // workaround for IE
pathname = pathname.replace(/\/+/g, '/') // no multiple slashes
pathname = pathname.replace(/^(\/.*)$/, '_$1') // no leading /
pathname = pathname.replace(/^(.+)\/$/, '$1') // no trailing /
pathname = pathname.replace(/^ *(.*)$/, '$1') // no leading spaces
pathname = pathname.replace(/^(.*[^ ]) *$/, '$1') // no trailing spaces
recordReasonIfChanged('normalize')
pathname = pathname.replace(/\\/g, '/')
recordReasonIfChanged('workaround for IE')
pathname = pathname.replace(/\/+/g, '/')
recordReasonIfChanged('no multiple slashes')
pathname = pathname.replace(/^(\/.*)$/, '_$1')
recordReasonIfChanged('no leading /')
pathname = pathname.replace(/^(.+)\/$/, '$1')
recordReasonIfChanged('no trailing /')
pathname = pathname.replace(/^ *(.*)$/, '$1')
recordReasonIfChanged('no leading spaces')
pathname = pathname.replace(/^(.*[^ ]) *$/, '$1')
recordReasonIfChanged('no trailing spaces')
if (pathname.length === 0) pathname = '_'
recordReasonIfChanged('empty')
pathname = pathname.split('/').map(cleanPart).join('/')
recordReasonIfChanged('cleanPart')
pathname = pathname.replace(BLOCKED_FILE_RX, '@$1')
return pathname
recordReasonIfChanged('BLOCKED_FILE_RX')
return [pathname, reason]
}
/**
@@ -84,9 +124,19 @@ exports.clean = function (pathname) {
* @return {Boolean}
*/
exports.isClean = function pathnameIsClean(pathname) {
return (
exports.clean(pathname) === pathname &&
pathname.length <= MAX_PATH &&
pathname.length > 0
)
return exports.isCleanDebug(pathname)[0]
}
/**
* A pathname is clean (see clean) and not too long.
*
* @param {string} pathname
* @return {[boolean,string]}
*/
exports.isCleanDebug = function (pathname) {
if (pathname.length > MAX_PATH) return [false, 'MAX_PATH']
if (pathname.length === 0) return [false, 'empty']
const [cleanPathname, reason] = exports.cleanDebug(pathname)
if (cleanPathname !== pathname) return [false, reason]
return [true, '']
}
@@ -224,7 +224,7 @@ class Snapshot {
*
* @param {string} kind see {File#load}
* @param {ReadonlyBlobStore} blobStore
* @return {Promise<Object>} an object where keys are the pathnames and
* @return {Promise<Record<string, File>>} an object where keys are the pathnames and
* values are the files in the snapshot
*/
async loadFiles(kind, blobStore) {
@@ -132,6 +132,7 @@ export type RawScanOp = RawInsertOp | RawRemoveOp | RawRetainOp
export type RawTextOperation = {
textOperation: RawScanOp[]
contentHash?: string
}
export type RawAddCommentOperation = {
+1 -1
View File
@@ -20,7 +20,7 @@
"@types/check-types": "^7.3.7",
"@types/path-browserify": "^1.0.2",
"chai": "^3.3.0",
"mocha": "^10.2.0",
"mocha": "^11.1.0",
"sinon": "^9.2.4",
"typescript": "^5.0.4"
},
@@ -5,10 +5,11 @@ const ot = require('..')
const safePathname = ot.safePathname
describe('safePathname', function () {
function expectClean(input, output) {
function expectClean(input, output, reason = '') {
// check expected output and also idempotency
const cleanedInput = safePathname.clean(input)
const [cleanedInput, gotReason] = safePathname.cleanDebug(input)
expect(cleanedInput).to.equal(output)
expect(gotReason).to.equal(reason)
expect(safePathname.clean(cleanedInput)).to.equal(cleanedInput)
expect(safePathname.isClean(cleanedInput)).to.be.true
}
@@ -22,44 +23,56 @@ describe('safePathname', function () {
expect(safePathname.isClean('rm -rf /')).to.be.falsy
// replace invalid characters with underscores
expectClean('test-s*\u0001\u0002m\u0007st\u0008.jpg', 'test-s___m_st_.jpg')
expectClean(
'test-s*\u0001\u0002m\u0007st\u0008.jpg',
'test-s___m_st_.jpg',
'cleanPart'
)
// keep slashes, normalize paths, replace ..
expectClean('./foo', 'foo')
expectClean('../foo', '__/foo')
expectClean('foo/./bar', 'foo/bar')
expectClean('foo/../bar', 'bar')
expectClean('../../tricky/foo.bar', '__/__/tricky/foo.bar')
expectClean('foo/../../tricky/foo.bar', '__/tricky/foo.bar')
expectClean('foo/bar/../../tricky/foo.bar', 'tricky/foo.bar')
expectClean('foo/bar/baz/../../tricky/foo.bar', 'foo/tricky/foo.bar')
expectClean('./foo', 'foo', 'normalize')
expectClean('../foo', '__/foo', 'cleanPart')
expectClean('foo/./bar', 'foo/bar', 'normalize')
expectClean('foo/../bar', 'bar', 'normalize')
expectClean('../../tricky/foo.bar', '__/__/tricky/foo.bar', 'cleanPart')
expectClean(
'foo/../../tricky/foo.bar',
'__/tricky/foo.bar',
'normalize,cleanPart'
)
expectClean('foo/bar/../../tricky/foo.bar', 'tricky/foo.bar', 'normalize')
expectClean(
'foo/bar/baz/../../tricky/foo.bar',
'foo/tricky/foo.bar',
'normalize'
)
// remove illegal chars even when there is no extension
expectClean('**foo', '__foo')
expectClean('**foo', '__foo', 'cleanPart')
// remove windows file paths
expectClean('c:\\temp\\foo.txt', 'c:/temp/foo.txt')
expectClean('c:\\temp\\foo.txt', 'c:/temp/foo.txt', 'workaround for IE')
// do not allow a leading slash (relative paths only)
expectClean('/foo', '_/foo')
expectClean('//foo', '_/foo')
expectClean('/foo', '_/foo', 'no leading /')
expectClean('//foo', '_/foo', 'normalize,no leading /')
// do not allow multiple leading slashes
expectClean('//foo', '_/foo')
expectClean('//foo', '_/foo', 'normalize,no leading /')
// do not allow a trailing slash
expectClean('/', '_')
expectClean('foo/', 'foo')
expectClean('foo.tex/', 'foo.tex')
expectClean('/', '_', 'no leading /,no trailing /')
expectClean('foo/', 'foo', 'no trailing /')
expectClean('foo.tex/', 'foo.tex', 'no trailing /')
// do not allow multiple trailing slashes
expectClean('//', '_')
expectClean('///', '_')
expectClean('foo//', 'foo')
expectClean('//', '_', 'normalize,no leading /,no trailing /')
expectClean('///', '_', 'normalize,no leading /,no trailing /')
expectClean('foo//', 'foo', 'normalize,no trailing /')
// file and folder names that consist of . and .. are not OK
expectClean('.', '_')
expectClean('..', '__')
expectClean('.', '_', 'cleanPart')
expectClean('..', '__', 'cleanPart')
// we will allow name with more dots e.g. ... and ....
expectClean('...', '...')
expectClean('....', '....')
@@ -82,10 +95,10 @@ describe('safePathname', function () {
expectClean('a b.png', 'a b.png')
// leading and trailing spaces are not OK
expectClean(' foo', 'foo')
expectClean(' foo', 'foo')
expectClean('foo ', 'foo')
expectClean('foo ', 'foo')
expectClean(' foo', 'foo', 'no leading spaces')
expectClean(' foo', 'foo', 'no leading spaces')
expectClean('foo ', 'foo', 'no trailing spaces')
expectClean('foo ', 'foo', 'no trailing spaces')
// reserved file names on Windows should not be OK, but we already have
// some in the old system, so have to allow them for now
@@ -100,14 +113,14 @@ describe('safePathname', function () {
// there's no particular reason to allow multiple slashes; sometimes people
// seem to rename files to URLs (https://domain/path) in an attempt to
// upload a file, and this results in an empty directory name
expectClean('foo//bar.png', 'foo/bar.png')
expectClean('foo///bar.png', 'foo/bar.png')
expectClean('foo//bar.png', 'foo/bar.png', 'normalize')
expectClean('foo///bar.png', 'foo/bar.png', 'normalize')
// Check javascript property handling
expectClean('foo/prototype', 'foo/prototype') // OK as part of a pathname
expectClean('prototype/test.txt', 'prototype/test.txt')
expectClean('prototype', '@prototype') // not OK as whole pathname
expectClean('hasOwnProperty', '@hasOwnProperty')
expectClean('**proto**', '@__proto__')
expectClean('prototype', '@prototype', 'BLOCKED_FILE_RX') // not OK as whole pathname
expectClean('hasOwnProperty', '@hasOwnProperty', 'BLOCKED_FILE_RX')
expectClean('**proto**', '@__proto__', 'cleanPart,BLOCKED_FILE_RX')
})
})
+1 -1
View File
@@ -1 +1 @@
20.18.0
20.18.2
+1 -1
View File
@@ -5,6 +5,6 @@ promise-utils
--env-pass-through=
--esmock-loader=False
--is-library=True
--node-version=20.18.0
--node-version=20.18.2
--public-repo=False
--script-version=4.5.0
+17
View File
@@ -13,6 +13,7 @@ module.exports = {
expressify,
expressifyErrorHandler,
promiseMapWithLimit,
promiseMapSettledWithLimit,
}
/**
@@ -264,3 +265,19 @@ async function promiseMapWithLimit(concurrency, array, fn) {
const limit = pLimit(concurrency)
return await Promise.all(array.map(x => limit(() => fn(x))))
}
/**
* Map values in `array` with the async function `fn`
*
* Limit the number of unresolved promises to `concurrency`.
*
* @template T, U
* @param {number} concurrency
* @param {Array<T>} array
* @param {(T) => Promise<U>} fn
* @return {Promise<Array<PromiseSettledResult<U>>>}
*/
function promiseMapSettledWithLimit(concurrency, array, fn) {
const limit = pLimit(concurrency)
return Promise.allSettled(array.map(x => limit(() => fn(x))))
}
+1 -1
View File
@@ -18,7 +18,7 @@
"devDependencies": {
"chai": "^4.3.10",
"chai-as-promised": "^7.1.1",
"mocha": "^10.2.0",
"mocha": "^11.1.0",
"typescript": "^5.0.4"
},
"dependencies": {
+1 -1
View File
@@ -1 +1 @@
20.18.0
20.18.2
+1 -1
View File
@@ -5,6 +5,6 @@ ranges-tracker
--env-pass-through=
--esmock-loader=False
--is-library=True
--node-version=20.18.0
--node-version=20.18.2
--public-repo=False
--script-version=4.5.0
+26 -10
View File
@@ -145,11 +145,7 @@ class RangesTracker {
}
removeChangeId(changeId) {
const change = this.getChange(changeId)
if (change == null) {
return
}
this._removeChange(change)
this.removeChangeIds([changeId])
}
removeChangeIds(ids) {
@@ -316,7 +312,7 @@ class RangesTracker {
const movedChanges = []
const removeChanges = []
const newChanges = []
const trackedDeletesAtOpPosition = []
for (let i = 0; i < this.changes.length; i++) {
change = this.changes[i]
const changeStart = change.op.p
@@ -327,13 +323,15 @@ class RangesTracker {
change.op.p += opLength
movedChanges.push(change)
} else if (opStart === changeStart) {
// If we are undoing, then we want to cancel any existing delete ranges if we can.
// Check if the insert matches the start of the delete, and just remove it from the delete instead if so.
if (
!alreadyMerged &&
undoing &&
change.op.d.length >= op.i.length &&
change.op.d.slice(0, op.i.length) === op.i
) {
// If we are undoing, then we want to reject any existing tracked delete if we can.
// Check if the insert matches the start of the delete, and just
// remove it from the delete instead if so.
change.op.d = change.op.d.slice(op.i.length)
change.op.p += op.i.length
if (change.op.d === '') {
@@ -342,9 +340,25 @@ class RangesTracker {
movedChanges.push(change)
}
alreadyMerged = true
// Any tracked delete that came before this tracked delete
// rejection was moved after the incoming insert. Move them back
// so that they appear before the tracked delete rejection.
for (const trackedDelete of trackedDeletesAtOpPosition) {
trackedDelete.op.p -= opLength
}
} else {
// We're not rejecting that tracked delete. Move it after the
// insert.
change.op.p += opLength
movedChanges.push(change)
// Keep track of tracked deletes that are at the same position as the
// insert. If we find a tracked delete to reject, we'll want to
// reposition them.
if (!alreadyMerged) {
trackedDeletesAtOpPosition.push(change)
}
}
}
} else if (change.op.i != null) {
@@ -624,9 +638,11 @@ class RangesTracker {
}
_addOp(op, metadata) {
// Don't take a reference to the existing op since we'll modify this in place with future changes
op = this._clone(op)
const change = {
id: this.newId(),
op: this._clone(op), // Don't take a reference to the existing op since we'll modify this in place with future changes
op,
metadata: this._clone(metadata),
}
this.changes.push(change)
@@ -649,7 +665,7 @@ class RangesTracker {
}
_removeChange(change) {
this.changes = this.changes.filter(c => c.id !== change.id)
this.changes = this.changes.filter(c => c !== change)
this._markAsDirty(change, 'change', 'removed')
}
+1 -1
View File
@@ -20,7 +20,7 @@
},
"devDependencies": {
"chai": "^4.3.6",
"mocha": "^10.2.0",
"mocha": "^11.1.0",
"typescript": "^5.0.4"
}
}
@@ -4,6 +4,7 @@ const RangesTracker = require('../..')
describe('RangesTracker', function () {
describe('with duplicate change ids', function () {
beforeEach(function () {
this.comments = []
this.changes = [
{ id: 'id1', op: { p: 1, i: 'hello' } },
{ id: 'id2', op: { p: 10, i: 'world' } },
@@ -26,4 +27,199 @@ describe('RangesTracker', function () {
expect(this.rangesTracker.changes).to.deep.equal([this.changes[2]])
})
})
describe('with duplicate tracked insert ids', function () {
beforeEach(function () {
this.comments = []
this.changes = [
{ id: 'id1', op: { p: 10, i: 'one' } },
{ id: 'id1', op: { p: 20, i: 'two' } },
{ id: 'id1', op: { p: 30, d: 'three' } },
]
this.rangesTracker = new RangesTracker(this.changes, this.comments)
})
it("deleting one tracked insert doesn't delete the others", function () {
this.rangesTracker.applyOp({ p: 20, d: 'two' })
expect(this.rangesTracker.changes).to.deep.equal([
this.changes[0],
this.changes[2],
])
})
})
describe('with duplicate tracked delete ids', function () {
beforeEach(function () {
this.comments = []
this.changes = [
{ id: 'id1', op: { p: 10, d: 'one' } },
{ id: 'id1', op: { p: 20, d: 'two' } },
{ id: 'id1', op: { p: 30, d: 'three' } },
]
this.rangesTracker = new RangesTracker(this.changes, this.comments)
})
it('deleting over tracked deletes in tracked changes mode removes the tracked deletes covered', function () {
this.rangesTracker.track_changes = true
this.rangesTracker.applyOp({
p: 15,
d: '567890123456789012345',
})
expect(this.rangesTracker.changes.map(c => c.op)).to.deep.equal([
{ p: 10, d: 'one' },
{ p: 15, d: '56789two0123456789three012345' },
])
})
it('a tracked delete between two tracked deletes joins them into a single tracked delete', function () {
this.rangesTracker.track_changes = true
this.rangesTracker.applyOp({
p: 20,
d: '0123456789',
})
expect(this.rangesTracker.changes.map(c => c.op)).to.deep.equal([
{ p: 10, d: 'one' },
{ p: 20, d: 'two0123456789three' },
])
})
it("rejecting one tracked delete doesn't reject the others", function () {
this.rangesTracker.track_changes = true
this.rangesTracker.applyOp({
p: 20,
i: 'two',
u: true,
})
expect(this.rangesTracker.changes.map(c => c.op)).to.deep.equal([
{ p: 10, d: 'one' },
{ p: 33, d: 'three' },
])
})
it("rejecting all tracked deletes doesn't introduce tracked inserts", function () {
this.rangesTracker.track_changes = true
this.rangesTracker.applyOp({
p: 10,
i: 'one',
u: true,
})
this.rangesTracker.applyOp({
p: 23,
i: 'two',
u: true,
})
this.rangesTracker.applyOp({
p: 36,
i: 'three',
u: true,
})
expect(this.rangesTracker.changes.map(c => c.op)).to.deep.equal([])
})
})
describe('with multiple tracked deletes at the same position', function () {
beforeEach(function () {
this.comments = []
this.changes = [
{ id: 'id1', op: { p: 33, d: 'before' } },
{ id: 'id2', op: { p: 50, d: 'right before' } },
{ id: 'id3', op: { p: 50, d: 'this one' } },
{ id: 'id4', op: { p: 50, d: 'right after' } },
{ id: 'id5', op: { p: 75, d: 'long after' } },
]
this.rangesTracker = new RangesTracker(this.changes, this.comments)
})
it('preserves the text order when rejecting changes', function () {
this.rangesTracker.applyOp(
{ p: 50, i: 'this one', u: true },
{ user_id: 'user-id' }
)
expect(this.rangesTracker.changes).to.deep.equal([
{ id: 'id1', op: { p: 33, d: 'before' } },
{ id: 'id2', op: { p: 50, d: 'right before' } },
{ id: 'id4', op: { p: 58, d: 'right after' } },
{ id: 'id5', op: { p: 83, d: 'long after' } },
])
})
it('moves all tracked deletes after the insert if not rejecting changes', function () {
this.rangesTracker.applyOp(
{ p: 50, i: 'some other text', u: true, orderedRejections: true },
{ user_id: 'user-id' }
)
expect(this.rangesTracker.changes).to.deep.equal([
{ id: 'id1', op: { p: 33, d: 'before' } },
{ id: 'id2', op: { p: 65, d: 'right before' } },
{ id: 'id3', op: { p: 65, d: 'this one' } },
{ id: 'id4', op: { p: 65, d: 'right after' } },
{ id: 'id5', op: { p: 90, d: 'long after' } },
])
})
})
describe('with multiple tracked deletes at the same position with the same content', function () {
beforeEach(function () {
this.comments = []
this.changes = [
{ id: 'id1', op: { p: 10, d: 'cat' } },
{ id: 'id2', op: { p: 10, d: 'giraffe' } },
{ id: 'id3', op: { p: 10, d: 'cat' } },
{ id: 'id4', op: { p: 10, d: 'giraffe' } },
]
this.rangesTracker = new RangesTracker(this.changes, this.comments)
})
it('removes only the first matching tracked delete', function () {
this.rangesTracker.applyOp(
{ p: 10, i: 'giraffe', u: true },
{ user_id: 'user-id' }
)
expect(this.rangesTracker.changes).to.deep.equal([
{ id: 'id1', op: { p: 10, d: 'cat' } },
{ id: 'id3', op: { p: 17, d: 'cat' } },
{ id: 'id4', op: { p: 17, d: 'giraffe' } },
])
})
})
describe('with a tracked insert at the same position as a tracked delete', function () {
beforeEach(function () {
this.comments = []
this.changes = [
{
id: 'id1',
op: { p: 5, d: 'before' },
metadata: { user_id: 'user-id' },
},
{
id: 'id2',
op: { p: 10, d: 'delete' },
metadata: { user_id: 'user-id' },
},
{
id: 'id3',
op: { p: 10, i: 'insert' },
metadata: { user_id: 'user-id' },
},
]
this.rangesTracker = new RangesTracker(this.changes, this.comments)
})
it('places a tracked insert at the same position before both the delete and the insert', function () {
this.rangesTracker.track_changes = true
this.rangesTracker.applyOp(
{ p: 10, i: 'incoming' },
{ user_id: 'user-id' }
)
expect(this.rangesTracker.changes.map(change => change.op)).to.deep.equal(
[
{ p: 5, d: 'before' },
{ p: 10, i: 'incoming' },
{ p: 18, d: 'delete' },
{ p: 18, i: 'insert' },
]
)
})
})
})
+1 -1
View File
@@ -1 +1 @@
20.18.0
20.18.2
+1 -1
View File
@@ -5,6 +5,6 @@ redis-wrapper
--env-pass-through=
--esmock-loader=False
--is-library=True
--node-version=20.18.0
--node-version=20.18.2
--public-repo=False
--script-version=4.5.0
+1 -1
View File
@@ -35,7 +35,7 @@
"@overleaf/logger": "*",
"@overleaf/o-error": "*",
"chai": "^4.3.6",
"mocha": "^10.2.0",
"mocha": "^11.1.0",
"sandboxed-module": "^2.0.4",
"sinon": "^9.2.4",
"typescript": "^5.0.4"
+1 -1
View File
@@ -1 +1 @@
20.18.0
20.18.2
+1 -1
View File
@@ -5,6 +5,6 @@ settings
--env-pass-through=
--esmock-loader=False
--is-library=True
--node-version=20.18.0
--node-version=20.18.2
--public-repo=False
--script-version=4.5.0
+1 -1
View File
@@ -15,7 +15,7 @@
"types:check": "tsc --noEmit"
},
"devDependencies": {
"mocha": "^10.2.0",
"mocha": "^11.1.0",
"typescript": "^5.0.4"
}
}
+1 -1
View File
@@ -1 +1 @@
20.18.0
20.18.2
+1 -1
View File
@@ -5,6 +5,6 @@ stream-utils
--env-pass-through=
--esmock-loader=False
--is-library=True
--node-version=20.18.0
--node-version=20.18.2
--public-repo=False
--script-version=4.5.0
+1 -1
View File
@@ -18,7 +18,7 @@
"devDependencies": {
"chai": "^4.3.6",
"chai-as-promised": "^7.1.1",
"mocha": "^10.2.0",
"mocha": "^11.1.0",
"typescript": "^5.0.4"
}
}
+2846 -35545
View File
File diff suppressed because it is too large Load Diff
+5 -1
View File
@@ -26,6 +26,9 @@
"typescript": "^5.5.4"
},
"overrides": {
"cross-env": {
"cross-spawn": "^7.0.6"
},
"fetch-mock": {
"path-to-regexp": "3.3.0"
},
@@ -70,6 +73,7 @@
"services/third-party-datastore",
"services/third-party-references",
"services/tpdsworker",
"services/web"
"services/web",
"tools/saas-e2e"
]
}
+23
View File
@@ -0,0 +1,23 @@
diff --git a/node_modules/@node-saml/node-saml/lib/saml.js b/node_modules/@node-saml/node-saml/lib/saml.js
index fba15b9..a5778cb 100644
--- a/node_modules/@node-saml/node-saml/lib/saml.js
+++ b/node_modules/@node-saml/node-saml/lib/saml.js
@@ -336,7 +336,8 @@ class SAML {
const requestOrResponse = request || response;
(0, utility_1.assertRequired)(requestOrResponse, "either request or response is required");
let buffer;
- if (this.options.skipRequestCompression) {
+ // logout requestOrResponse must be compressed anyway
+ if (this.options.skipRequestCompression && operation !== "logout") {
buffer = Buffer.from(requestOrResponse, "utf8");
}
else {
@@ -495,7 +496,7 @@ class SAML {
try {
xml = Buffer.from(container.SAMLResponse, "base64").toString("utf8");
doc = await (0, xml_1.parseDomFromString)(xml);
- const inResponseToNodes = xml_1.xpath.selectAttributes(doc, "/*[local-name()='Response']/@InResponseTo");
+ const inResponseToNodes = xml_1.xpath.selectAttributes(doc, "/*[local-name()='Response' or local-name()='LogoutResponse']/@InResponseTo");
if (inResponseToNodes) {
inResponseTo = inResponseToNodes.length ? inResponseToNodes[0].nodeValue : null;
await this.validateInResponseTo(inResponseTo);
+64
View File
@@ -0,0 +1,64 @@
diff --git a/node_modules/ldapauth-fork/lib/ldapauth.js b/node_modules/ldapauth-fork/lib/ldapauth.js
index 85ecf36a8b..a7d07e0f78 100644
--- a/node_modules/ldapauth-fork/lib/ldapauth.js
+++ b/node_modules/ldapauth-fork/lib/ldapauth.js
@@ -69,6 +69,7 @@ function LdapAuth(opts) {
this.opts.bindProperty || (this.opts.bindProperty = 'dn');
this.opts.groupSearchScope || (this.opts.groupSearchScope = 'sub');
this.opts.groupDnProperty || (this.opts.groupDnProperty = 'dn');
+ this.opts.tlsStarted = false;
EventEmitter.call(this);
@@ -108,21 +109,7 @@ function LdapAuth(opts) {
this._userClient.on('error', this._handleError.bind(this));
var self = this;
- if (this.opts.starttls) {
- // When starttls is enabled, this callback supplants the 'connect' callback
- this._adminClient.starttls(this.opts.tlsOptions, this._adminClient.controls, function(err) {
- if (err) {
- self._handleError(err);
- } else {
- self._onConnectAdmin();
- }
- });
- this._userClient.starttls(this.opts.tlsOptions, this._userClient.controls, function(err) {
- if (err) {
- self._handleError(err);
- }
- });
- } else if (opts.reconnect) {
+ if (opts.reconnect && !this.opts.starttls) {
this.once('_installReconnectListener', function() {
self.log && self.log.trace('install reconnect listener');
self._adminClient.on('connect', function() {
@@ -384,6 +371,28 @@ LdapAuth.prototype._findGroups = function(user, callback) {
*/
LdapAuth.prototype.authenticate = function(username, password, callback) {
var self = this;
+ if (this.opts.starttls && !this.opts.tlsStarted) {
+ // When starttls is enabled, this callback supplants the 'connect' callback
+ this._adminClient.starttls(this.opts.tlsOptions, this._adminClient.controls, function (err) {
+ if (err) {
+ self._handleError(err);
+ } else {
+ self._onConnectAdmin(function(){self._handleAuthenticate(username, password, callback);});
+ }
+ });
+ this._userClient.starttls(this.opts.tlsOptions, this._userClient.controls, function (err) {
+ if (err) {
+ self._handleError(err);
+ }
+ });
+ } else {
+ self._handleAuthenticate(username, password, callback);
+ }
+};
+
+LdapAuth.prototype._handleAuthenticate = function (username, password, callback) {
+ this.opts.tlsStarted = true;
+ var self = this;
if (typeof password === 'undefined' || password === null || password === '') {
return callback(new Error('no password given'));
+1
View File
@@ -1,6 +1,7 @@
.DS_Store
.git/
services/git-bridge
server-ce/server-ce
server-ce/test
# omit scripts with extra dependencies
+1 -1
View File
@@ -10,7 +10,7 @@ ENV TEXMFVAR=/var/lib/overleaf/tmp/texmf-var
# Update to ensure dependencies are updated
# ------------------------------------------
ENV REBUILT_AFTER="2024-15-10"
ENV REBUILT_AFTER="2025-03-27"
# Install dependencies
# --------------------
+22 -1
View File
@@ -1,6 +1,7 @@
# Makefile
MONOREPO_ROOT := ../
HERE=$(shell pwd)
export MONOREPO_REVISION := $(shell git rev-parse HEAD)
export BRANCH_NAME ?= $(shell git rev-parse --abbrev-ref HEAD)
export OVERLEAF_BASE_BRANCH ?= sharelatex/sharelatex-base:$(BRANCH_NAME)
@@ -40,5 +41,25 @@ build-community:
--tag $(OVERLEAF_BRANCH) \
$(MONOREPO_ROOT)
SHELLCHECK_OPTS = \
--shell=bash \
--external-sources \
--exclude=SC1091
SHELLCHECK_COLOR := $(if $(CI),--color=never,--color)
SHELLCHECK_FILES := { git ls-files "*.sh" -z; git grep -Plz "\A\#\!.*bash"; } | sort -zu
.PHONY: all build-base build-community
shellcheck:
@$(SHELLCHECK_FILES) | xargs -0 -r docker run --rm -v $(HERE):/mnt -w /mnt \
koalaman/shellcheck:stable $(SHELLCHECK_OPTS) $(SHELLCHECK_COLOR)
shellcheck_fix:
@$(SHELLCHECK_FILES) | while IFS= read -r -d '' file; do \
diff=$$(docker run --rm -v $(HERE):/mnt -w /mnt koalaman/shellcheck:stable $(SHELLCHECK_OPTS) --format=diff "$$file" 2>/dev/null); \
if [ -n "$$diff" ] && ! echo "$$diff" | patch -p1 >/dev/null 2>&1; then echo "\033[31m$$file\033[0m"; \
elif [ -n "$$diff" ]; then echo "$$file"; \
else echo "\033[2m$$file\033[0m"; fi \
done
.PHONY: all \
build-base build-community \
shellcheck shellcheck_fix
+1
View File
@@ -0,0 +1 @@
../../bin/shared/
@@ -1,5 +1,6 @@
{
"databaseUrl": "HISTORY_CONNECTION_STRING",
"databaseUrlReadOnly": "HISTORY_FOLLOWER_CONNECTION_STRING",
"herokuDatabaseUrl": "DATABASE_URL",
"databasePoolMin": "DATABASE_POOL_MIN",
"databasePoolMax": "DATABASE_POOL_MAX",
+1
View File
@@ -9,5 +9,6 @@ export HISTORY_V1_HOST=127.0.0.1
export NOTIFICATIONS_HOST=127.0.0.1
export PROJECT_HISTORY_HOST=127.0.0.1
export REALTIME_HOST=127.0.0.1
export REFERENCES_HOST=127.0.0.1
export WEB_HOST=127.0.0.1
export WEB_API_HOST=127.0.0.1
+33
View File
@@ -335,6 +335,10 @@ if (process.env.OVERLEAF_LOGIN_SUPPORT_TEXT != null) {
settings.nav.login_support_text = process.env.OVERLEAF_LOGIN_SUPPORT_TEXT
}
if (process.env.OVERLEAF_LOGIN_SUPPORT_TITLE != null) {
settings.nav.login_support_title = process.env.OVERLEAF_LOGIN_SUPPORT_TITLE
}
// Sending Email
// -------------
//
@@ -458,6 +462,35 @@ switch (process.env.OVERLEAF_FILESTORE_BACKEND) {
}
}
// Overleaf Extended CE Compiler options to enable sandboxed compiles.
// -----------
if (process.env.SANDBOXED_COMPILES === 'true') {
settings.clsi = {
...settings.clsi,
dockerRunner: true,
docker: {
image: process.env.TEX_LIVE_DOCKER_IMAGE,
user: process.env.TEX_LIVE_DOCKER_USER || 'www-data',
}
}
if (settings.path == null) {
settings.path = {}
}
settings.path.synctexBaseDir = () => '/compile'
if (process.env.SANDBOXED_COMPILES_SIBLING_CONTAINERS === 'true') {
console.log('Using sibling containers for sandboxed compiles')
if (process.env.SANDBOXED_COMPILES_HOST_DIR) {
settings.path.sandboxedCompilesHostDir =
process.env.SANDBOXED_COMPILES_HOST_DIR
} else {
console.error(
'Sibling containers, but SANDBOXED_COMPILES_HOST_DIR not set'
)
}
}
}
// With lots of incoming and outgoing HTTP connections to different services,
// sometimes long running, it is a good idea to increase the default number
// of sockets that Node will hold open.
+7 -2
View File
@@ -12,6 +12,10 @@ switch (process.argv.pop()) {
console.log('pushd', `services/${service.name}`)
switch (service.name) {
case 'web':
// precompile pug in background
console.log('npm run precompile-pug &')
console.log('pug_precompile=$!')
// Avoid downloading of cypress
console.log('export CYPRESS_INSTALL_BINARY=0')
@@ -21,8 +25,9 @@ switch (process.argv.pop()) {
console.log('npm run webpack:production')
// uninstall webpack and frontend dependencies
console.log('npm install --omit=dev')
// precompile pug
console.log('npm run precompile-pug')
// Wait for pug precompile to finish
console.log('wait "$pug_precompile"')
break
default:
console.log(`echo ${service.name} does not require a compilation`)
+1
View File
@@ -0,0 +1 @@
FROM sharelatex/sharelatex:4.2.8
+14
View File
@@ -0,0 +1,14 @@
FROM sharelatex/sharelatex:5.3.0
# Update copyright year
COPY pr_22950.patch .
RUN patch -p0 < pr_22950.patch && rm pr_22950.patch
# Update Mongoose
RUN npm install mongoose@^8.9.5 --save -w services/web \
&& npm install mongodb@6.12.0 --save \
-w services/chat -w services/contacts -w services/docstore \
-w services/history-v1 -w libraries/mongo-utils \
&& npm install mongodb@6.12.0 --save \
&& rm -rf /root/.cache /root/.npm $(find /tmp/ -mindepth 1 -maxdepth 1)
+33
View File
@@ -0,0 +1,33 @@
--- services/web/app/views/layout/thin-footer-bootstrap-5.pug
+++ services/web/app/views/layout/thin-footer-bootstrap-5.pug
@@ -7,7 +7,7 @@ footer.site-footer
if !settings.nav.hide_powered_by
li
//- year of Server Pro release, static
- | © 2024
+ | © 2025
|
a(href='https://www.overleaf.com/for/enterprises') Powered by Overleaf
--- services/web/app/views/layout/thin-footer.pug
+++ services/web/app/views/layout/thin-footer.pug
@@ -9,7 +9,7 @@ footer.site-footer
else if !settings.nav.hide_powered_by
li
//- year of Server Pro release, static
- | © 2024
+ | © 2025
|
a(href='https://www.overleaf.com/for/enterprises') Powered by Overleaf
--- services/web/frontend/js/features/ui/components/bootstrap-5/footer/thin-footer.tsx
+++ services/web/frontend/js/features/ui/components/bootstrap-5/footer/thin-footer.tsx
@@ -60,7 +60,7 @@ function ThinFooter({
{showPoweredBy ? (
<>
<li>
- {/* year of Server Pro release, static */}© 2024{' '}
+ {/* year of Server Pro release, static */}© 2025{' '}
<a href="https://www.overleaf.com/for/enterprises">
Powered by Overleaf
</a>
+1
View File
@@ -0,0 +1 @@
FROM sharelatex/sharelatex:5.3.1
+1
View File
@@ -0,0 +1 @@
FROM sharelatex/sharelatex:5.3.2
@@ -2,4 +2,4 @@
set -e -o pipefail
# See the bottom of http://stackoverflow.com/questions/24319662/from-inside-of-a-docker-container-how-do-i-connect-to-the-localhost-of-the-mach
echo "`route -n | awk '/UG[ \t]/{print $2}'` dockerhost" >> /etc/hosts
echo "$(route -n | awk '/UG[ \t]/{print $2}') dockerhost" >> /etc/hosts
@@ -26,6 +26,7 @@ if [ -f "${nginx_template_file}" ]; then
# Note the single-quotes, they are important.
# This is a pass-list of env-vars that envsubst
# should operate on.
# shellcheck disable=SC2016
envsubst '
${NGINX_KEEPALIVE_TIMEOUT}
${NGINX_WORKER_CONNECTIONS}
-1
View File
@@ -1 +0,0 @@
rs.initiate({ _id: "overleaf", members: [ { _id: 0, host: "mongo:27017" } ] })
+2 -2
View File
@@ -30,7 +30,7 @@ server {
application/pdf pdf;
}
# handle output files for specific users
location ~ ^/project/([0-9a-f]+)/user/([0-9a-f]+)/build/([0-9a-f-]+)/output/output\.([a-z]+)$ {
location ~ ^/project/([0-9a-f]+)/user/([0-9a-f]+)/build/([0-9a-f-]+)/output/output\.([a-z.]+)$ {
alias /var/lib/overleaf/data/output/$1-$2/generated-files/$3/output.$4;
}
# handle .blg files for specific users
@@ -38,7 +38,7 @@ server {
alias /var/lib/overleaf/data/output/$1-$2/generated-files/$3/$4.blg;
}
# handle output files for anonymous users
location ~ ^/project/([0-9a-f]+)/build/([0-9a-f-]+)/output/output\.([a-z]+)$ {
location ~ ^/project/([0-9a-f]+)/build/([0-9a-f-]+)/output/output\.([a-z.]+)$ {
alias /var/lib/overleaf/data/output/$1/generated-files/$2/output.$3;
}
# handle .blg files for anonymous users
+2 -2
View File
@@ -47,12 +47,12 @@ server {
}
# handle output files for specific users
location ~ ^/project/([0-9a-f]+)/user/([0-9a-f]+)/build/([0-9a-f-]+)/output/output\.([a-z]+)$ {
location ~ ^/project/([0-9a-f]+)/user/([0-9a-f]+)/build/([0-9a-f-]+)/output/output\.([a-z.]+)$ {
proxy_pass http://127.0.0.1:8080; # clsi-nginx.conf
proxy_http_version 1.1;
}
# handle output files for anonymous users
location ~ ^/project/([0-9a-f]+)/build/([0-9a-f-]+)/output/output\.([a-z]+)$ {
location ~ ^/project/([0-9a-f]+)/build/([0-9a-f-]+)/output/output\.([a-z.]+)$ {
proxy_pass http://127.0.0.1:8080; # clsi-nginx.conf
proxy_http_version 1.1;
}
+1 -1
View File
@@ -11,7 +11,7 @@ fi
if [ -e '/var/run/docker.sock' ]; then
echo ">> Setting permissions on docker socket"
DOCKER_GROUP=$(stat -c '%g' /var/run/docker.sock)
groupadd --non-unique --gid ${DOCKER_GROUP} dockeronhost
groupadd --non-unique --gid "${DOCKER_GROUP}" dockeronhost
usermod -aG dockeronhost www-data
fi
+12
View File
@@ -0,0 +1,12 @@
#!/bin/bash
NODE_PARAMS=""
if [ "$DEBUG_NODE" == "true" ]; then
echo "running debug - references"
NODE_PARAMS="--inspect=0.0.0.0:30560"
fi
source /etc/overleaf/env.sh
export LISTEN_ADDRESS=127.0.0.1
exec /sbin/setuser www-data /usr/bin/node $NODE_PARAMS /overleaf/services/references/app.js >> /var/log/overleaf/references.log 2>&1
+3
View File
@@ -29,6 +29,9 @@ module.exports = [
{
name: 'project-history',
},
{
name: 'references',
},
{
name: 'history-v1',
},
+1 -1
View File
@@ -1,4 +1,4 @@
FROM node:20.18.0
FROM node:20.18.2
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - \
&& echo \
"deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" \
+1 -1
View File
@@ -44,7 +44,7 @@ prefetch_custom_compose_pull:
prefetch_custom: prefetch_custom_texlive
prefetch_custom_texlive:
echo -n "$$ALL_TEX_LIVE_DOCKER_IMAGES" | xargs -d, -I% \
echo "$$ALL_TEX_LIVE_DOCKER_IMAGES" | tr ',' '\n' | xargs -I% \
sh -exc 'tag=%; re_tag=quay.io/sharelatex/$${tag#*/*/}; docker pull $$tag; docker tag $$tag $$re_tag'
prefetch_custom: prefetch_old
+6 -4
View File
@@ -127,10 +127,12 @@ describe('admin panel', function () {
testProjectName = `project-${uuid()}`
deletedProjectName = `deleted-project-${uuid()}`
login(user1)
cy.visit('/project')
createProject(testProjectName).then(id => (testProjectId = id))
cy.visit('/project')
createProject(deletedProjectName).then(id => (projectToDeleteId = id))
createProject(testProjectName, { open: false }).then(
id => (testProjectId = id)
)
createProject(deletedProjectName, { open: false }).then(
id => (projectToDeleteId = id)
)
})
describe('manage site', () => {
@@ -1,5 +1,8 @@
import { ensureUserExists, login } from './helpers/login'
import { createProject } from './helpers/project'
import {
createProject,
openProjectViaInviteNotification,
} from './helpers/project'
import { isExcludedBySharding, startWith } from './helpers/config'
import { throttledRecompile } from './helpers/compile'
@@ -11,10 +14,7 @@ describe('Project creation and compilation', function () {
it('users can create project and compile it', function () {
login('user@example.com')
cy.visit('/project')
// this is the first project created, the welcome screen is displayed instead of the project list
createProject('test-project')
cy.url().should('match', /\/project\/[a-fA-F0-9]{24}/)
const recompile = throttledRecompile()
cy.findByText('\\maketitle').parent().click()
cy.findByText('\\maketitle').parent().type('\n\\section{{}Test Section}')
@@ -26,8 +26,8 @@ describe('Project creation and compilation', function () {
const fileName = `test-${Date.now()}.md`
const markdownContent = '# Markdown title'
login('user@example.com')
cy.visit('/project')
createProject('test-project')
// FIXME: Add aria-label maybe? or at least data-test-id
cy.findByText('New file').click({ force: true })
cy.findByRole('dialog').within(() => {
@@ -50,12 +50,10 @@ describe('Project creation and compilation', function () {
const targetProjectName = `${sourceProjectName}-target`
login('user@example.com')
cy.visit('/project')
createProject(sourceProjectName, { type: 'Example Project' }).as(
'sourceProjectId'
)
cy.visit('/project')
createProject(sourceProjectName, {
type: 'Example Project',
open: false,
}).as('sourceProjectId')
createProject(targetProjectName)
// link the image from `projectName` into this project
@@ -80,13 +78,10 @@ describe('Project creation and compilation', function () {
const sourceProjectName = `test-project-${Date.now()}`
const targetProjectName = `${sourceProjectName}-target`
login('user@example.com')
cy.visit('/project')
createProject(sourceProjectName, { type: 'Example Project' }).as(
'sourceProjectId'
)
cy.visit('/project')
createProject(sourceProjectName, {
type: 'Example Project',
open: false,
}).as('sourceProjectId')
createProject(targetProjectName).as('targetProjectId')
// link the image from `projectName` into this project
@@ -100,8 +95,11 @@ describe('Project creation and compilation', function () {
cy.findByText('Share').click()
cy.findByRole('dialog').within(() => {
cy.get('input').type('collaborator@example.com,')
cy.findByText('Share').click({ force: true })
cy.findByTestId('collaborator-email-input').type(
'collaborator@example.com,'
)
cy.findByText('Invite').click({ force: true })
cy.findByText('Invite not yet accepted.')
})
cy.visit('/project')
@@ -109,15 +107,7 @@ describe('Project creation and compilation', function () {
cy.findByText('Log Out').click()
login('collaborator@example.com')
cy.visit('/project')
cy.findByText(targetProjectName)
.parent()
.parent()
.within(() => {
cy.findByText('Join Project').click()
})
cy.findByText('Open Project').click()
cy.url().should('match', /\/project\/[a-fA-F0-9]{24}/)
openProjectViaInviteNotification(targetProjectName)
cy.get('@targetProjectId').then(targetProjectId => {
cy.url().should('include', targetProjectId)
})
+3 -3
View File
@@ -35,10 +35,10 @@ services:
MAILTRAP_PASSWORD: 'password-for-mailtrap'
mongo:
image: mongo:5.0.17
image: mongo:6.0
command: '--replSet overleaf'
volumes:
- ../mongodb-init-replica-set.js:/docker-entrypoint-initdb.d/mongodb-init-replica-set.js
- ../bin/shared/mongodb-init-replica-set.js:/docker-entrypoint-initdb.d/mongodb-init-replica-set.js
environment:
MONGO_INITDB_DATABASE: sharelatex
extra_hosts:
@@ -46,7 +46,7 @@ services:
# This override is not needed when running the setup after starting up mongo.
- mongo:127.0.0.1
healthcheck:
test: echo 'db.stats().ok' | mongo localhost:27017/test --quiet
test: echo 'db.stats().ok' | mongosh localhost:27017/test --quiet
interval: 3s
timeout: 3s
retries: 30
+163 -141
View File
@@ -1,7 +1,17 @@
import { createProject } from './helpers/project'
import {
createNewFile,
createProject,
enableLinkSharing,
openFile,
openProjectById,
openProjectViaLinkSharingAsUser,
toggleTrackChanges,
} from './helpers/project'
import { isExcludedBySharding, startWith } from './helpers/config'
import { ensureUserExists, login } from './helpers/login'
import { v4 as uuid } from 'uuid'
import { beforeWithReRunOnTestRetry } from './helpers/beforeWithReRunOnTestRetry'
import { prepareWaitForNextCompileSlot } from './helpers/compile'
describe('editor', () => {
if (isExcludedBySharding('PRO_DEFAULT_1')) return
@@ -9,187 +19,210 @@ describe('editor', () => {
ensureUserExists({ email: 'user@example.com' })
ensureUserExists({ email: 'collaborator@example.com' })
it('word dictionary and spelling', () => {
const fileName = 'test.tex'
const word = createRandomLetterString()
let projectName: string
let projectId: string
let recompile: () => void
let waitForCompileRateLimitCoolOff: (fn: () => void) => void
beforeWithReRunOnTestRetry(function () {
projectName = `project-${uuid()}`
login('user@example.com')
cy.visit('/project')
createProject('test-project')
createProject(projectName, { type: 'Example Project', open: false }).then(
id => (projectId = id)
)
;({ recompile, waitForCompileRateLimitCoolOff } =
prepareWaitForNextCompileSlot())
})
cy.log('create new project file')
cy.get('button').contains('New file').click({ force: true })
cy.findByRole('dialog').within(() => {
cy.get('input').clear()
cy.get('input').type(fileName)
cy.findByText('Create').click()
beforeEach(() => {
login('user@example.com')
waitForCompileRateLimitCoolOff(() => {
openProjectById(projectId)
})
cy.findByText(fileName).click()
})
cy.log('edit project file')
// wait until we've switched to the newly created empty file
cy.get('.cm-line').should('have.length', 1)
cy.get('.cm-line').type(word)
describe('spelling', function () {
function changeSpellCheckLanguageTo(lng: string) {
cy.log(`change project language to '${lng}'`)
cy.get('button').contains('Menu').click()
cy.get('select[id=settings-menu-spellCheckLanguage]').select(lng)
cy.get('[id="left-menu"]').type('{esc}') // close left menu
}
cy.get('.ol-cm-spelling-error').should('exist')
cy.log('change project language')
cy.get('button').contains('Menu').click()
cy.get('select[id=settings-menu-spellCheckLanguage]').select('Spanish')
cy.get('[id="left-menu"]').type('{esc}') // close left menu
cy.log('add word to dictionary')
cy.get('.ol-cm-spelling-error').contains(word).rightclick()
cy.findByText('Add to Dictionary').click()
cy.get('.ol-cm-spelling-error').should('not.exist')
cy.log('remove word from dictionary')
cy.get('button').contains('Menu').click()
cy.get('button').contains('Edit').click()
cy.get('[id="dictionary-modal"').within(() => {
cy.findByText(word)
.parent()
.within(() => cy.get('button').click())
// the modal has 2 close buttons, this ensures the one with the visible label is
// clicked, otherwise it would need `force: true`
cy.get('.btn').contains('Close').click()
afterEach(function () {
changeSpellCheckLanguageTo('Off')
})
cy.log('close left panel')
cy.get('[id="left-menu"]').type('{esc}')
it('word dictionary and spelling', () => {
changeSpellCheckLanguageTo('English (American)')
createNewFile()
const word = createRandomLetterString()
cy.log('rewrite word to force spelling error')
cy.get('.cm-line').type('{selectAll}{del}' + word + '{enter}')
cy.log('edit project file')
cy.get('.cm-line').type(word)
cy.get('.ol-cm-spelling-error').should('contain.text', word)
cy.get('.ol-cm-spelling-error').should('exist')
changeSpellCheckLanguageTo('Spanish')
cy.log('add word to dictionary')
cy.get('.ol-cm-spelling-error').contains(word).rightclick()
cy.findByText('Add to Dictionary').click()
cy.get('.ol-cm-spelling-error').should('not.exist')
cy.log('remove word from dictionary')
cy.get('button').contains('Menu').click()
cy.get('button').contains('Edit').click()
cy.get('[id="dictionary-modal"]').within(() => {
cy.findByText(word)
.parent()
.within(() => cy.get('button').click())
// the modal has 2 close buttons, this ensures the one with the visible label is
// clicked, otherwise it would need `force: true`
cy.get('.btn').contains('Close').click()
})
cy.log('close left panel')
cy.get('[id="left-menu"]').type('{esc}')
cy.log('rewrite word to force spelling error')
cy.get('.cm-line').type('{selectAll}{del}' + word + '{enter}')
cy.get('.ol-cm-spelling-error').should('contain.text', word)
})
})
describe('collaboration', () => {
let projectId: string
beforeWithReRunOnTestRetry(function () {
enableLinkSharing().then(({ linkSharingReadAndWrite }) => {
const email = 'collaborator@example.com'
login(email)
openProjectViaLinkSharingAsUser(
linkSharingReadAndWrite,
projectName,
email
)
})
beforeEach(() => {
login('user@example.com')
cy.visit(`/project`)
createProject('test-editor', { type: 'Example Project' }).then(
(id: string) => {
projectId = id
cy.log('make project shareable')
cy.findByText('Share').click()
cy.findByText('Turn on link sharing').click()
cy.log('accept project invitation')
cy.findByText('Anyone with this link can edit this project')
.next()
.should('contain.text', 'http://') // wait for the link to appear
.then(el => {
const linkSharingReadAndWrite = el.text()
login('collaborator@example.com')
cy.visit(linkSharingReadAndWrite)
cy.get('button').contains('Join Project').click()
cy.log(
'navigate to project dashboard to avoid cross session requests from editor'
)
cy.visit('/project')
})
login('user@example.com')
cy.visit(`/project/${projectId}`)
}
)
waitForCompileRateLimitCoolOff(() => {
openProjectById(projectId)
})
})
it('track-changes', () => {
cy.log('enable track-changes for everyone')
cy.findByText('Review').click()
cy.get('.review-panel-toolbar-collapse-button').click() // make track-changes switches visible
cy.log('disable track-changes before populating doc')
toggleTrackChanges(false)
cy.intercept('POST', '**/track_changes').as('enableTrackChanges')
cy.findByText('Everyone')
.parent()
.within(() => cy.get('.input-switch').click())
cy.wait('@enableTrackChanges')
const fileName = createNewFile()
const oldContent = 'oldContent'
cy.get('.cm-line').type(`${oldContent}\n\nstatic`)
cy.log('recompile to force flush')
recompile()
cy.log('enable track-changes for everyone')
toggleTrackChanges(true)
login('collaborator@example.com')
cy.visit(`/project/${projectId}`)
waitForCompileRateLimitCoolOff(() => {
openProjectById(projectId)
})
openFile(fileName, 'static')
cy.log('make changes in main file')
// cy.type() "clicks" in the center of the selected element before typing. This "click" discards the text as selected by the dblclick.
// Go down to the lower level event based typing, the frontend tests in web use similar events.
cy.get('.cm-editor').as('editor')
cy.get('@editor').findByText('\\maketitle').dblclick()
cy.get('@editor').findByText(oldContent).dblclick()
cy.get('@editor').trigger('keydown', { key: 'Delete' })
cy.get('@editor').trigger('keydown', { key: 'Enter' })
cy.get('@editor').trigger('keydown', { key: 'Enter' })
cy.log('recompile to force flush')
cy.findByText('Recompile').click()
recompile()
login('user@example.com')
cy.visit(`/project/${projectId}`)
waitForCompileRateLimitCoolOff(() => {
openProjectById(projectId)
})
openFile(fileName, 'static')
cy.log('reject changes')
cy.findByText('Review').click()
cy.get('.cm-content').should('not.contain.text', '\\maketitle')
cy.findByText('Reject').click({ force: true })
cy.contains('.toolbar-item', 'Review').click()
cy.get('.cm-content').should('not.contain.text', oldContent)
cy.findByText('Reject change').click({ force: true })
cy.contains('.toolbar-item', 'Review').click()
cy.log('recompile to force flush')
recompile()
cy.log('verify the changes are applied')
cy.get('.cm-content').should('contain.text', '\\maketitle')
cy.get('.cm-content').should('contain.text', oldContent)
cy.log('disable track-changes for everyone again')
toggleTrackChanges(false)
})
it('track-changes rich text', () => {
cy.log('enable track-changes for everyone')
cy.findByText('Visual Editor').click()
cy.findByText('Review').click()
cy.get('.review-panel-toolbar-collapse-button').click() // make track-changes switches visible
cy.log('disable track-changes before populating doc')
toggleTrackChanges(false)
cy.intercept('POST', '**/track_changes').as('enableTrackChanges')
cy.findByText('Everyone')
.parent()
.within(() => cy.get('.input-switch').click())
cy.wait('@enableTrackChanges')
const fileName = createNewFile()
const oldContent = 'oldContent'
cy.get('.cm-line').type(`\\section{{}${oldContent}}\n\nstatic`)
cy.log('recompile to force flush')
recompile()
cy.log('enable track-changes for everyone')
toggleTrackChanges(true)
login('collaborator@example.com')
cy.visit(`/project/${projectId}`)
waitForCompileRateLimitCoolOff(() => {
openProjectById(projectId)
})
cy.log('enable visual editor and make changes in main file')
cy.findByText('Visual Editor').click()
openFile(fileName, 'static')
// cy.type() "clicks" in the center of the selected element before typing. This "click" discards the text as selected by the dblclick.
// Go down to the lower level event based typing, the frontend tests in web use similar events.
cy.get('.cm-editor').as('editor')
cy.get('@editor').contains('Introduction').dblclick()
cy.get('@editor').findByText(oldContent).dblclick()
cy.get('@editor').trigger('keydown', { key: 'Delete' })
cy.get('@editor').trigger('keydown', { key: 'Enter' })
cy.get('@editor').trigger('keydown', { key: 'Enter' })
cy.log('recompile to force flush')
cy.findByText('Recompile').click()
recompile()
login('user@example.com')
cy.visit(`/project/${projectId}`)
waitForCompileRateLimitCoolOff(() => {
openProjectById(projectId)
})
openFile(fileName, 'static')
cy.log('reject changes')
cy.findByText('Review').click()
cy.get('.cm-content').should('not.contain.text', 'Introduction')
cy.findAllByText('Reject').first().click({ force: true })
cy.contains('.toolbar-item', 'Review').click()
cy.get('.cm-content').should('not.contain.text', oldContent)
cy.findAllByText('Reject change').first().click({ force: true })
cy.contains('.toolbar-item', 'Review').click()
cy.log('recompile to force flush')
recompile()
cy.log('verify the changes are applied in the visual editor')
cy.findByText('Visual Editor').click()
cy.get('.cm-content').should('contain.text', 'Introduction')
cy.get('.cm-content').should('contain.text', oldContent)
cy.log('disable track-changes for everyone again')
toggleTrackChanges(false)
})
})
describe('editor', () => {
beforeEach(() => {
login('user@example.com')
cy.visit(`/project`)
createProject(`project-${uuid()}`, { type: 'Example Project' })
// wait until the main document is rendered
cy.findByText(/Loading/).should('not.exist')
cy.findByText(/Your Paper/)
})
it('renders jpg', () => {
cy.findByTestId('file-tree').findByText('frog.jpg').click()
cy.get('[alt="frog.jpg"]')
@@ -199,39 +232,41 @@ describe('editor', () => {
})
it('symbol palette', () => {
createNewFile()
cy.get('button[aria-label="Toggle Symbol Palette"]').click({
force: true,
})
cy.get('button').contains('𝜉').click()
cy.get('.cm-content').should('contain.text', '\\xi')
cy.log('recompile to force flush and avoid "unsaved changes" prompt')
recompile()
})
})
describe('add new file to project', () => {
let projectName: string
beforeEach(() => {
projectName = `project-${uuid()}`
login('user@example.com')
cy.visit(`/project`)
createProject(projectName, { type: 'Example Project' })
cy.get('button').contains('New file').click({ force: true })
})
it('can upload file', () => {
const name = `${uuid()}.txt`
const content = `Test File Content ${name}`
cy.get('button').contains('Upload').click({ force: true })
cy.get('input[type=file]')
.first()
.selectFile(
{
contents: Cypress.Buffer.from('Test File Content'),
fileName: 'file.txt',
contents: Cypress.Buffer.from(content),
fileName: name,
lastModified: Date.now(),
},
{ force: true }
)
cy.findByTestId('file-tree').findByText('file.txt').click({ force: true })
cy.findByText('Test File Content')
// force: The file-tree pane is too narrow to display the full name.
cy.findByTestId('file-tree').findByText(name).click({ force: true })
cy.findByText(content)
})
it('should not display import from URL', () => {
@@ -240,13 +275,7 @@ describe('editor', () => {
})
describe('left menu', () => {
let projectName: string
beforeEach(() => {
projectName = `project-${uuid()}`
login('user@example.com')
cy.visit(`/project`)
createProject(projectName, { type: 'Example Project' })
cy.get('button').contains('Menu').click()
})
@@ -292,13 +321,6 @@ describe('editor', () => {
})
describe('layout selector', () => {
let projectId: string
beforeEach(() => {
login('user@example.com')
cy.visit(`/project`)
createProject(`project-${uuid()}`, { type: 'Example Project' })
})
it('show editor only and switch between editor and pdf', () => {
cy.get('.pdf-viewer').should('be.visible')
cy.get('.cm-editor').should('be.visible')
+6
View File
@@ -32,6 +32,9 @@ describe('SAML', () => {
cy.get('button[type="submit"]').click()
})
cy.log('wait for login to finish')
cy.url().should('contain', '/project')
createProject('via SAML')
})
})
@@ -62,6 +65,9 @@ describe('LDAP', () => {
cy.get('input[name="password"]').type('fry')
cy.get('button[type="submit"]').click()
cy.log('wait for login to finish')
cy.url().should('contain', '/project')
createProject('via LDAP')
})
})
+40 -35
View File
@@ -4,6 +4,8 @@ import { ensureUserExists, login } from './helpers/login'
import {
createProject,
enableLinkSharing,
openProjectByName,
openProjectViaLinkSharingAsUser,
shareProjectByEmailAndAcceptInviteViaDash,
} from './helpers/project'
@@ -20,7 +22,12 @@ describe('git-bridge', function () {
V1_HISTORY_URL: 'http://sharelatex:3100/api',
}
const gitBridgePublicHost = new URL(Cypress.config().baseUrl!).host
function gitURL(projectId: string) {
const url = new URL(Cypress.config().baseUrl!)
url.username = 'git'
url.pathname = `/git/${projectId}`
return url
}
describe('enabled in Server Pro', function () {
if (isExcludedBySharding('PRO_CUSTOM_1')) return
@@ -77,16 +84,13 @@ describe('git-bridge', function () {
it('should render the git-bridge UI in the editor', function () {
maybeClearAllTokens()
cy.visit('/project')
createProject('git').as('projectId')
cy.get('header').findByText('Menu').click()
cy.findByText('Sync')
cy.findByText('Git').click()
cy.findByRole('dialog').within(() => {
cy.findByTestId('git-bridge-modal').within(() => {
cy.get('@projectId').then(id => {
cy.get('code').contains(
`git clone http://git@${gitBridgePublicHost}/git/${id}`
)
cy.get('code').contains(`git clone ${gitURL(id.toString())}`)
})
cy.findByRole('button', {
name: 'Generate token',
@@ -98,11 +102,9 @@ describe('git-bridge', function () {
cy.url().then(url => cy.visit(url))
cy.get('header').findByText('Menu').click()
cy.findByText('Git').click()
cy.findByRole('dialog').within(() => {
cy.findByTestId('git-bridge-modal').within(() => {
cy.get('@projectId').then(id => {
cy.get('code').contains(
`git clone http://git@${gitBridgePublicHost}/git/${id}`
)
cy.get('code').contains(`git clone ${gitURL(id.toString())}`)
})
cy.findByText('Generate token').should('not.exist')
cy.findByText(/generate a new one in Account Settings/)
@@ -120,15 +122,13 @@ describe('git-bridge', function () {
let projectName: string
beforeEach(() => {
cy.visit('/project')
projectName = uuid()
createProject(projectName).as('projectId')
createProject(projectName, { open: false }).as('projectId')
})
it('should expose r/w interface to owner', () => {
maybeClearAllTokens()
cy.visit('/project')
cy.findByText(projectName).click()
openProjectByName(projectName)
checkGitAccess('readAndWrite')
})
@@ -136,11 +136,10 @@ describe('git-bridge', function () {
shareProjectByEmailAndAcceptInviteViaDash(
projectName,
'collaborator-rw@example.com',
'Can edit'
'Editor'
)
maybeClearAllTokens()
cy.visit('/project')
cy.findByText(projectName).click()
openProjectByName(projectName)
checkGitAccess('readAndWrite')
})
@@ -148,32 +147,39 @@ describe('git-bridge', function () {
shareProjectByEmailAndAcceptInviteViaDash(
projectName,
'collaborator-ro@example.com',
'Read only'
'Viewer'
)
maybeClearAllTokens()
cy.visit('/project')
cy.findByText(projectName).click()
openProjectByName(projectName)
checkGitAccess('readOnly')
})
it('should expose r/w interface to link-sharing r/w collaborator', () => {
openProjectByName(projectName)
enableLinkSharing().then(({ linkSharingReadAndWrite }) => {
login('collaborator-link-rw@example.com')
const email = 'collaborator-link-rw@example.com'
login(email)
maybeClearAllTokens()
cy.visit(linkSharingReadAndWrite)
cy.findByText(projectName) // wait for lazy loading
cy.findByText('Join Project').click()
openProjectViaLinkSharingAsUser(
linkSharingReadAndWrite,
projectName,
email
)
checkGitAccess('readAndWrite')
})
})
it('should expose r/o interface to link-sharing r/o collaborator', () => {
openProjectByName(projectName)
enableLinkSharing().then(({ linkSharingReadOnly }) => {
login('collaborator-link-ro@example.com')
const email = 'collaborator-link-ro@example.com'
login(email)
maybeClearAllTokens()
cy.visit(linkSharingReadOnly)
cy.findByText(projectName) // wait for lazy loading
cy.findByText('Join Project').click()
openProjectViaLinkSharingAsUser(
linkSharingReadOnly,
projectName,
email
)
checkGitAccess('readOnly')
})
})
@@ -186,10 +192,8 @@ describe('git-bridge', function () {
cy.findByText('Sync')
cy.findByText('Git').click()
cy.get('@projectId').then(projectId => {
cy.findByRole('dialog').within(() => {
cy.get('code').contains(
`git clone http://git@${gitBridgePublicHost}/git/${projectId}`
)
cy.findByTestId('git-bridge-modal').within(() => {
cy.get('code').contains(`git clone ${gitURL(projectId.toString())}`)
})
cy.findByRole('button', {
name: 'Generate token',
@@ -202,7 +206,7 @@ describe('git-bridge', function () {
// close Git modal
cy.findAllByText('Close').last().click()
// close editor menu
cy.get('#left-menu-modal').click()
cy.get('.left-menu-modal-backdrop').click()
const fs = new LightningFS('fs')
const dir = `/${projectId}`
@@ -229,9 +233,11 @@ describe('git-bridge', function () {
dir,
fs,
}
const url = gitURL(projectId.toString())
url.username = '' // basic auth is specified separately.
const httpOptions = {
http,
url: `http://sharelatex/git/${projectId}`,
url: url.toString(),
headers: {
Authorization: `Basic ${Buffer.from(`git:${token}`).toString('base64')}`,
},
@@ -363,7 +369,6 @@ Hello world
})
it('should not render the git-bridge UI in the editor', function () {
login('user@example.com')
cy.visit('/project')
createProject('maybe git')
cy.get('header').findByText('Menu').click()
cy.findByText('Word Count') // wait for lazy loading
-2
View File
@@ -31,8 +31,6 @@ describe('GracefulShutdown', function () {
it('should display banner and flush changes out of redis', () => {
bringServerProBackUp()
login(USER)
cy.visit('/project')
createProject(PROJECT_NAME).then(id => {
projectId = id
})
+22 -7
View File
@@ -4,22 +4,37 @@
* This helper takes into account that other UI interactions take time. We can deduce that latency from the fixed delay (3s minus other latency). This can bring down the effective waiting time to 0s.
*/
export function throttledRecompile() {
const { queueReset, recompile } = prepareWaitForNextCompileSlot()
queueReset()
return recompile
}
export function prepareWaitForNextCompileSlot() {
let lastCompile = 0
function queueReset() {
cy.then(() => {
lastCompile = Date.now()
})
}
queueReset()
return () =>
function waitForCompileRateLimitCoolOff(triggerCompile: () => void) {
cy.then(() => {
cy.log('Recompile without hitting rate-limit')
cy.log('Wait for recompile rate-limit to cool off')
const msSinceLastCompile = Date.now() - lastCompile
cy.wait(Math.max(0, 1_000 - msSinceLastCompile))
cy.findByText('Recompile').click()
queueReset()
cy.log('Wait for recompile to finish')
cy.findByText('Recompile')
triggerCompile()
cy.log('Wait for compile to finish')
cy.findByText('Recompile').should('be.visible')
})
}
function recompile() {
waitForCompileRateLimitCoolOff(() => {
cy.findByText('Recompile').click()
})
}
return {
queueReset,
waitForCompileRateLimitCoolOff,
recompile,
}
}
+2 -1
View File
@@ -68,7 +68,8 @@ export function login(username: string, password = DEFAULT_PASSWORD) {
{
cacheAcrossSpecs: true,
async validate() {
cy.request({ url: '/project', followRedirect: false }).then(
// Hit a cheap endpoint that is behind AuthenticationController.requireLogin().
cy.request({ url: '/user/personal_info', followRedirect: false }).then(
response => {
expect(response.status).to.equal(200)
}
+167 -22
View File
@@ -1,16 +1,40 @@
import { login } from './login'
import { openEmail } from './email'
import { v4 as uuid } from 'uuid'
export function createProject(
name: string,
{
type = 'Blank Project',
newProjectButtonMatcher = /new project/i,
open = true,
}: {
type?: 'Blank Project' | 'Example Project'
newProjectButtonMatcher?: RegExp
open?: boolean
} = {}
): Cypress.Chainable<string> {
cy.url().then(url => {
if (!url.endsWith('/project')) {
cy.visit('/project')
}
})
const interceptId = uuid()
let projectId = ''
if (!open) {
cy.then(() => {
// Register intercept just before creating the project, otherwise we might
// intercept a request from a prior createProject invocation.
cy.intercept(
{ method: 'GET', url: /\/project\/[a-fA-F0-9]{24}$/, times: 1 },
req => {
projectId = req.url.split('/').pop()!
// Redirect back to the project dashboard, effectively reload the page.
req.redirect('/project')
}
).as(interceptId)
})
}
cy.findAllByRole('button').contains(newProjectButtonMatcher).click()
// FIXME: This should only look in the left menu
cy.findAllByText(type).first().click()
@@ -18,50 +42,99 @@ export function createProject(
cy.get('input').type(name)
cy.findByText('Create').click()
})
return cy
.url()
.should('match', /\/project\/[a-fA-F0-9]{24}/)
.then(url => url.split('/').pop())
if (open) {
cy.url().should('match', /\/project\/[a-fA-F0-9]{24}/)
waitForMainDocToLoad()
return cy
.url()
.should('match', /\/project\/[a-fA-F0-9]{24}/)
.then(url => url.split('/').pop())
} else {
const alias = `@${interceptId}` // IDEs do not like computed values in cy.wait().
cy.wait(alias)
return cy.then(() => projectId)
}
}
export function openProjectByName(projectName: string) {
cy.visit('/project')
cy.findByText(projectName).click()
waitForMainDocToLoad()
}
export function openProjectById(projectId: string) {
cy.visit(`/project/${projectId}`)
waitForMainDocToLoad()
}
export function openProjectViaLinkSharingAsAnon(url: string) {
cy.visit(url)
waitForMainDocToLoad()
}
export function openProjectViaLinkSharingAsUser(
url: string,
projectName: string,
email: string
) {
cy.visit(url)
cy.findByText(projectName) // wait for lazy loading
cy.contains(`as ${email}`)
cy.findByText('OK, join project').click()
waitForMainDocToLoad()
}
export function openProjectViaInviteNotification(projectName: string) {
cy.visit('/project')
cy.findByText(projectName)
.parent()
.parent()
.within(() => {
cy.findByText('Join Project').click()
})
cy.findByText('Open Project').click()
cy.url().should('match', /\/project\/[a-fA-F0-9]{24}/)
waitForMainDocToLoad()
}
function shareProjectByEmail(
projectName: string,
email: string,
level: 'Read only' | 'Can edit'
level: 'Viewer' | 'Editor'
) {
cy.visit('/project')
cy.findByText(projectName).click()
openProjectByName(projectName)
cy.findByText('Share').click()
cy.findByRole('dialog').within(() => {
cy.get('input').type(`${email},`)
cy.get('input')
cy.findByLabelText('Add people', { selector: 'input' }).type(`${email},`)
cy.findByLabelText('Add people', { selector: 'input' })
.parents('form')
.within(() => cy.findByText('Can edit').parent().select(level))
cy.findByText('Share').click({ force: true })
.within(() => {
cy.findByTestId('add-collaborator-select')
.click()
.then(() => {
cy.findByText(level).click()
})
})
cy.findByText('Invite').click({ force: true })
cy.findByText('Invite not yet accepted.')
})
}
export function shareProjectByEmailAndAcceptInviteViaDash(
projectName: string,
email: string,
level: 'Read only' | 'Can edit'
level: 'Viewer' | 'Editor'
) {
shareProjectByEmail(projectName, email, level)
login(email)
cy.visit('/project')
cy.findByText(new RegExp(projectName))
.parent()
.parent()
.within(() => {
cy.findByText('Join Project').click()
})
openProjectViaInviteNotification(projectName)
}
export function shareProjectByEmailAndAcceptInviteViaEmail(
projectName: string,
email: string,
level: 'Read only' | 'Can edit'
level: 'Viewer' | 'Editor'
) {
shareProjectByEmail(projectName, email, level)
@@ -79,23 +152,27 @@ export function shareProjectByEmailAndAcceptInviteViaEmail(
cy.findByText(/user would like you to join/)
cy.contains(new RegExp(`You are accepting this invite as ${email}`))
cy.findByText('Join Project').click()
waitForMainDocToLoad()
}
export function enableLinkSharing() {
let linkSharingReadOnly: string
let linkSharingReadAndWrite: string
const origin = new URL(Cypress.config().baseUrl!).origin
waitForMainDocToLoad()
cy.findByText('Share').click()
cy.findByText('Turn on link sharing').click()
cy.findByText('Anyone with this link can view this project')
.next()
.should('contain.text', 'http://sharelatex/')
.should('contain.text', origin + '/read')
.then(el => {
linkSharingReadOnly = el.text()
})
cy.findByText('Anyone with this link can edit this project')
.next()
.should('contain.text', 'http://sharelatex/')
.should('contain.text', origin + '/')
.then(el => {
linkSharingReadAndWrite = el.text()
})
@@ -104,3 +181,71 @@ export function enableLinkSharing() {
return { linkSharingReadOnly, linkSharingReadAndWrite }
})
}
export function waitForMainDocToLoad() {
cy.log('Wait for main doc to load; it will steal the focus after loading')
cy.get('.cm-content').should('contain.text', 'Introduction')
}
export function openFile(fileName: string, waitFor: string) {
// force: The file-tree pane is too narrow to display the full name.
cy.findByTestId('file-tree').findByText(fileName).click({ force: true })
// wait until we've switched to the selected file
cy.findByText('Loading…').should('not.exist')
cy.findByText(waitFor)
}
export function createNewFile() {
const fileName = `${uuid()}.tex`
cy.log('create new project file')
cy.get('button').contains('New file').click({ force: true })
cy.findByRole('dialog').within(() => {
cy.get('input').clear()
cy.get('input').type(fileName)
cy.findByText('Create').click()
})
// force: The file-tree pane is too narrow to display the full name.
cy.findByTestId('file-tree').findByText(fileName).click({ force: true })
// wait until we've switched to the newly created empty file
cy.findByText('Loading…').should('not.exist')
cy.get('.cm-line').should('have.length', 1)
return fileName
}
export function toggleTrackChanges(state: boolean) {
cy.findByText('Review').click()
cy.get('.track-changes-menu-button').then(el => {
// when the menu is expanded renders the `expand_more` icon,
// and the `chevron_right` icon when it's collapsed
if (!el.text().includes('expand_more')) {
el.click()
}
})
cy.findByText('Everyone')
.parent()
.within(() => {
cy.get('.form-check-input').then(el => {
if (el.prop('checked') === state) return
const id = uuid()
const alias = `@${id}`
cy.intercept({
method: 'POST',
url: '**/track_changes',
times: 1,
}).as(id)
if (state) {
cy.get('.form-check-input').check()
} else {
cy.get('.form-check-input').uncheck()
}
cy.wait(alias)
})
})
cy.contains('.toolbar-item', 'Review').click()
}
-1
View File
@@ -40,7 +40,6 @@ describe('History', function () {
const CLASS_DELETION = 'ol-cm-deletion-marker'
it('should support labels, comparison and download', () => {
cy.visit('/project')
createProject('labels')
const recompile = throttledRecompile()
+248 -90
View File
@@ -12,10 +12,10 @@
"@types/pdf-parse": "^1.1.4",
"@types/uuid": "^9.0.8",
"adm-zip": "^0.5.12",
"body-parser": "^1.20.2",
"body-parser": "^1.20.3",
"celebrate": "^15.0.3",
"cypress": "13.13.2",
"express": "^4.19.2",
"express": "^4.21.2",
"isomorphic-git": "^1.25.10",
"js-yaml": "^4.1.0",
"pdf-parse": "^1.1.1",
@@ -609,9 +609,9 @@
"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
},
"node_modules/body-parser": {
"version": "1.20.2",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
"integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
"version": "1.20.3",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
"integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
"dependencies": {
"bytes": "3.1.2",
"content-type": "~1.0.5",
@@ -621,7 +621,7 @@
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"on-finished": "2.4.1",
"qs": "6.11.0",
"qs": "6.13.0",
"raw-body": "2.5.2",
"type-is": "~1.6.18",
"unpipe": "1.0.0"
@@ -645,11 +645,11 @@
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"node_modules/body-parser/node_modules/qs": {
"version": "6.11.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
"integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
"version": "6.13.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
"integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
"dependencies": {
"side-channel": "^1.0.4"
"side-channel": "^1.0.6"
},
"engines": {
"node": ">=0.6"
@@ -718,6 +718,33 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/call-bind-apply-helpers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
"dependencies": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/call-bound": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz",
"integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==",
"dependencies": {
"call-bind-apply-helpers": "^1.0.1",
"get-intrinsic": "^1.2.6"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
@@ -891,9 +918,9 @@
}
},
"node_modules/cookie": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
"integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
"integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
"engines": {
"node": ">= 0.6"
}
@@ -920,9 +947,9 @@
}
},
"node_modules/cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
@@ -1140,6 +1167,19 @@
"resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz",
"integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg=="
},
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
"dependencies": {
"call-bind-apply-helpers": "^1.0.1",
"es-errors": "^1.3.0",
"gopd": "^1.2.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
@@ -1160,9 +1200,9 @@
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
},
"node_modules/encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
"integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
"engines": {
"node": ">= 0.8"
}
@@ -1187,6 +1227,22 @@
"node": ">=8.6"
}
},
"node_modules/es-define-property": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-errors": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-get-iterator": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz",
@@ -1206,6 +1262,17 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/es-object-atoms": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"dependencies": {
"es-errors": "^1.3.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -1266,36 +1333,36 @@
}
},
"node_modules/express": {
"version": "4.19.2",
"resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
"integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==",
"version": "4.21.2",
"resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
"integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
"dependencies": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
"body-parser": "1.20.2",
"body-parser": "1.20.3",
"content-disposition": "0.5.4",
"content-type": "~1.0.4",
"cookie": "0.6.0",
"cookie": "0.7.1",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "2.0.0",
"encodeurl": "~1.0.2",
"encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"finalhandler": "1.2.0",
"finalhandler": "1.3.1",
"fresh": "0.5.2",
"http-errors": "2.0.0",
"merge-descriptors": "1.0.1",
"merge-descriptors": "1.0.3",
"methods": "~1.1.2",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
"path-to-regexp": "0.1.7",
"path-to-regexp": "0.1.12",
"proxy-addr": "~2.0.7",
"qs": "6.11.0",
"qs": "6.13.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.2.1",
"send": "0.18.0",
"serve-static": "1.15.0",
"send": "0.19.0",
"serve-static": "1.16.2",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"type-is": "~1.6.18",
@@ -1304,6 +1371,10 @@
},
"engines": {
"node": ">= 0.10.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/express"
}
},
"node_modules/express/node_modules/debug": {
@@ -1320,11 +1391,11 @@
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"node_modules/express/node_modules/qs": {
"version": "6.11.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
"integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
"version": "6.13.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
"integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
"dependencies": {
"side-channel": "^1.0.4"
"side-channel": "^1.0.6"
},
"engines": {
"node": ">=0.6"
@@ -1393,12 +1464,12 @@
}
},
"node_modules/finalhandler": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
"integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
"integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
"dependencies": {
"debug": "2.6.9",
"encodeurl": "~1.0.2",
"encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
@@ -1498,19 +1569,40 @@
}
},
"node_modules/get-intrinsic": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
"integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"dependencies": {
"call-bind-apply-helpers": "^1.0.2",
"es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
"es-object-atoms": "^1.1.1",
"function-bind": "^1.1.2",
"has-proto": "^1.0.1",
"has-symbols": "^1.0.3",
"hasown": "^2.0.0"
"get-proto": "^1.0.1",
"gopd": "^1.2.0",
"has-symbols": "^1.1.0",
"hasown": "^2.0.2",
"math-intrinsics": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"dependencies": {
"dunder-proto": "^1.0.1",
"es-object-atoms": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/get-stream": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
@@ -1556,11 +1648,11 @@
}
},
"node_modules/gopd": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
"dependencies": {
"get-intrinsic": "^1.1.3"
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -1598,21 +1690,10 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
"integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-symbols": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"engines": {
"node": ">= 0.4"
},
@@ -1635,9 +1716,9 @@
}
},
"node_modules/hasown": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
"integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"dependencies": {
"function-bind": "^1.1.2"
},
@@ -2284,6 +2365,14 @@
"lz-string": "bin/bin.js"
}
},
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@@ -2293,9 +2382,12 @@
}
},
"node_modules/merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
"integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
"integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/merge-stream": {
"version": "2.0.0",
@@ -2405,9 +2497,12 @@
}
},
"node_modules/object-inspect": {
"version": "1.13.1",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
"integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
"version": "1.13.4",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
"integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -2526,9 +2621,9 @@
}
},
"node_modules/path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
"version": "0.1.12",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
"integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ=="
},
"node_modules/pdf-parse": {
"version": "1.1.1",
@@ -2807,9 +2902,9 @@
}
},
"node_modules/send": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
"integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
"version": "0.19.0",
"resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
"integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
"dependencies": {
"debug": "2.6.9",
"depd": "2.0.0",
@@ -2842,20 +2937,28 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"node_modules/send/node_modules/encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/send/node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
"node_modules/serve-static": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
"integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
"version": "1.16.2",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
"integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
"dependencies": {
"encodeurl": "~1.0.2",
"encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
"send": "0.18.0"
"send": "0.19.0"
},
"engines": {
"node": ">= 0.8.0"
@@ -2925,13 +3028,68 @@
}
},
"node_modules/side-channel": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
"integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
"dependencies": {
"call-bind": "^1.0.0",
"get-intrinsic": "^1.0.2",
"object-inspect": "^1.9.0"
"es-errors": "^1.3.0",
"object-inspect": "^1.13.3",
"side-channel-list": "^1.0.0",
"side-channel-map": "^1.0.1",
"side-channel-weakmap": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/side-channel-list": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
"integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
"dependencies": {
"es-errors": "^1.3.0",
"object-inspect": "^1.13.3"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/side-channel-map": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
"integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
"dependencies": {
"call-bound": "^1.0.2",
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.5",
"object-inspect": "^1.13.3"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/side-channel-weakmap": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
"integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
"dependencies": {
"call-bound": "^1.0.2",
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.5",
"object-inspect": "^1.13.3",
"side-channel-map": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"

Some files were not shown because too many files have changed in this diff Show More