RocketChat / RocketChat/Rocket.Chat

channels.history API call fails with [oldest] parameter

Open
#22,713 2 comments 0 reactions 0 assignees View on GitHub

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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.