RocketChat / RocketChat/Rocket.Chat
channels.history API call fails with [oldest] parameter
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 46.1k
- Forks
- 13.9k
- Avg merge
- 3d 3h
- Merged PRs (30d)
- 130
Description
Hi,
there is a bug in the Rest-API that came probably with Version 3.16.1 and still exists in 3.16.3.
Calling /api/v1/channels.history works as described in the documentation with all query parameters except for "oldest".
The "oldest" parameter does not pass the match validation anymore. This is the place that fails:
/programs/server/packages/check.js
=> packages/check/match.js
const testSubtree = (value, pattern) => {
...
if (pattern instanceof OneOf) {
...
const result = testSubtree(value, pattern.choices[i]); <== this yields a result and it should not
If i add an unconditioned "return false;" right below, everything works fine again.
A call like
http://myserver/api/v1/groups.history?roomId=abcdefghijklmopqrst&oldest=2021-07-02T06:42:46.450Z
throws the Exception below.
Thank you for taking a look at it.
Jul 20 07:45:41 servername rocketchat[127723]: Exception on find errorClass [Error]: Match error: Failed Match.OneOf, Match.Maybe or Match.Optional validation
Jul 20 07:45:41 servername rocketchat[127723]: at check (packages/check/match.js:36:17)
Jul 20 07:45:41 servername rocketchat[127723]: at ns.Collection._getFindOptions (packages/mongo/collection.js:295:7)
Jul 20 07:45:41 servername rocketchat[127723]: at ns.Collection.find (packages/mongo/collection.js:336:12)
Jul 20 07:45:41 servername rocketchat[127723]: at BaseDb.find (app/models/server/models/_BaseDb.js:177:21)
Jul 20 07:45:41 servername rocketchat[127723]: at Messages.find (app/models/server/models/_Base.js:106:29)
Jul 20 07:45:41 servername rocketchat[127723]: at Messages.findVisibleByRoomIdBetweenTimestampsNotContainingTypes (app/models/server/models/Messages.js:374:15)
Jul 20 07:45:41 servername rocketchat[127723]: at MethodInvocation.getChannelHistory (app/lib/server/methods/getChannelHistory.js:56:15)
Jul 20 07:45:41 servername rocketchat[127723]: at MethodInvocation.methodsMap. (app/lib/server/lib/debug.js:76:34)
Jul 20 07:45:41 servername rocketchat[127723]: at maybeAuditArgumentChecks (packages/ddp-server/livedata_server.js:1771:12)
Jul 20 07:45:41 servername rocketchat[127723]: at packages/ddp-server/livedata_server.js:1689:15
Jul 20 07:45:41 servername rocketchat[127723]: at Meteor.EnvironmentVariable.EVp.withValue (packages/meteor.js🔢12)
Jul 20 07:45:41 servername rocketchat[127723]: at packages/ddp-server/livedata_server.js:1687:36
Jul 20 07:45:41 servername rocketchat[127723]: at new Promise ()
Jul 20 07:45:41 servername rocketchat[127723]: at Server.applyAsync (packages/ddp-server/livedata_server.js:1686:12)
Jul 20 07:45:41 servername rocketchat[127723]: at Server.apply (packages/ddp-server/livedata_server.js:1625:26)
Jul 20 07:45:41 servername rocketchat[127723]: at Server.call (packages/ddp-server/livedata_server.js:1607:17)
Jul 20 07:45:41 servername rocketchat[127723]: at Object.get (app/api/server/v1/groups.js:364:25)
Jul 20 07:45:41 servername rocketchat[127723]: at app/api/server/api.js:394:82
Jul 20 07:45:41 servername rocketchat[127723]: at Meteor.EnvironmentVariable.EVp.withValue (packages/meteor.js🔢12)
Jul 20 07:45:41 servername rocketchat[127723]: at Object._internalRouteActionHandler [as action] (app/api/server/api.js:394:39)
Jul 20 07:45:41 servername rocketchat[127723]: at Route.share.Route.Route._callEndpoint (packages/nimble_restivus/lib/route.coffee:150:32)
Jul 20 07:45:41 servername rocketchat[127723]: at packages/nimble_restivus/lib/route.coffee:59:33
Jul 20 07:45:41 servername rocketchat[127723]: at packages/simple_json-routes.js:98:9 {
Jul 20 07:45:41 servername rocketchat[127723]: path: '',
Jul 20 07:45:41 servername rocketchat[127723]: sanitizedError: errorClass [Error]: Match failed [400]
Jul 20 07:45:41 servername rocketchat[127723]: at errorClass. (packages/check/match.js:91:27)
Jul 20 07:45:41 servername rocketchat[127723]: at new errorClass (packages/meteor.js:655:17)
Jul 20 07:45:41 servername rocketchat[127723]: at check (packages/check/match.js:36:17)
Jul 20 07:45:41 servername rocketchat[127723]: at ns.Collection._getFindOptions (packages/mongo/collection.js:295:7)
Jul 20 07:45:41 servername rocketchat[127723]: at ns.Collection.find (packages/mongo/collection.js:336:12)
Jul 20 07:45:41 servername rocketchat[127723]: at BaseDb.find (app/models/server/models/_BaseDb.js:177:21)
Jul 20 07:45:41 servername rocketchat[127723]: at Messages.find (app/models/server/models/_Base.js:106:29)
Jul 20 07:45:41 servername rocketchat[127723]: at Messages.findVisibleByRoomIdBetweenTimestampsNotContainingTypes (app/models/server/models/Messages.js:374:15)
Jul 20 07:45:41 servername rocketchat[127723]: at MethodInvocation.getChannelHistory (app/lib/server/methods/getChannelHistory.js:56:15)
Jul 20 07:45:41 servername rocketchat[127723]: at MethodInvocation.methodsMap. (app/lib/server/lib/debug.js:76:34)
Jul 20 07:45:41 servername rocketchat[127723]: at maybeAuditArgumentChecks (packages/ddp-server/livedata_server.js:1771:12)
Jul 20 07:45:41 servername rocketchat[127723]: at packages/ddp-server/livedata_server.js:1689:15
Jul 20 07:45:41 servername rocketchat[127723]: at Meteor.EnvironmentVariable.EVp.withValue (packages/meteor.js🔢12)
Jul 20 07:45:41 servername rocketchat[127723]: at packages/ddp-server/livedata_server.js:1687:36
Jul 20 07:45:41 servername rocketchat[127723]: at new Promise ()
Jul 20 07:45:41 servername rocketchat[127723]: at Server.applyAsync (packages/ddp-server/livedata_server.js:1686:12)
Jul 20 07:45:41 servername rocketchat[127723]: at Server.apply (packages/ddp-server/livedata_server.js:1625:26)
Jul 20 07:45:41 servername rocketchat[127723]: at Server.call (packages/ddp-server/livedata_server.js:1607:17)
Jul 20 07:45:41 servername rocketchat[127723]: at Object.get (app/api/server/v1/groups.js:364:25)
Jul 20 07:45:41 servername rocketchat[127723]: at app/api/server/api.js:394:82
Jul 20 07:45:41 servername rocketchat[127723]: at Meteor.EnvironmentVariable.EVp.withValue (packages/meteor.js🔢12)
Jul 20 07:45:41 servername rocketchat[127723]: at Object._internalRouteActionHandler [as action] (app/api/server/api.js:394:39)
Jul 20 07:45:41 servername rocketchat[127723]: at Route.share.Route.Route._callEndpoint (packages/nimble_restivus/lib/route.coffee:150:32)
Jul 20 07:45:41 servername rocketchat[127723]: at packages/nimble_restivus/lib/route.coffee:59:33
Jul 20 07:45:41 servername rocketchat[127723]: at packages/simple_json-routes.js:98:9 {
Jul 20 07:45:41 servername rocketchat[127723]: isClientSafe: true,
Jul 20 07:45:41 servername rocketchat[127723]: error: 400,
Jul 20 07:45:41 servername rocketchat[127723]: reason: 'Match failed',
Jul 20 07:45:41 servername rocketchat[127723]: details: undefined,
Jul 20 07:45:41 servername rocketchat[127723]: errorType: 'Meteor.Error'
Jul 20 07:45:41 servername rocketchat[127723]: },
Jul 20 07:45:41 servername rocketchat[127723]: errorType: 'Match.Error'
Jul 20 07:45:41 servername rocketchat[127723]: } {
Jul 20 07:45:41 servername rocketchat[127723]: _hidden: { '$ne': true },
Jul 20 07:45:41 servername rocketchat[127723]: rid: 'abcdefghijklmopqrst',
Jul 20 07:45:41 servername rocketchat[127723]: ts: { '$gt': 2021-07-20T05:46:15.159Z, '$lt': 2021-07-20T05:45:41.919Z },
Jul 20 07:45:41 servername rocketchat[127723]: '$or': [ { tmid: [Object] }, { tshow: true } ]
Jul 20 07:45:41 servername rocketchat[127723]: } true
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with packages/check/match.js and trace the failing validation from app/api/server/v1/groups.js through app/lib/server/methods/getChannelHistory.js. Reproduce the channels.history request using the oldest timestamp, then verify that the parameter passes validation and the history response succeeds without the Match error.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- javascript
- Domain
- api, backend
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100