You've already forked matrix-js-sdk
mirror of
https://github.com/matrix-org/matrix-js-sdk.git
synced 2025-08-09 10:22:46 +03:00
Merge branch 'matthew/warn-unknown-devices' into matthew/blacklist-unverified
This commit is contained in:
12
.eslintrc.js
12
.eslintrc.js
@@ -1,4 +1,5 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
|
parser: "babel-eslint",
|
||||||
parserOptions: {
|
parserOptions: {
|
||||||
ecmaVersion: 6,
|
ecmaVersion: 6,
|
||||||
sourceType: "module",
|
sourceType: "module",
|
||||||
@@ -18,6 +19,13 @@ module.exports = {
|
|||||||
}],
|
}],
|
||||||
curly: ["error", "multi-line"],
|
curly: ["error", "multi-line"],
|
||||||
"prefer-const": ["error"],
|
"prefer-const": ["error"],
|
||||||
|
"comma-dangle": ["error", {
|
||||||
|
arrays: "always-multiline",
|
||||||
|
objects: "always-multiline",
|
||||||
|
imports: "always-multiline",
|
||||||
|
exports: "always-multiline",
|
||||||
|
functions: "always-multiline",
|
||||||
|
}],
|
||||||
|
|
||||||
// loosen jsdoc requirements a little
|
// loosen jsdoc requirements a little
|
||||||
"require-jsdoc": ["error", {
|
"require-jsdoc": ["error", {
|
||||||
@@ -48,14 +56,12 @@ module.exports = {
|
|||||||
// we set these to warnings, and assert that the number
|
// we set these to warnings, and assert that the number
|
||||||
// of warnings doesn't exceed a given threshold
|
// of warnings doesn't exceed a given threshold
|
||||||
"no-var": ["warn"],
|
"no-var": ["warn"],
|
||||||
"comma-dangle": ["warn"],
|
"brace-style": ["warn", "1tbs", {"allowSingleLine": true}],
|
||||||
"brace-style": ["warn"],
|
|
||||||
"prefer-rest-params": ["warn"],
|
"prefer-rest-params": ["warn"],
|
||||||
"prefer-spread": ["warn"],
|
"prefer-spread": ["warn"],
|
||||||
"one-var": ["warn"],
|
"one-var": ["warn"],
|
||||||
"padded-blocks": ["warn"],
|
"padded-blocks": ["warn"],
|
||||||
"no-extend-native": ["warn"],
|
"no-extend-native": ["warn"],
|
||||||
"camelcase": ["warn"],
|
"camelcase": ["warn"],
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
1
.gitignore
vendored
1
.gitignore
vendored
@@ -8,6 +8,7 @@ out
|
|||||||
reports
|
reports
|
||||||
/dist
|
/dist
|
||||||
/lib
|
/lib
|
||||||
|
/specbuild
|
||||||
|
|
||||||
# version file and tarball created by 'npm pack'
|
# version file and tarball created by 'npm pack'
|
||||||
/git-revision.txt
|
/git-revision.txt
|
||||||
|
31
docs/warning-on-unverified-devices.txt
Normal file
31
docs/warning-on-unverified-devices.txt
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
Random notes from Matthew on the two possible approaches for warning users about unexpected
|
||||||
|
unverified devices popping up in their rooms....
|
||||||
|
|
||||||
|
Original idea...
|
||||||
|
================
|
||||||
|
|
||||||
|
Warn when an existing user adds an unknown device to a room.
|
||||||
|
|
||||||
|
Warn when a user joins the room with unverified or unknown devices.
|
||||||
|
|
||||||
|
Warn when you initial sync if the room has any unverified devices in it.
|
||||||
|
^ this is good enough if we're doing local storage.
|
||||||
|
OR, better:
|
||||||
|
Warn when you initial sync if the room has any new undefined devices since you were last there.
|
||||||
|
=> This means persisting the rooms that devices are in, across initial syncs.
|
||||||
|
|
||||||
|
|
||||||
|
Updated idea...
|
||||||
|
===============
|
||||||
|
|
||||||
|
Warn when the user tries to send a message:
|
||||||
|
- If the room has unverified devices which the user has not yet been told about in the context of this room
|
||||||
|
...or in the context of this user? currently all verification is per-user, not per-room.
|
||||||
|
...this should be good enough.
|
||||||
|
|
||||||
|
- so track whether we have warned the user or not about unverified devices - blocked, unverified, verified, unverified_warned.
|
||||||
|
throw an error when trying to encrypt if there are pure unverified devices there
|
||||||
|
app will have to search for the devices which are pure unverified to warn about them - have to do this from MembersList anyway?
|
||||||
|
- or megolm could warn which devices are causing the problems.
|
||||||
|
|
||||||
|
Why do we wait to establish outbound sessions? It just makes a horrible pause when we first try to send a message... but could otherwise unnecessarily consume resources?
|
@@ -4,8 +4,9 @@
|
|||||||
"description": "Matrix Client-Server SDK for Javascript",
|
"description": "Matrix Client-Server SDK for Javascript",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "istanbul cover --report cobertura --config .istanbul.yml -i \"lib/**/*.js\" jasmine-node -- spec --verbose --junitreport --captureExceptions",
|
"buildtest": "babel -s -d specbuild spec",
|
||||||
"check": "jasmine-node spec --verbose --junitreport --captureExceptions",
|
"test": "npm run buildtest && istanbul cover --report cobertura --config .istanbul.yml -i \"lib/**/*.js\" jasmine-node -- specbuild --verbose --junitreport --captureExceptions",
|
||||||
|
"check": "npm run buildtest && jasmine-node specbuild --verbose --junitreport --captureExceptions",
|
||||||
"gendoc": "jsdoc -r lib -P package.json -R README.md -d .jsdoc",
|
"gendoc": "jsdoc -r lib -P package.json -R README.md -d .jsdoc",
|
||||||
"start": "babel -s -w -d lib src",
|
"start": "babel -s -w -d lib src",
|
||||||
"build": "babel -s -d lib src && rimraf dist && mkdir dist && browserify --exclude olm browser-index.js -o dist/browser-matrix.js --ignore-missing && uglifyjs -c -m -o dist/browser-matrix.min.js dist/browser-matrix.js",
|
"build": "babel -s -d lib src && rimraf dist && mkdir dist && browserify --exclude olm browser-index.js -o dist/browser-matrix.js --ignore-missing && uglifyjs -c -m -o dist/browser-matrix.min.js dist/browser-matrix.js",
|
||||||
@@ -52,6 +53,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"babel-cli": "^6.18.0",
|
"babel-cli": "^6.18.0",
|
||||||
|
"babel-eslint": "^7.1.1",
|
||||||
"babel-preset-es2015": "^6.18.0",
|
"babel-preset-es2015": "^6.18.0",
|
||||||
"eslint": "^3.13.1",
|
"eslint": "^3.13.1",
|
||||||
"eslint-config-google": "^0.7.1",
|
"eslint-config-google": "^0.7.1",
|
||||||
|
@@ -304,7 +304,7 @@ function expectBobSendMessageRequest() {
|
|||||||
|
|
||||||
function sendMessage(client) {
|
function sendMessage(client) {
|
||||||
return client.sendMessage(
|
return client.sendMessage(
|
||||||
roomId, {msgtype: "m.text", body: "Hello, World"}
|
roomId, {msgtype: "m.text", body: "Hello, World"},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -520,7 +520,7 @@ describe("MatrixClient crypto", function() {
|
|||||||
// request again: should be no more requests
|
// request again: should be no more requests
|
||||||
return aliClient.downloadKeys(['@bob:id']);
|
return aliClient.downloadKeys(['@bob:id']);
|
||||||
}).nodeify(done);
|
}).nodeify(done);
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
it("Bob uploads without one-time keys and with one-time keys", function(done) {
|
it("Bob uploads without one-time keys and with one-time keys", function(done) {
|
||||||
@@ -583,7 +583,7 @@ describe("MatrixClient crypto", function() {
|
|||||||
|
|
||||||
q.all(
|
q.all(
|
||||||
aliClient.downloadKeys([bobUserId, eveUserId]),
|
aliClient.downloadKeys([bobUserId, eveUserId]),
|
||||||
aliHttpBackend.flush("/keys/query", 1)
|
aliHttpBackend.flush("/keys/query", 1),
|
||||||
).then(function() {
|
).then(function() {
|
||||||
// should get an empty list
|
// should get an empty list
|
||||||
expect(aliClient.listDeviceKeys(bobUserId)).toEqual([]);
|
expect(aliClient.listDeviceKeys(bobUserId)).toEqual([]);
|
||||||
@@ -618,7 +618,7 @@ describe("MatrixClient crypto", function() {
|
|||||||
|
|
||||||
q.all(
|
q.all(
|
||||||
aliClient.downloadKeys([bobUserId]),
|
aliClient.downloadKeys([bobUserId]),
|
||||||
aliHttpBackend.flush("/keys/query", 1)
|
aliHttpBackend.flush("/keys/query", 1),
|
||||||
).then(function() {
|
).then(function() {
|
||||||
// should get an empty list
|
// should get an empty list
|
||||||
expect(aliClient.listDeviceKeys(bobUserId)).toEqual([]);
|
expect(aliClient.listDeviceKeys(bobUserId)).toEqual([]);
|
||||||
|
@@ -108,7 +108,7 @@ describe("MatrixClient events", function() {
|
|||||||
SYNC_DATA.rooms.join["!erufh:bar"].timeline.events,
|
SYNC_DATA.rooms.join["!erufh:bar"].timeline.events,
|
||||||
SYNC_DATA.rooms.join["!erufh:bar"].state.events,
|
SYNC_DATA.rooms.join["!erufh:bar"].state.events,
|
||||||
NEXT_SYNC_DATA.rooms.join["!erufh:bar"].timeline.events,
|
NEXT_SYNC_DATA.rooms.join["!erufh:bar"].timeline.events,
|
||||||
NEXT_SYNC_DATA.rooms.join["!erufh:bar"].ephemeral.events
|
NEXT_SYNC_DATA.rooms.join["!erufh:bar"].ephemeral.events,
|
||||||
);
|
);
|
||||||
|
|
||||||
client.on("event", function(event) {
|
client.on("event", function(event) {
|
||||||
@@ -121,7 +121,7 @@ describe("MatrixClient events", function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
expect(found).toBe(
|
expect(found).toBe(
|
||||||
true, "Unexpected 'event' emitted: " + event.getType()
|
true, "Unexpected 'event' emitted: " + event.getType(),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -129,7 +129,7 @@ describe("MatrixClient events", function() {
|
|||||||
|
|
||||||
httpBackend.flush().done(function() {
|
httpBackend.flush().done(function() {
|
||||||
expect(expectedEvents.length).toEqual(
|
expect(expectedEvents.length).toEqual(
|
||||||
0, "Failed to see all events from /sync calls"
|
0, "Failed to see all events from /sync calls",
|
||||||
);
|
);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
@@ -149,7 +149,7 @@ describe("MatrixClient events", function() {
|
|||||||
|
|
||||||
expect(event.event).toEqual(SYNC_DATA.presence.events[0]);
|
expect(event.event).toEqual(SYNC_DATA.presence.events[0]);
|
||||||
expect(user.presence).toEqual(
|
expect(user.presence).toEqual(
|
||||||
SYNC_DATA.presence.events[0].content.presence
|
SYNC_DATA.presence.events[0].content.presence,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
client.startClient();
|
client.startClient();
|
||||||
@@ -182,13 +182,13 @@ describe("MatrixClient events", function() {
|
|||||||
|
|
||||||
httpBackend.flush().done(function() {
|
httpBackend.flush().done(function() {
|
||||||
expect(roomInvokeCount).toEqual(
|
expect(roomInvokeCount).toEqual(
|
||||||
1, "Room fired wrong number of times."
|
1, "Room fired wrong number of times.",
|
||||||
);
|
);
|
||||||
expect(roomNameInvokeCount).toEqual(
|
expect(roomNameInvokeCount).toEqual(
|
||||||
1, "Room.name fired wrong number of times."
|
1, "Room.name fired wrong number of times.",
|
||||||
);
|
);
|
||||||
expect(timelineFireCount).toEqual(
|
expect(timelineFireCount).toEqual(
|
||||||
3, "Room.timeline fired the wrong number of times"
|
3, "Room.timeline fired the wrong number of times",
|
||||||
);
|
);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
@@ -208,7 +208,7 @@ describe("MatrixClient events", function() {
|
|||||||
eventsInvokeCount++;
|
eventsInvokeCount++;
|
||||||
const index = roomStateEventTypes.indexOf(event.getType());
|
const index = roomStateEventTypes.indexOf(event.getType());
|
||||||
expect(index).not.toEqual(
|
expect(index).not.toEqual(
|
||||||
-1, "Unexpected room state event type: " + event.getType()
|
-1, "Unexpected room state event type: " + event.getType(),
|
||||||
);
|
);
|
||||||
if (index >= 0) {
|
if (index >= 0) {
|
||||||
roomStateEventTypes.splice(index, 1);
|
roomStateEventTypes.splice(index, 1);
|
||||||
@@ -231,13 +231,13 @@ describe("MatrixClient events", function() {
|
|||||||
|
|
||||||
httpBackend.flush().done(function() {
|
httpBackend.flush().done(function() {
|
||||||
expect(membersInvokeCount).toEqual(
|
expect(membersInvokeCount).toEqual(
|
||||||
1, "RoomState.members fired wrong number of times"
|
1, "RoomState.members fired wrong number of times",
|
||||||
);
|
);
|
||||||
expect(newMemberInvokeCount).toEqual(
|
expect(newMemberInvokeCount).toEqual(
|
||||||
1, "RoomState.newMember fired wrong number of times"
|
1, "RoomState.newMember fired wrong number of times",
|
||||||
);
|
);
|
||||||
expect(eventsInvokeCount).toEqual(
|
expect(eventsInvokeCount).toEqual(
|
||||||
2, "RoomState.events fired wrong number of times"
|
2, "RoomState.events fired wrong number of times",
|
||||||
);
|
);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
@@ -270,16 +270,16 @@ describe("MatrixClient events", function() {
|
|||||||
|
|
||||||
httpBackend.flush().done(function() {
|
httpBackend.flush().done(function() {
|
||||||
expect(typingInvokeCount).toEqual(
|
expect(typingInvokeCount).toEqual(
|
||||||
1, "RoomMember.typing fired wrong number of times"
|
1, "RoomMember.typing fired wrong number of times",
|
||||||
);
|
);
|
||||||
expect(powerLevelInvokeCount).toEqual(
|
expect(powerLevelInvokeCount).toEqual(
|
||||||
0, "RoomMember.powerLevel fired wrong number of times"
|
0, "RoomMember.powerLevel fired wrong number of times",
|
||||||
);
|
);
|
||||||
expect(nameInvokeCount).toEqual(
|
expect(nameInvokeCount).toEqual(
|
||||||
0, "RoomMember.name fired wrong number of times"
|
0, "RoomMember.name fired wrong number of times",
|
||||||
);
|
);
|
||||||
expect(membershipInvokeCount).toEqual(
|
expect(membershipInvokeCount).toEqual(
|
||||||
1, "RoomMember.membership fired wrong number of times"
|
1, "RoomMember.membership fired wrong number of times",
|
||||||
);
|
);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
@@ -297,7 +297,7 @@ describe("MatrixClient events", function() {
|
|||||||
|
|
||||||
httpBackend.flush().done(function() {
|
httpBackend.flush().done(function() {
|
||||||
expect(sessionLoggedOutCount).toEqual(
|
expect(sessionLoggedOutCount).toEqual(
|
||||||
1, "Session.logged_out fired wrong number of times"
|
1, "Session.logged_out fired wrong number of times",
|
||||||
);
|
);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
@@ -118,7 +118,7 @@ describe("getEventTimeline support", function() {
|
|||||||
accessToken: accessToken,
|
accessToken: accessToken,
|
||||||
});
|
});
|
||||||
|
|
||||||
startClient(httpBackend, client
|
startClient(httpBackend, client,
|
||||||
).then(function() {
|
).then(function() {
|
||||||
const room = client.getRoom(roomId);
|
const room = client.getRoom(roomId);
|
||||||
const timelineSet = room.getTimelineSets()[0];
|
const timelineSet = room.getTimelineSets()[0];
|
||||||
@@ -136,7 +136,7 @@ describe("getEventTimeline support", function() {
|
|||||||
timelineSupport: true,
|
timelineSupport: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
startClient(httpBackend, client
|
startClient(httpBackend, client,
|
||||||
).then(function() {
|
).then(function() {
|
||||||
const room = client.getRoom(roomId);
|
const room = client.getRoom(roomId);
|
||||||
const timelineSet = room.getTimelineSets()[0];
|
const timelineSet = room.getTimelineSets()[0];
|
||||||
@@ -159,7 +159,7 @@ describe("getEventTimeline support", function() {
|
|||||||
});
|
});
|
||||||
let room;
|
let room;
|
||||||
|
|
||||||
startClient(httpBackend, client
|
startClient(httpBackend, client,
|
||||||
).then(function() {
|
).then(function() {
|
||||||
room = client.getRoom(roomId);
|
room = client.getRoom(roomId);
|
||||||
|
|
||||||
@@ -343,7 +343,7 @@ describe("MatrixClient event timelines", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
client.on("sync", function() {
|
client.on("sync", function() {
|
||||||
client.getEventTimeline(timelineSet, EVENTS[2].event_id
|
client.getEventTimeline(timelineSet, EVENTS[2].event_id,
|
||||||
).then(function(tl) {
|
).then(function(tl) {
|
||||||
expect(tl.getEvents().length).toEqual(4);
|
expect(tl.getEvents().length).toEqual(4);
|
||||||
expect(tl.getEvents()[0].event).toEqual(EVENTS[1]);
|
expect(tl.getEvents()[0].event).toEqual(EVENTS[1]);
|
||||||
@@ -420,7 +420,7 @@ describe("MatrixClient event timelines", function() {
|
|||||||
|
|
||||||
let tl0;
|
let tl0;
|
||||||
let tl3;
|
let tl3;
|
||||||
client.getEventTimeline(timelineSet, EVENTS[0].event_id
|
client.getEventTimeline(timelineSet, EVENTS[0].event_id,
|
||||||
).then(function(tl) {
|
).then(function(tl) {
|
||||||
expect(tl.getEvents().length).toEqual(1);
|
expect(tl.getEvents().length).toEqual(1);
|
||||||
tl0 = tl;
|
tl0 = tl;
|
||||||
@@ -470,7 +470,7 @@ describe("MatrixClient event timelines", function() {
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
client.getEventTimeline(timelineSet, "event1"
|
client.getEventTimeline(timelineSet, "event1",
|
||||||
).then(function(tl) {
|
).then(function(tl) {
|
||||||
// could do with a fail()
|
// could do with a fail()
|
||||||
expect(true).toBeFalsy();
|
expect(true).toBeFalsy();
|
||||||
@@ -514,7 +514,7 @@ describe("MatrixClient event timelines", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
let tl;
|
let tl;
|
||||||
client.getEventTimeline(timelineSet, EVENTS[0].event_id
|
client.getEventTimeline(timelineSet, EVENTS[0].event_id,
|
||||||
).then(function(tl0) {
|
).then(function(tl0) {
|
||||||
tl = tl0;
|
tl = tl0;
|
||||||
return client.paginateEventTimeline(tl, {backwards: true});
|
return client.paginateEventTimeline(tl, {backwards: true});
|
||||||
@@ -565,7 +565,7 @@ describe("MatrixClient event timelines", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
let tl;
|
let tl;
|
||||||
client.getEventTimeline(timelineSet, EVENTS[0].event_id
|
client.getEventTimeline(timelineSet, EVENTS[0].event_id,
|
||||||
).then(function(tl0) {
|
).then(function(tl0) {
|
||||||
tl = tl0;
|
tl = tl0;
|
||||||
return client.paginateEventTimeline(
|
return client.paginateEventTimeline(
|
||||||
|
@@ -44,7 +44,7 @@ describe("MatrixClient", function() {
|
|||||||
const buf = new Buffer('hello world');
|
const buf = new Buffer('hello world');
|
||||||
it("should upload the file", function(done) {
|
it("should upload the file", function(done) {
|
||||||
httpBackend.when(
|
httpBackend.when(
|
||||||
"POST", "/_matrix/media/v1/upload"
|
"POST", "/_matrix/media/v1/upload",
|
||||||
).check(function(req) {
|
).check(function(req) {
|
||||||
expect(req.data).toEqual(buf);
|
expect(req.data).toEqual(buf);
|
||||||
expect(req.queryParams.filename).toEqual("hi.txt");
|
expect(req.queryParams.filename).toEqual("hi.txt");
|
||||||
@@ -80,7 +80,7 @@ describe("MatrixClient", function() {
|
|||||||
|
|
||||||
it("should parse the response if rawResponse=false", function(done) {
|
it("should parse the response if rawResponse=false", function(done) {
|
||||||
httpBackend.when(
|
httpBackend.when(
|
||||||
"POST", "/_matrix/media/v1/upload"
|
"POST", "/_matrix/media/v1/upload",
|
||||||
).check(function(req) {
|
).check(function(req) {
|
||||||
expect(req.opts.json).toBeFalsy();
|
expect(req.opts.json).toBeFalsy();
|
||||||
}).respond(200, JSON.stringify({ "content_uri": "uri" }));
|
}).respond(200, JSON.stringify({ "content_uri": "uri" }));
|
||||||
@@ -101,7 +101,7 @@ describe("MatrixClient", function() {
|
|||||||
it("should parse errors into a MatrixError", function(done) {
|
it("should parse errors into a MatrixError", function(done) {
|
||||||
// opts.json is false, so request returns unparsed json.
|
// opts.json is false, so request returns unparsed json.
|
||||||
httpBackend.when(
|
httpBackend.when(
|
||||||
"POST", "/_matrix/media/v1/upload"
|
"POST", "/_matrix/media/v1/upload",
|
||||||
).check(function(req) {
|
).check(function(req) {
|
||||||
expect(req.data).toEqual(buf);
|
expect(req.data).toEqual(buf);
|
||||||
expect(req.opts.json).toBeFalsy();
|
expect(req.opts.json).toBeFalsy();
|
||||||
@@ -188,7 +188,7 @@ describe("MatrixClient", function() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
httpBackend.when(
|
httpBackend.when(
|
||||||
"GET", "/user/" + encodeURIComponent(userId) + "/filter/" + filterId
|
"GET", "/user/" + encodeURIComponent(userId) + "/filter/" + filterId,
|
||||||
).respond(200, httpFilterDefinition);
|
).respond(200, httpFilterDefinition);
|
||||||
|
|
||||||
const storeFilter = Filter.fromJson(userId, filterId, {
|
const storeFilter = Filter.fromJson(userId, filterId, {
|
||||||
@@ -211,7 +211,7 @@ describe("MatrixClient", function() {
|
|||||||
expect(store.getFilter(userId, filterId)).toBeNull();
|
expect(store.getFilter(userId, filterId)).toBeNull();
|
||||||
|
|
||||||
httpBackend.when(
|
httpBackend.when(
|
||||||
"GET", "/user/" + encodeURIComponent(userId) + "/filter/" + filterId
|
"GET", "/user/" + encodeURIComponent(userId) + "/filter/" + filterId,
|
||||||
).respond(200, httpFilterDefinition);
|
).respond(200, httpFilterDefinition);
|
||||||
client.getFilter(userId, filterId, true).done(function(gotFilter) {
|
client.getFilter(userId, filterId, true).done(function(gotFilter) {
|
||||||
expect(gotFilter.getDefinition()).toEqual(httpFilterDefinition);
|
expect(gotFilter.getDefinition()).toEqual(httpFilterDefinition);
|
||||||
@@ -234,7 +234,7 @@ describe("MatrixClient", function() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
httpBackend.when(
|
httpBackend.when(
|
||||||
"POST", "/user/" + encodeURIComponent(userId) + "/filter"
|
"POST", "/user/" + encodeURIComponent(userId) + "/filter",
|
||||||
).check(function(req) {
|
).check(function(req) {
|
||||||
expect(req.data).toEqual(filterDefinition);
|
expect(req.data).toEqual(filterDefinition);
|
||||||
}).respond(200, {
|
}).respond(200, {
|
||||||
@@ -379,13 +379,13 @@ describe("MatrixClient", function() {
|
|||||||
const auth = {a: 1};
|
const auth = {a: 1};
|
||||||
it("should pass through an auth dict", function(done) {
|
it("should pass through an auth dict", function(done) {
|
||||||
httpBackend.when(
|
httpBackend.when(
|
||||||
"DELETE", "/_matrix/client/unstable/devices/my_device"
|
"DELETE", "/_matrix/client/unstable/devices/my_device",
|
||||||
).check(function(req) {
|
).check(function(req) {
|
||||||
expect(req.data).toEqual({auth: auth});
|
expect(req.data).toEqual({auth: auth});
|
||||||
}).respond(200);
|
}).respond(200);
|
||||||
|
|
||||||
client.deleteDevice(
|
client.deleteDevice(
|
||||||
"my_device", auth
|
"my_device", auth,
|
||||||
).catch(utils.failTest).done(done);
|
).catch(utils.failTest).done(done);
|
||||||
|
|
||||||
httpBackend.flush();
|
httpBackend.flush();
|
||||||
|
@@ -97,10 +97,10 @@ describe("MatrixClient opts", function() {
|
|||||||
];
|
];
|
||||||
client.on("event", function(event) {
|
client.on("event", function(event) {
|
||||||
expect(expectedEventTypes.indexOf(event.getType())).not.toEqual(
|
expect(expectedEventTypes.indexOf(event.getType())).not.toEqual(
|
||||||
-1, "Recv unexpected event type: " + event.getType()
|
-1, "Recv unexpected event type: " + event.getType(),
|
||||||
);
|
);
|
||||||
expectedEventTypes.splice(
|
expectedEventTypes.splice(
|
||||||
expectedEventTypes.indexOf(event.getType()), 1
|
expectedEventTypes.indexOf(event.getType()), 1,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
httpBackend.when("GET", "/pushrules").respond(200, {});
|
httpBackend.when("GET", "/pushrules").respond(200, {});
|
||||||
@@ -113,7 +113,7 @@ describe("MatrixClient opts", function() {
|
|||||||
return httpBackend.flush("/sync", 1);
|
return httpBackend.flush("/sync", 1);
|
||||||
}).done(function() {
|
}).done(function() {
|
||||||
expect(expectedEventTypes.length).toEqual(
|
expect(expectedEventTypes.length).toEqual(
|
||||||
0, "Expected to see event types: " + expectedEventTypes
|
0, "Expected to see event types: " + expectedEventTypes,
|
||||||
);
|
);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
@@ -82,7 +82,7 @@ describe("MatrixClient room timelines", function() {
|
|||||||
if (e.__prev_event === undefined) {
|
if (e.__prev_event === undefined) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
"setNextSyncData needs the prev state set to '__prev_event' " +
|
"setNextSyncData needs the prev state set to '__prev_event' " +
|
||||||
"for " + e.type
|
"for " + e.type,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (e.__prev_event !== null) {
|
if (e.__prev_event !== null) {
|
||||||
@@ -409,10 +409,10 @@ describe("MatrixClient room timelines", function() {
|
|||||||
expect(index).toEqual(2);
|
expect(index).toEqual(2);
|
||||||
expect(room.timeline.length).toEqual(3);
|
expect(room.timeline.length).toEqual(3);
|
||||||
expect(room.timeline[2].event).toEqual(
|
expect(room.timeline[2].event).toEqual(
|
||||||
eventData[1]
|
eventData[1],
|
||||||
);
|
);
|
||||||
expect(room.timeline[1].event).toEqual(
|
expect(room.timeline[1].event).toEqual(
|
||||||
eventData[0]
|
eventData[0],
|
||||||
);
|
);
|
||||||
}).catch(utils.failTest).done(done);
|
}).catch(utils.failTest).done(done);
|
||||||
});
|
});
|
||||||
@@ -510,11 +510,11 @@ describe("MatrixClient room timelines", function() {
|
|||||||
expect(room.currentState.getMembers().length).toEqual(4);
|
expect(room.currentState.getMembers().length).toEqual(4);
|
||||||
expect(room.currentState.getMember(userC).name).toEqual("C");
|
expect(room.currentState.getMember(userC).name).toEqual("C");
|
||||||
expect(room.currentState.getMember(userC).membership).toEqual(
|
expect(room.currentState.getMember(userC).membership).toEqual(
|
||||||
"join"
|
"join",
|
||||||
);
|
);
|
||||||
expect(room.currentState.getMember(userD).name).toEqual(userD);
|
expect(room.currentState.getMember(userD).name).toEqual(userD);
|
||||||
expect(room.currentState.getMember(userD).membership).toEqual(
|
expect(room.currentState.getMember(userD).membership).toEqual(
|
||||||
"invite"
|
"invite",
|
||||||
);
|
);
|
||||||
}).catch(utils.failTest).done(done);
|
}).catch(utils.failTest).done(done);
|
||||||
});
|
});
|
||||||
@@ -543,11 +543,11 @@ describe("MatrixClient room timelines", function() {
|
|||||||
expect(room.currentState.getMembers().length).toEqual(2);
|
expect(room.currentState.getMembers().length).toEqual(2);
|
||||||
expect(room.currentState.getMember(userId).name).toEqual(userName);
|
expect(room.currentState.getMember(userId).name).toEqual(userName);
|
||||||
expect(room.currentState.getMember(userId).membership).toEqual(
|
expect(room.currentState.getMember(userId).membership).toEqual(
|
||||||
"join"
|
"join",
|
||||||
);
|
);
|
||||||
expect(room.currentState.getMember(otherUserId).name).toEqual("Bob");
|
expect(room.currentState.getMember(otherUserId).name).toEqual("Bob");
|
||||||
expect(room.currentState.getMember(otherUserId).membership).toEqual(
|
expect(room.currentState.getMember(otherUserId).membership).toEqual(
|
||||||
"join"
|
"join",
|
||||||
);
|
);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
@@ -114,7 +114,7 @@ describe("MatrixClient syncing", function() {
|
|||||||
syncData.rooms.join[roomOne].state.events.push(
|
syncData.rooms.join[roomOne].state.events.push(
|
||||||
utils.mkMembership({
|
utils.mkMembership({
|
||||||
room: roomOne, mship: "invite", user: userC,
|
room: roomOne, mship: "invite", user: userC,
|
||||||
})
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
httpBackend.when("GET", "/sync").respond(200, syncData);
|
httpBackend.when("GET", "/sync").respond(200, syncData);
|
||||||
@@ -122,7 +122,7 @@ describe("MatrixClient syncing", function() {
|
|||||||
200, {
|
200, {
|
||||||
avatar_url: "mxc://flibble/wibble",
|
avatar_url: "mxc://flibble/wibble",
|
||||||
displayname: "The Boss",
|
displayname: "The Boss",
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
client.startClient({
|
client.startClient({
|
||||||
@@ -133,7 +133,7 @@ describe("MatrixClient syncing", function() {
|
|||||||
const member = client.getRoom(roomOne).getMember(userC);
|
const member = client.getRoom(roomOne).getMember(userC);
|
||||||
expect(member.name).toEqual("The Boss");
|
expect(member.name).toEqual("The Boss");
|
||||||
expect(
|
expect(
|
||||||
member.getAvatarUrl("home.server.url", null, null, null, false)
|
member.getAvatarUrl("home.server.url", null, null, null, false),
|
||||||
).toBeDefined();
|
).toBeDefined();
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
@@ -148,7 +148,7 @@ describe("MatrixClient syncing", function() {
|
|||||||
syncData.rooms.join[roomOne].state.events.push(
|
syncData.rooms.join[roomOne].state.events.push(
|
||||||
utils.mkMembership({
|
utils.mkMembership({
|
||||||
room: roomOne, mship: "invite", user: userC,
|
room: roomOne, mship: "invite", user: userC,
|
||||||
})
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
httpBackend.when("GET", "/sync").respond(200, syncData);
|
httpBackend.when("GET", "/sync").respond(200, syncData);
|
||||||
@@ -173,7 +173,7 @@ describe("MatrixClient syncing", function() {
|
|||||||
syncData.rooms.join[roomOne].state.events.push(
|
syncData.rooms.join[roomOne].state.events.push(
|
||||||
utils.mkMembership({
|
utils.mkMembership({
|
||||||
room: roomOne, mship: "invite", user: userC,
|
room: roomOne, mship: "invite", user: userC,
|
||||||
})
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
httpBackend.when("GET", "/sync").respond(200, syncData);
|
httpBackend.when("GET", "/sync").respond(200, syncData);
|
||||||
@@ -199,7 +199,7 @@ describe("MatrixClient syncing", function() {
|
|||||||
syncData.rooms.join[roomOne].state.events.push(
|
syncData.rooms.join[roomOne].state.events.push(
|
||||||
utils.mkMembership({
|
utils.mkMembership({
|
||||||
room: roomOne, mship: "invite", user: userC,
|
room: roomOne, mship: "invite", user: userC,
|
||||||
})
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
httpBackend.when("GET", "/sync").respond(200, syncData);
|
httpBackend.when("GET", "/sync").respond(200, syncData);
|
||||||
@@ -210,7 +210,7 @@ describe("MatrixClient syncing", function() {
|
|||||||
const member = client.getRoom(roomOne).getMember(userC);
|
const member = client.getRoom(roomOne).getMember(userC);
|
||||||
expect(member.name).toEqual(userC);
|
expect(member.name).toEqual(userC);
|
||||||
expect(
|
expect(
|
||||||
member.getAvatarUrl("home.server.url", null, null, null, false)
|
member.getAvatarUrl("home.server.url", null, null, null, false),
|
||||||
).toBeNull();
|
).toBeNull();
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
@@ -362,7 +362,7 @@ describe("MatrixClient syncing", function() {
|
|||||||
const room = client.getRoom(roomOne);
|
const room = client.getRoom(roomOne);
|
||||||
// should have clobbered the name to the one from /events
|
// should have clobbered the name to the one from /events
|
||||||
expect(room.name).toEqual(
|
expect(room.name).toEqual(
|
||||||
nextSyncData.rooms.join[roomOne].state.events[0].content.name
|
nextSyncData.rooms.join[roomOne].state.events[0].content.name,
|
||||||
);
|
);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
@@ -97,7 +97,10 @@ TestClient.prototype.start = function(existingDevices) {
|
|||||||
}};
|
}};
|
||||||
});
|
});
|
||||||
|
|
||||||
this.client.startClient();
|
this.client.startClient({
|
||||||
|
// set this so that we can get hold of failed events
|
||||||
|
pendingEventOrdering: 'detached',
|
||||||
|
});
|
||||||
|
|
||||||
return this.httpBackend.flush();
|
return this.httpBackend.flush();
|
||||||
};
|
};
|
||||||
@@ -143,7 +146,7 @@ function createOlmSession(olmAccount, recipientTestClient) {
|
|||||||
|
|
||||||
const session = new Olm.Session();
|
const session = new Olm.Session();
|
||||||
session.create_outbound(
|
session.create_outbound(
|
||||||
olmAccount, recipientTestClient.getDeviceKey(), otk.key
|
olmAccount, recipientTestClient.getDeviceKey(), otk.key,
|
||||||
);
|
);
|
||||||
return session;
|
return session;
|
||||||
}
|
}
|
||||||
@@ -287,7 +290,7 @@ function getSyncResponse(roomMembers) {
|
|||||||
testUtils.mkMembership({
|
testUtils.mkMembership({
|
||||||
mship: 'join',
|
mship: 'join',
|
||||||
sender: roomMembers[i],
|
sender: roomMembers[i],
|
||||||
})
|
}),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -384,7 +387,7 @@ describe("megolm", function() {
|
|||||||
testUtils.beforeEach(this); // eslint-disable-line no-invalid-this
|
testUtils.beforeEach(this); // eslint-disable-line no-invalid-this
|
||||||
|
|
||||||
aliceTestClient = new TestClient(
|
aliceTestClient = new TestClient(
|
||||||
"@alice:localhost", "xzcvb", "akjgkrgjs"
|
"@alice:localhost", "xzcvb", "akjgkrgjs",
|
||||||
);
|
);
|
||||||
|
|
||||||
testOlmAccount = new Olm.Account();
|
testOlmAccount = new Olm.Account();
|
||||||
@@ -533,13 +536,26 @@ describe("megolm", function() {
|
|||||||
aliceTestClient.httpBackend.when('GET', '/sync').respond(200, syncResponse);
|
aliceTestClient.httpBackend.when('GET', '/sync').respond(200, syncResponse);
|
||||||
return aliceTestClient.httpBackend.flush('/sync', 1);
|
return aliceTestClient.httpBackend.flush('/sync', 1);
|
||||||
}).then(function() {
|
}).then(function() {
|
||||||
let inboundGroupSession;
|
// start out with the device unknown - the send should be rejected.
|
||||||
aliceTestClient.httpBackend.when('POST', '/keys/query').respond(
|
aliceTestClient.httpBackend.when('POST', '/keys/query').respond(
|
||||||
200, getTestKeysQueryResponse('@bob:xyz')
|
200, getTestKeysQueryResponse('@bob:xyz'),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
return q.all([
|
||||||
|
aliceTestClient.client.sendTextMessage(ROOM_ID, 'test').then(() => {
|
||||||
|
throw new Error("sendTextMessage failed on an unknown device");
|
||||||
|
}, (e) => {
|
||||||
|
expect(e.name).toEqual("UnknownDeviceError");
|
||||||
|
}),
|
||||||
|
aliceTestClient.httpBackend.flush(),
|
||||||
|
]);
|
||||||
|
}).then(function() {
|
||||||
|
// mark the device as known, and resend.
|
||||||
|
aliceTestClient.client.setDeviceKnown('@bob:xyz', 'DEVICE_ID');
|
||||||
|
|
||||||
|
let inboundGroupSession;
|
||||||
aliceTestClient.httpBackend.when(
|
aliceTestClient.httpBackend.when(
|
||||||
'PUT', '/sendToDevice/m.room.encrypted/'
|
'PUT', '/sendToDevice/m.room.encrypted/',
|
||||||
).respond(200, function(path, content) {
|
).respond(200, function(path, content) {
|
||||||
const m = content.messages['@bob:xyz'].DEVICE_ID;
|
const m = content.messages['@bob:xyz'].DEVICE_ID;
|
||||||
const ct = m.ciphertext[testSenderKey];
|
const ct = m.ciphertext[testSenderKey];
|
||||||
@@ -552,7 +568,7 @@ describe("megolm", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
aliceTestClient.httpBackend.when(
|
aliceTestClient.httpBackend.when(
|
||||||
'PUT', '/send/'
|
'PUT', '/send/',
|
||||||
).respond(200, function(path, content) {
|
).respond(200, function(path, content) {
|
||||||
const ct = content.ciphertext;
|
const ct = content.ciphertext;
|
||||||
const r = inboundGroupSession.decrypt(ct);
|
const r = inboundGroupSession.decrypt(ct);
|
||||||
@@ -568,8 +584,11 @@ describe("megolm", function() {
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const room = aliceTestClient.client.getRoom(ROOM_ID);
|
||||||
|
const pendingMsg = room.getPendingEvents()[0];
|
||||||
|
|
||||||
return q.all([
|
return q.all([
|
||||||
aliceTestClient.client.sendTextMessage(ROOM_ID, 'test'),
|
aliceTestClient.client.resendEvent(pendingMsg, room),
|
||||||
aliceTestClient.httpBackend.flush(),
|
aliceTestClient.httpBackend.flush(),
|
||||||
]);
|
]);
|
||||||
}).nodeify(done);
|
}).nodeify(done);
|
||||||
@@ -598,7 +617,7 @@ describe("megolm", function() {
|
|||||||
console.log("Telling alice to send a megolm message");
|
console.log("Telling alice to send a megolm message");
|
||||||
|
|
||||||
aliceTestClient.httpBackend.when(
|
aliceTestClient.httpBackend.when(
|
||||||
'PUT', '/send/'
|
'PUT', '/send/',
|
||||||
).respond(200, {
|
).respond(200, {
|
||||||
event_id: '$event_id',
|
event_id: '$event_id',
|
||||||
});
|
});
|
||||||
@@ -632,7 +651,7 @@ describe("megolm", function() {
|
|||||||
console.log('Forcing alice to download our device keys');
|
console.log('Forcing alice to download our device keys');
|
||||||
|
|
||||||
aliceTestClient.httpBackend.when('POST', '/keys/query').respond(
|
aliceTestClient.httpBackend.when('POST', '/keys/query').respond(
|
||||||
200, getTestKeysQueryResponse('@bob:xyz')
|
200, getTestKeysQueryResponse('@bob:xyz'),
|
||||||
);
|
);
|
||||||
|
|
||||||
return q.all([
|
return q.all([
|
||||||
@@ -645,7 +664,7 @@ describe("megolm", function() {
|
|||||||
|
|
||||||
console.log('Telling alice to send a megolm message');
|
console.log('Telling alice to send a megolm message');
|
||||||
aliceTestClient.httpBackend.when(
|
aliceTestClient.httpBackend.when(
|
||||||
'PUT', '/send/'
|
'PUT', '/send/',
|
||||||
).respond(200, {
|
).respond(200, {
|
||||||
event_id: '$event_id',
|
event_id: '$event_id',
|
||||||
});
|
});
|
||||||
@@ -678,14 +697,23 @@ describe("megolm", function() {
|
|||||||
|
|
||||||
return aliceTestClient.httpBackend.flush('/sync', 1);
|
return aliceTestClient.httpBackend.flush('/sync', 1);
|
||||||
}).then(function() {
|
}).then(function() {
|
||||||
console.log('Telling alice to send a megolm message');
|
console.log("Fetching bob's devices and marking known");
|
||||||
|
|
||||||
aliceTestClient.httpBackend.when('POST', '/keys/query').respond(
|
aliceTestClient.httpBackend.when('POST', '/keys/query').respond(
|
||||||
200, getTestKeysQueryResponse('@bob:xyz')
|
200, getTestKeysQueryResponse('@bob:xyz'),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
return q.all([
|
||||||
|
aliceTestClient.client.downloadKeys(['@bob:xyz']),
|
||||||
|
aliceTestClient.httpBackend.flush(),
|
||||||
|
]).then((keys) => {
|
||||||
|
aliceTestClient.client.setDeviceKnown('@bob:xyz', 'DEVICE_ID');
|
||||||
|
});
|
||||||
|
}).then(function() {
|
||||||
|
console.log('Telling alice to send a megolm message');
|
||||||
|
|
||||||
aliceTestClient.httpBackend.when(
|
aliceTestClient.httpBackend.when(
|
||||||
'PUT', '/sendToDevice/m.room.encrypted/'
|
'PUT', '/sendToDevice/m.room.encrypted/',
|
||||||
).respond(200, function(path, content) {
|
).respond(200, function(path, content) {
|
||||||
console.log('sendToDevice: ', content);
|
console.log('sendToDevice: ', content);
|
||||||
const m = content.messages['@bob:xyz'].DEVICE_ID;
|
const m = content.messages['@bob:xyz'].DEVICE_ID;
|
||||||
@@ -699,7 +727,7 @@ describe("megolm", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
aliceTestClient.httpBackend.when(
|
aliceTestClient.httpBackend.when(
|
||||||
'PUT', '/send/'
|
'PUT', '/send/',
|
||||||
).respond(200, function(path, content) {
|
).respond(200, function(path, content) {
|
||||||
console.log('/send:', content);
|
console.log('/send:', content);
|
||||||
expect(content.session_id).toEqual(megolmSessionId);
|
expect(content.session_id).toEqual(megolmSessionId);
|
||||||
@@ -718,7 +746,7 @@ describe("megolm", function() {
|
|||||||
|
|
||||||
console.log('Telling alice to send another megolm message');
|
console.log('Telling alice to send another megolm message');
|
||||||
aliceTestClient.httpBackend.when(
|
aliceTestClient.httpBackend.when(
|
||||||
'PUT', '/send/'
|
'PUT', '/send/',
|
||||||
).respond(200, function(path, content) {
|
).respond(200, function(path, content) {
|
||||||
console.log('/send:', content);
|
console.log('/send:', content);
|
||||||
expect(content.session_id).not.toEqual(megolmSessionId);
|
expect(content.session_id).not.toEqual(megolmSessionId);
|
||||||
@@ -737,14 +765,14 @@ describe("megolm", function() {
|
|||||||
// https://github.com/vector-im/riot-web/issues/2676
|
// https://github.com/vector-im/riot-web/issues/2676
|
||||||
it("Alice should send to her other devices", function(done) {
|
it("Alice should send to her other devices", function(done) {
|
||||||
// for this test, we make the testOlmAccount be another of Alice's devices.
|
// for this test, we make the testOlmAccount be another of Alice's devices.
|
||||||
// it ought to get include in messages Alice sends.
|
// it ought to get included in messages Alice sends.
|
||||||
|
|
||||||
let p2pSession;
|
let p2pSession;
|
||||||
let inboundGroupSession;
|
let inboundGroupSession;
|
||||||
let decrypted;
|
let decrypted;
|
||||||
|
|
||||||
return aliceTestClient.start(
|
return aliceTestClient.start(
|
||||||
getTestKeysQueryResponse(aliceTestClient.userId)
|
getTestKeysQueryResponse(aliceTestClient.userId),
|
||||||
).then(function() {
|
).then(function() {
|
||||||
// an encrypted room with just alice
|
// an encrypted room with just alice
|
||||||
const syncResponse = {
|
const syncResponse = {
|
||||||
@@ -774,6 +802,7 @@ describe("megolm", function() {
|
|||||||
|
|
||||||
return aliceTestClient.httpBackend.flush();
|
return aliceTestClient.httpBackend.flush();
|
||||||
}).then(function() {
|
}).then(function() {
|
||||||
|
aliceTestClient.client.setDeviceKnown(aliceTestClient.userId, 'DEVICE_ID');
|
||||||
aliceTestClient.httpBackend.when('POST', '/keys/claim').respond(
|
aliceTestClient.httpBackend.when('POST', '/keys/claim').respond(
|
||||||
200, function(path, content) {
|
200, function(path, content) {
|
||||||
expect(content.one_time_keys[aliceTestClient.userId].DEVICE_ID)
|
expect(content.one_time_keys[aliceTestClient.userId].DEVICE_ID)
|
||||||
@@ -782,7 +811,7 @@ describe("megolm", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
aliceTestClient.httpBackend.when(
|
aliceTestClient.httpBackend.when(
|
||||||
'PUT', '/sendToDevice/m.room.encrypted/'
|
'PUT', '/sendToDevice/m.room.encrypted/',
|
||||||
).respond(200, function(path, content) {
|
).respond(200, function(path, content) {
|
||||||
console.log("sendToDevice: ", content);
|
console.log("sendToDevice: ", content);
|
||||||
const m = content.messages[aliceTestClient.userId].DEVICE_ID;
|
const m = content.messages[aliceTestClient.userId].DEVICE_ID;
|
||||||
@@ -800,7 +829,7 @@ describe("megolm", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
aliceTestClient.httpBackend.when(
|
aliceTestClient.httpBackend.when(
|
||||||
'PUT', '/send/'
|
'PUT', '/send/',
|
||||||
).respond(200, function(path, content) {
|
).respond(200, function(path, content) {
|
||||||
const ct = content.ciphertext;
|
const ct = content.ciphertext;
|
||||||
const r = inboundGroupSession.decrypt(ct);
|
const r = inboundGroupSession.decrypt(ct);
|
||||||
@@ -832,7 +861,7 @@ describe("megolm", function() {
|
|||||||
let sendPromise;
|
let sendPromise;
|
||||||
|
|
||||||
aliceTestClient.httpBackend.when(
|
aliceTestClient.httpBackend.when(
|
||||||
'PUT', '/sendToDevice/m.room.encrypted/'
|
'PUT', '/sendToDevice/m.room.encrypted/',
|
||||||
).respond(200, function(path, content) {
|
).respond(200, function(path, content) {
|
||||||
const m = content.messages['@bob:xyz'].DEVICE_ID;
|
const m = content.messages['@bob:xyz'].DEVICE_ID;
|
||||||
const ct = m.ciphertext[testSenderKey];
|
const ct = m.ciphertext[testSenderKey];
|
||||||
@@ -845,7 +874,7 @@ describe("megolm", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
aliceTestClient.httpBackend.when(
|
aliceTestClient.httpBackend.when(
|
||||||
'PUT', '/send/'
|
'PUT', '/send/',
|
||||||
).respond(200, function(path, content) {
|
).respond(200, function(path, content) {
|
||||||
const ct = content.ciphertext;
|
const ct = content.ciphertext;
|
||||||
const r = inboundGroupSession.decrypt(ct);
|
const r = inboundGroupSession.decrypt(ct);
|
||||||
@@ -882,12 +911,17 @@ describe("megolm", function() {
|
|||||||
|
|
||||||
// this will block
|
// this will block
|
||||||
downloadPromise = aliceTestClient.client.downloadKeys(['@bob:xyz']);
|
downloadPromise = aliceTestClient.client.downloadKeys(['@bob:xyz']);
|
||||||
}).then(function() {
|
|
||||||
// so will this.
|
// so will this.
|
||||||
sendPromise = aliceTestClient.client.sendTextMessage(ROOM_ID, 'test');
|
sendPromise = aliceTestClient.client.sendTextMessage(ROOM_ID, 'test')
|
||||||
}).then(function() {
|
.then(() => {
|
||||||
|
throw new Error("sendTextMessage failed on an unknown device");
|
||||||
|
}, (e) => {
|
||||||
|
expect(e.name).toEqual("UnknownDeviceError");
|
||||||
|
});
|
||||||
|
|
||||||
aliceTestClient.httpBackend.when('POST', '/keys/query').respond(
|
aliceTestClient.httpBackend.when('POST', '/keys/query').respond(
|
||||||
200, getTestKeysQueryResponse('@bob:xyz')
|
200, getTestKeysQueryResponse('@bob:xyz'),
|
||||||
);
|
);
|
||||||
|
|
||||||
return aliceTestClient.httpBackend.flush();
|
return aliceTestClient.httpBackend.flush();
|
||||||
@@ -902,7 +936,7 @@ describe("megolm", function() {
|
|||||||
|
|
||||||
return aliceTestClient.start().then(() => {
|
return aliceTestClient.start().then(() => {
|
||||||
const p2pSession = createOlmSession(
|
const p2pSession = createOlmSession(
|
||||||
testOlmAccount, aliceTestClient
|
testOlmAccount, aliceTestClient,
|
||||||
);
|
);
|
||||||
|
|
||||||
const groupSession = new Olm.OutboundGroupSession();
|
const groupSession = new Olm.OutboundGroupSession();
|
||||||
@@ -953,7 +987,7 @@ describe("megolm", function() {
|
|||||||
aliceTestClient.stop();
|
aliceTestClient.stop();
|
||||||
|
|
||||||
aliceTestClient = new TestClient(
|
aliceTestClient = new TestClient(
|
||||||
"@alice:localhost", "device2", "access_token2"
|
"@alice:localhost", "device2", "access_token2",
|
||||||
);
|
);
|
||||||
|
|
||||||
aliceTestClient.client.importRoomKeys(exported);
|
aliceTestClient.client.importRoomKeys(exported);
|
||||||
|
@@ -43,13 +43,13 @@ HttpBackend.prototype = {
|
|||||||
let flushed = 0;
|
let flushed = 0;
|
||||||
let triedWaiting = false;
|
let triedWaiting = false;
|
||||||
console.log(
|
console.log(
|
||||||
"HTTP backend flushing... (path=%s numToFlush=%s)", path, numToFlush
|
"HTTP backend flushing... (path=%s numToFlush=%s)", path, numToFlush,
|
||||||
);
|
);
|
||||||
const tryFlush = function() {
|
const tryFlush = function() {
|
||||||
// if there's more real requests and more expected requests, flush 'em.
|
// if there's more real requests and more expected requests, flush 'em.
|
||||||
console.log(
|
console.log(
|
||||||
" trying to flush queue => reqs=%s expected=%s [%s]",
|
" trying to flush queue => reqs=%s expected=%s [%s]",
|
||||||
self.requests.length, self.expectedRequests.length, path
|
self.requests.length, self.expectedRequests.length, path,
|
||||||
);
|
);
|
||||||
if (self._takeFromQueue(path)) {
|
if (self._takeFromQueue(path)) {
|
||||||
// try again on the next tick.
|
// try again on the next tick.
|
||||||
@@ -122,7 +122,7 @@ HttpBackend.prototype = {
|
|||||||
body = body(req.path, req.data);
|
body = body(req.path, req.data);
|
||||||
}
|
}
|
||||||
req.callback(
|
req.callback(
|
||||||
testResponse.err, testResponse.response, body
|
testResponse.err, testResponse.response, body,
|
||||||
);
|
);
|
||||||
matchingReq = null;
|
matchingReq = null;
|
||||||
}
|
}
|
||||||
@@ -140,7 +140,7 @@ HttpBackend.prototype = {
|
|||||||
const firstOutstandingReq = this.requests[0] || {};
|
const firstOutstandingReq = this.requests[0] || {};
|
||||||
expect(this.requests.length).toEqual(0,
|
expect(this.requests.length).toEqual(0,
|
||||||
"Expected no more HTTP requests but received request to " +
|
"Expected no more HTTP requests but received request to " +
|
||||||
firstOutstandingReq.path
|
firstOutstandingReq.path,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -150,7 +150,7 @@ HttpBackend.prototype = {
|
|||||||
verifyNoOutstandingExpectation: function() {
|
verifyNoOutstandingExpectation: function() {
|
||||||
const firstOutstandingExpectation = this.expectedRequests[0] || {};
|
const firstOutstandingExpectation = this.expectedRequests[0] || {};
|
||||||
expect(this.expectedRequests.length).toEqual(0,
|
expect(this.expectedRequests.length).toEqual(0,
|
||||||
"Expected to see HTTP request for " + firstOutstandingExpectation.path
|
"Expected to see HTTP request for " + firstOutstandingExpectation.path,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@@ -14,8 +14,8 @@ describe("ContentRepo", function() {
|
|||||||
const httpUrl = "http://example.com/image.jpeg";
|
const httpUrl = "http://example.com/image.jpeg";
|
||||||
expect(
|
expect(
|
||||||
ContentRepo.getHttpUriForMxc(
|
ContentRepo.getHttpUriForMxc(
|
||||||
baseUrl, httpUrl, undefined, undefined, undefined, true
|
baseUrl, httpUrl, undefined, undefined, undefined, true,
|
||||||
)
|
),
|
||||||
).toEqual(httpUrl);
|
).toEqual(httpUrl);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@ describe("ContentRepo", function() {
|
|||||||
function() {
|
function() {
|
||||||
const mxcUri = "mxc://server.name/resourceid";
|
const mxcUri = "mxc://server.name/resourceid";
|
||||||
expect(ContentRepo.getHttpUriForMxc(baseUrl, mxcUri)).toEqual(
|
expect(ContentRepo.getHttpUriForMxc(baseUrl, mxcUri)).toEqual(
|
||||||
baseUrl + "/_matrix/media/v1/download/server.name/resourceid"
|
baseUrl + "/_matrix/media/v1/download/server.name/resourceid",
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -41,7 +41,7 @@ describe("ContentRepo", function() {
|
|||||||
const mxcUri = "mxc://server.name/resourceid";
|
const mxcUri = "mxc://server.name/resourceid";
|
||||||
expect(ContentRepo.getHttpUriForMxc(baseUrl, mxcUri, 32, 64, "crop")).toEqual(
|
expect(ContentRepo.getHttpUriForMxc(baseUrl, mxcUri, 32, 64, "crop")).toEqual(
|
||||||
baseUrl + "/_matrix/media/v1/thumbnail/server.name/resourceid" +
|
baseUrl + "/_matrix/media/v1/thumbnail/server.name/resourceid" +
|
||||||
"?width=32&height=64&method=crop"
|
"?width=32&height=64&method=crop",
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -50,7 +50,7 @@ describe("ContentRepo", function() {
|
|||||||
const mxcUri = "mxc://server.name/resourceid#automade";
|
const mxcUri = "mxc://server.name/resourceid#automade";
|
||||||
expect(ContentRepo.getHttpUriForMxc(baseUrl, mxcUri, 32)).toEqual(
|
expect(ContentRepo.getHttpUriForMxc(baseUrl, mxcUri, 32)).toEqual(
|
||||||
baseUrl + "/_matrix/media/v1/thumbnail/server.name/resourceid" +
|
baseUrl + "/_matrix/media/v1/thumbnail/server.name/resourceid" +
|
||||||
"?width=32#automade"
|
"?width=32#automade",
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -58,7 +58,7 @@ describe("ContentRepo", function() {
|
|||||||
function() {
|
function() {
|
||||||
const mxcUri = "mxc://server.name/resourceid#automade";
|
const mxcUri = "mxc://server.name/resourceid#automade";
|
||||||
expect(ContentRepo.getHttpUriForMxc(baseUrl, mxcUri)).toEqual(
|
expect(ContentRepo.getHttpUriForMxc(baseUrl, mxcUri)).toEqual(
|
||||||
baseUrl + "/_matrix/media/v1/download/server.name/resourceid#automade"
|
baseUrl + "/_matrix/media/v1/download/server.name/resourceid#automade",
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -71,21 +71,21 @@ describe("ContentRepo", function() {
|
|||||||
it("should set w/h by default to 96", function() {
|
it("should set w/h by default to 96", function() {
|
||||||
expect(ContentRepo.getIdenticonUri(baseUrl, "foobar")).toEqual(
|
expect(ContentRepo.getIdenticonUri(baseUrl, "foobar")).toEqual(
|
||||||
baseUrl + "/_matrix/media/v1/identicon/foobar" +
|
baseUrl + "/_matrix/media/v1/identicon/foobar" +
|
||||||
"?width=96&height=96"
|
"?width=96&height=96",
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should be able to set custom w/h", function() {
|
it("should be able to set custom w/h", function() {
|
||||||
expect(ContentRepo.getIdenticonUri(baseUrl, "foobar", 32, 64)).toEqual(
|
expect(ContentRepo.getIdenticonUri(baseUrl, "foobar", 32, 64)).toEqual(
|
||||||
baseUrl + "/_matrix/media/v1/identicon/foobar" +
|
baseUrl + "/_matrix/media/v1/identicon/foobar" +
|
||||||
"?width=32&height=64"
|
"?width=32&height=64",
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should URL encode the identicon string", function() {
|
it("should URL encode the identicon string", function() {
|
||||||
expect(ContentRepo.getIdenticonUri(baseUrl, "foo#bar", 32, 64)).toEqual(
|
expect(ContentRepo.getIdenticonUri(baseUrl, "foo#bar", 32, 64)).toEqual(
|
||||||
baseUrl + "/_matrix/media/v1/identicon/foo%23bar" +
|
baseUrl + "/_matrix/media/v1/identicon/foo%23bar" +
|
||||||
"?width=32&height=64"
|
"?width=32&height=64",
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@@ -52,10 +52,10 @@ describe("EventTimeline", function() {
|
|||||||
];
|
];
|
||||||
timeline.initialiseState(events);
|
timeline.initialiseState(events);
|
||||||
expect(timeline._startState.setStateEvents).toHaveBeenCalledWith(
|
expect(timeline._startState.setStateEvents).toHaveBeenCalledWith(
|
||||||
events
|
events,
|
||||||
);
|
);
|
||||||
expect(timeline._endState.setStateEvents).toHaveBeenCalledWith(
|
expect(timeline._endState.setStateEvents).toHaveBeenCalledWith(
|
||||||
events
|
events,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -75,7 +75,7 @@ describe("MatrixClient", function() {
|
|||||||
expect(false).toBe(
|
expect(false).toBe(
|
||||||
true, ">1 pending request. You should probably handle them. " +
|
true, ">1 pending request. You should probably handle them. " +
|
||||||
"PENDING: " + JSON.stringify(pendingLookup) + " JUST GOT: " +
|
"PENDING: " + JSON.stringify(pendingLookup) + " JUST GOT: " +
|
||||||
method + " " + path
|
method + " " + path,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
pendingLookup = {
|
pendingLookup = {
|
||||||
@@ -88,7 +88,7 @@ describe("MatrixClient", function() {
|
|||||||
if (next.path === path && next.method === method) {
|
if (next.path === path && next.method === method) {
|
||||||
console.log(
|
console.log(
|
||||||
"MatrixClient[UT] Matched. Returning " +
|
"MatrixClient[UT] Matched. Returning " +
|
||||||
(next.error ? "BAD" : "GOOD") + " response"
|
(next.error ? "BAD" : "GOOD") + " response",
|
||||||
);
|
);
|
||||||
if (next.expectBody) {
|
if (next.expectBody) {
|
||||||
expect(next.expectBody).toEqual(data);
|
expect(next.expectBody).toEqual(data);
|
||||||
@@ -290,7 +290,7 @@ describe("MatrixClient", function() {
|
|||||||
if (state === "ERROR" && httpLookups.length > 0) {
|
if (state === "ERROR" && httpLookups.length > 0) {
|
||||||
expect(httpLookups.length).toEqual(1);
|
expect(httpLookups.length).toEqual(1);
|
||||||
expect(client.retryImmediately()).toBe(
|
expect(client.retryImmediately()).toBe(
|
||||||
true, "retryImmediately returned false"
|
true, "retryImmediately returned false",
|
||||||
);
|
);
|
||||||
jasmine.Clock.tick(1);
|
jasmine.Clock.tick(1);
|
||||||
} else if (state === "RECONNECTING" && httpLookups.length > 0) {
|
} else if (state === "RECONNECTING" && httpLookups.length > 0) {
|
||||||
@@ -334,7 +334,7 @@ describe("MatrixClient", function() {
|
|||||||
return function syncListener(state, old) {
|
return function syncListener(state, old) {
|
||||||
const expected = expectedStates.shift();
|
const expected = expectedStates.shift();
|
||||||
console.log(
|
console.log(
|
||||||
"'sync' curr=%s old=%s EXPECT=%s", state, old, expected
|
"'sync' curr=%s old=%s EXPECT=%s", state, old, expected,
|
||||||
);
|
);
|
||||||
if (!expected) {
|
if (!expected) {
|
||||||
done();
|
done();
|
||||||
|
@@ -210,10 +210,10 @@ describe("RoomState", function() {
|
|||||||
state.setStateEvents([powerLevelEvent]);
|
state.setStateEvents([powerLevelEvent]);
|
||||||
|
|
||||||
expect(state.members[userA].setPowerLevelEvent).toHaveBeenCalledWith(
|
expect(state.members[userA].setPowerLevelEvent).toHaveBeenCalledWith(
|
||||||
powerLevelEvent
|
powerLevelEvent,
|
||||||
);
|
);
|
||||||
expect(state.members[userB].setPowerLevelEvent).toHaveBeenCalledWith(
|
expect(state.members[userB].setPowerLevelEvent).toHaveBeenCalledWith(
|
||||||
powerLevelEvent
|
powerLevelEvent,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -254,7 +254,7 @@ describe("RoomState", function() {
|
|||||||
|
|
||||||
expect(state.members[userA].setMembershipEvent).not.toHaveBeenCalled();
|
expect(state.members[userA].setMembershipEvent).not.toHaveBeenCalled();
|
||||||
expect(state.members[userB].setMembershipEvent).toHaveBeenCalledWith(
|
expect(state.members[userB].setMembershipEvent).toHaveBeenCalledWith(
|
||||||
memberEvent, state
|
memberEvent, state,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -272,10 +272,10 @@ describe("RoomState", function() {
|
|||||||
state.setTypingEvent(typingEvent);
|
state.setTypingEvent(typingEvent);
|
||||||
|
|
||||||
expect(state.members[userA].setTypingEvent).toHaveBeenCalledWith(
|
expect(state.members[userA].setTypingEvent).toHaveBeenCalledWith(
|
||||||
typingEvent
|
typingEvent,
|
||||||
);
|
);
|
||||||
expect(state.members[userB].setTypingEvent).toHaveBeenCalledWith(
|
expect(state.members[userB].setTypingEvent).toHaveBeenCalledWith(
|
||||||
typingEvent
|
typingEvent,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -284,7 +284,7 @@ describe("RoomState", function() {
|
|||||||
it("should say non-joined members may not send state",
|
it("should say non-joined members may not send state",
|
||||||
function() {
|
function() {
|
||||||
expect(state.maySendStateEvent(
|
expect(state.maySendStateEvent(
|
||||||
'm.room.name', "@nobody:nowhere"
|
'm.room.name', "@nobody:nowhere",
|
||||||
)).toEqual(false);
|
)).toEqual(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -367,7 +367,7 @@ describe("RoomState", function() {
|
|||||||
it("should say non-joined members may not send events",
|
it("should say non-joined members may not send events",
|
||||||
function() {
|
function() {
|
||||||
expect(state.maySendEvent(
|
expect(state.maySendEvent(
|
||||||
'm.room.message', "@nobody:nowhere"
|
'm.room.message', "@nobody:nowhere",
|
||||||
)).toEqual(false);
|
)).toEqual(false);
|
||||||
expect(state.maySendMessage("@nobody:nowhere")).toEqual(false);
|
expect(state.maySendMessage("@nobody:nowhere")).toEqual(false);
|
||||||
});
|
});
|
||||||
|
@@ -163,10 +163,10 @@ describe("Room", function() {
|
|||||||
];
|
];
|
||||||
room.addLiveEvents(events);
|
room.addLiveEvents(events);
|
||||||
expect(room.currentState.setStateEvents).toHaveBeenCalledWith(
|
expect(room.currentState.setStateEvents).toHaveBeenCalledWith(
|
||||||
[events[0]]
|
[events[0]],
|
||||||
);
|
);
|
||||||
expect(room.currentState.setStateEvents).toHaveBeenCalledWith(
|
expect(room.currentState.setStateEvents).toHaveBeenCalledWith(
|
||||||
[events[1]]
|
[events[1]],
|
||||||
);
|
);
|
||||||
expect(events[0].forwardLooking).toBe(true);
|
expect(events[0].forwardLooking).toBe(true);
|
||||||
expect(events[1].forwardLooking).toBe(true);
|
expect(events[1].forwardLooking).toBe(true);
|
||||||
@@ -222,7 +222,7 @@ describe("Room", function() {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
callCount += 1;
|
callCount += 1;
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
// first add the local echo
|
// first add the local echo
|
||||||
@@ -368,10 +368,10 @@ describe("Room", function() {
|
|||||||
|
|
||||||
room.addEventsToTimeline(events, true, room.getLiveTimeline());
|
room.addEventsToTimeline(events, true, room.getLiveTimeline());
|
||||||
expect(room.oldState.setStateEvents).toHaveBeenCalledWith(
|
expect(room.oldState.setStateEvents).toHaveBeenCalledWith(
|
||||||
[events[0]]
|
[events[0]],
|
||||||
);
|
);
|
||||||
expect(room.oldState.setStateEvents).toHaveBeenCalledWith(
|
expect(room.oldState.setStateEvents).toHaveBeenCalledWith(
|
||||||
[events[1]]
|
[events[1]],
|
||||||
);
|
);
|
||||||
expect(events[0].forwardLooking).toBe(false);
|
expect(events[0].forwardLooking).toBe(false);
|
||||||
expect(events[1].forwardLooking).toBe(false);
|
expect(events[1].forwardLooking).toBe(false);
|
||||||
@@ -680,7 +680,7 @@ describe("Room", function() {
|
|||||||
});
|
});
|
||||||
room.currentState.getMember.andCallFake(function(userId) {
|
room.currentState.getMember.andCallFake(function(userId) {
|
||||||
const memberEvent = room.currentState.getStateEvents(
|
const memberEvent = room.currentState.getStateEvents(
|
||||||
"m.room.member", userId
|
"m.room.member", userId,
|
||||||
);
|
);
|
||||||
return {
|
return {
|
||||||
name: memberEvent.event.content &&
|
name: memberEvent.event.content &&
|
||||||
@@ -1003,7 +1003,7 @@ describe("Room", function() {
|
|||||||
mkRecord(eventToAck.getId(), "m.read", userD, ts),
|
mkRecord(eventToAck.getId(), "m.read", userD, ts),
|
||||||
]));
|
]));
|
||||||
expect(room.getUsersReadUpTo(eventToAck)).toEqual(
|
expect(room.getUsersReadUpTo(eventToAck)).toEqual(
|
||||||
[userB, userC, userD]
|
[userB, userC, userD],
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1164,10 +1164,10 @@ describe("Room", function() {
|
|||||||
room.addPendingEvent(eventB, "TXN1");
|
room.addPendingEvent(eventB, "TXN1");
|
||||||
room.addLiveEvents([eventC]);
|
room.addLiveEvents([eventC]);
|
||||||
expect(room.timeline).toEqual(
|
expect(room.timeline).toEqual(
|
||||||
[eventA, eventC]
|
[eventA, eventC],
|
||||||
);
|
);
|
||||||
expect(room.getPendingEvents()).toEqual(
|
expect(room.getPendingEvents()).toEqual(
|
||||||
[eventB]
|
[eventB],
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1190,7 +1190,7 @@ describe("Room", function() {
|
|||||||
room.addPendingEvent(eventB, "TXN1");
|
room.addPendingEvent(eventB, "TXN1");
|
||||||
room.addLiveEvents([eventC]);
|
room.addLiveEvents([eventC]);
|
||||||
expect(room.timeline).toEqual(
|
expect(room.timeline).toEqual(
|
||||||
[eventA, eventB, eventC]
|
[eventA, eventB, eventC],
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -1208,7 +1208,7 @@ describe("Room", function() {
|
|||||||
|
|
||||||
room.addPendingEvent(eventA, "TXN1");
|
room.addPendingEvent(eventA, "TXN1");
|
||||||
expect(room.getPendingEvents()).toEqual(
|
expect(room.getPendingEvents()).toEqual(
|
||||||
[eventA]
|
[eventA],
|
||||||
);
|
);
|
||||||
|
|
||||||
// the event has to have been failed or queued before it can be
|
// the event has to have been failed or queued before it can be
|
||||||
@@ -1242,7 +1242,7 @@ describe("Room", function() {
|
|||||||
|
|
||||||
room.addPendingEvent(eventA, "TXN1");
|
room.addPendingEvent(eventA, "TXN1");
|
||||||
expect(room.getLiveTimeline().getEvents()).toEqual(
|
expect(room.getLiveTimeline().getEvents()).toEqual(
|
||||||
[eventA]
|
[eventA],
|
||||||
);
|
);
|
||||||
|
|
||||||
// the event has to have been failed or queued before it can be
|
// the event has to have been failed or queued before it can be
|
||||||
|
@@ -234,7 +234,7 @@ describe("MatrixScheduler", function() {
|
|||||||
expect(queue).toEqual([eventA, eventB]);
|
expect(queue).toEqual([eventA, eventB]);
|
||||||
// modify the queue
|
// modify the queue
|
||||||
const eventC = utils.mkMessage(
|
const eventC = utils.mkMessage(
|
||||||
{user: "@a:bar", room: roomId, event: true}
|
{user: "@a:bar", room: roomId, event: true},
|
||||||
);
|
);
|
||||||
queue.push(eventC);
|
queue.push(eventC);
|
||||||
const queueAgain = scheduler.getQueueForEvent(eventA);
|
const queueAgain = scheduler.getQueueForEvent(eventA);
|
||||||
@@ -313,7 +313,7 @@ describe("MatrixScheduler", function() {
|
|||||||
expect(MatrixScheduler.QUEUE_MESSAGES(
|
expect(MatrixScheduler.QUEUE_MESSAGES(
|
||||||
utils.mkMembership({
|
utils.mkMembership({
|
||||||
user: "@alice:bar", room: roomId, mship: "join", event: true,
|
user: "@alice:bar", room: roomId, mship: "join", event: true,
|
||||||
})
|
}),
|
||||||
)).toEqual(null);
|
)).toEqual(null);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -323,30 +323,30 @@ describe("MatrixScheduler", function() {
|
|||||||
const res = MatrixScheduler.RETRY_BACKOFF_RATELIMIT(
|
const res = MatrixScheduler.RETRY_BACKOFF_RATELIMIT(
|
||||||
eventA, 1, new MatrixError({
|
eventA, 1, new MatrixError({
|
||||||
errcode: "M_LIMIT_EXCEEDED", retry_after_ms: 5000,
|
errcode: "M_LIMIT_EXCEEDED", retry_after_ms: 5000,
|
||||||
})
|
}),
|
||||||
);
|
);
|
||||||
expect(res >= 500).toBe(true, "Didn't wait long enough.");
|
expect(res >= 500).toBe(true, "Didn't wait long enough.");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should give up after 5 attempts", function() {
|
it("should give up after 5 attempts", function() {
|
||||||
const res = MatrixScheduler.RETRY_BACKOFF_RATELIMIT(
|
const res = MatrixScheduler.RETRY_BACKOFF_RATELIMIT(
|
||||||
eventA, 5, {}
|
eventA, 5, {},
|
||||||
);
|
);
|
||||||
expect(res).toBe(-1, "Didn't give up.");
|
expect(res).toBe(-1, "Didn't give up.");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should do exponential backoff", function() {
|
it("should do exponential backoff", function() {
|
||||||
expect(MatrixScheduler.RETRY_BACKOFF_RATELIMIT(
|
expect(MatrixScheduler.RETRY_BACKOFF_RATELIMIT(
|
||||||
eventA, 1, {}
|
eventA, 1, {},
|
||||||
)).toEqual(2000);
|
)).toEqual(2000);
|
||||||
expect(MatrixScheduler.RETRY_BACKOFF_RATELIMIT(
|
expect(MatrixScheduler.RETRY_BACKOFF_RATELIMIT(
|
||||||
eventA, 2, {}
|
eventA, 2, {},
|
||||||
)).toEqual(4000);
|
)).toEqual(4000);
|
||||||
expect(MatrixScheduler.RETRY_BACKOFF_RATELIMIT(
|
expect(MatrixScheduler.RETRY_BACKOFF_RATELIMIT(
|
||||||
eventA, 3, {}
|
eventA, 3, {},
|
||||||
)).toEqual(8000);
|
)).toEqual(8000);
|
||||||
expect(MatrixScheduler.RETRY_BACKOFF_RATELIMIT(
|
expect(MatrixScheduler.RETRY_BACKOFF_RATELIMIT(
|
||||||
eventA, 4, {}
|
eventA, 4, {},
|
||||||
)).toEqual(16000);
|
)).toEqual(16000);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@@ -46,7 +46,7 @@ function addEventsToTimeline(timeline, numEvents, atStart) {
|
|||||||
utils.mkMessage({
|
utils.mkMessage({
|
||||||
room: ROOM_ID, user: USER_ID,
|
room: ROOM_ID, user: USER_ID,
|
||||||
event: true,
|
event: true,
|
||||||
}), atStart
|
}), atStart,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -14,7 +14,7 @@ describe("utils", function() {
|
|||||||
baz: "beer@",
|
baz: "beer@",
|
||||||
};
|
};
|
||||||
expect(utils.encodeParams(params)).toEqual(
|
expect(utils.encodeParams(params)).toEqual(
|
||||||
"foo=bar&baz=beer%40"
|
"foo=bar&baz=beer%40",
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -27,7 +27,7 @@ describe("utils", function() {
|
|||||||
"%here": "beer@",
|
"%here": "beer@",
|
||||||
};
|
};
|
||||||
expect(utils.encodeUri(path, vals)).toEqual(
|
expect(utils.encodeUri(path, vals)).toEqual(
|
||||||
"foo/bar/baz/beer%40"
|
"foo/bar/baz/beer%40",
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@@ -133,7 +133,7 @@ MatrixBaseApis.prototype.makeTxnId = function() {
|
|||||||
MatrixBaseApis.prototype.register = function(
|
MatrixBaseApis.prototype.register = function(
|
||||||
username, password,
|
username, password,
|
||||||
sessionId, auth, bindEmail, guestAccessToken,
|
sessionId, auth, bindEmail, guestAccessToken,
|
||||||
callback
|
callback,
|
||||||
) {
|
) {
|
||||||
if (auth === undefined) {
|
if (auth === undefined) {
|
||||||
auth = {};
|
auth = {};
|
||||||
@@ -189,7 +189,7 @@ MatrixBaseApis.prototype.registerRequest = function(data, kind, callback) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return this._http.request(
|
return this._http.request(
|
||||||
callback, "POST", "/register", params, data
|
callback, "POST", "/register", params, data,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -218,7 +218,7 @@ MatrixBaseApis.prototype.login = function(loginType, data, callback) {
|
|||||||
utils.extend(login_data, data);
|
utils.extend(login_data, data);
|
||||||
|
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "POST", "/login", undefined, login_data
|
callback, "POST", "/login", undefined, login_data,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -283,7 +283,7 @@ MatrixBaseApis.prototype.loginWithToken = function(token, callback) {
|
|||||||
*/
|
*/
|
||||||
MatrixBaseApis.prototype.logout = function(callback) {
|
MatrixBaseApis.prototype.logout = function(callback) {
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "POST", '/logout'
|
callback, "POST", '/logout',
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -305,7 +305,7 @@ MatrixBaseApis.prototype.deactivateAccount = function(auth, callback) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
return this._http.authedRequestWithPrefix(
|
return this._http.authedRequestWithPrefix(
|
||||||
callback, "POST", '/account/deactivate', undefined, body, httpApi.PREFIX_UNSTABLE
|
callback, "POST", '/account/deactivate', undefined, body, httpApi.PREFIX_UNSTABLE,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -347,7 +347,7 @@ MatrixBaseApis.prototype.getFallbackAuthUrl = function(loginType, authSessionId)
|
|||||||
MatrixBaseApis.prototype.createRoom = function(options, callback) {
|
MatrixBaseApis.prototype.createRoom = function(options, callback) {
|
||||||
// valid options include: room_alias_name, visibility, invite
|
// valid options include: room_alias_name, visibility, invite
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "POST", "/createRoom", undefined, options
|
callback, "POST", "/createRoom", undefined, options,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -382,7 +382,7 @@ MatrixBaseApis.prototype.getStateEvent = function(roomId, eventType, stateKey, c
|
|||||||
path = utils.encodeUri(path + "/$stateKey", pathParams);
|
path = utils.encodeUri(path + "/$stateKey", pathParams);
|
||||||
}
|
}
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "GET", path
|
callback, "GET", path,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -407,7 +407,7 @@ MatrixBaseApis.prototype.sendStateEvent = function(roomId, eventType, content, s
|
|||||||
path = utils.encodeUri(path + "/$stateKey", pathParams);
|
path = utils.encodeUri(path + "/$stateKey", pathParams);
|
||||||
}
|
}
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "PUT", path, undefined, content
|
callback, "PUT", path, undefined, content,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -438,13 +438,13 @@ MatrixBaseApis.prototype.roomInitialSync = function(roomId, limit, callback) {
|
|||||||
callback = limit; limit = undefined;
|
callback = limit; limit = undefined;
|
||||||
}
|
}
|
||||||
const path = utils.encodeUri("/rooms/$roomId/initialSync",
|
const path = utils.encodeUri("/rooms/$roomId/initialSync",
|
||||||
{$roomId: roomId}
|
{$roomId: roomId},
|
||||||
);
|
);
|
||||||
if (!limit) {
|
if (!limit) {
|
||||||
limit = 30;
|
limit = 30;
|
||||||
}
|
}
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "GET", path, { limit: limit }
|
callback, "GET", path, { limit: limit },
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -484,7 +484,7 @@ MatrixBaseApis.prototype.publicRooms = function(options, callback) {
|
|||||||
return this._http.authedRequest(callback, "GET", "/publicRooms");
|
return this._http.authedRequest(callback, "GET", "/publicRooms");
|
||||||
} else {
|
} else {
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "POST", "/publicRooms", query_params, options
|
callback, "POST", "/publicRooms", query_params, options,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -505,7 +505,7 @@ MatrixBaseApis.prototype.createAlias = function(alias, roomId, callback) {
|
|||||||
room_id: roomId,
|
room_id: roomId,
|
||||||
};
|
};
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "PUT", path, undefined, data
|
callback, "PUT", path, undefined, data,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -522,7 +522,7 @@ MatrixBaseApis.prototype.deleteAlias = function(alias, callback) {
|
|||||||
$alias: alias,
|
$alias: alias,
|
||||||
});
|
});
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "DELETE", path, undefined, undefined
|
callback, "DELETE", path, undefined, undefined,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -539,7 +539,7 @@ MatrixBaseApis.prototype.getRoomIdForAlias = function(alias, callback) {
|
|||||||
$alias: alias,
|
$alias: alias,
|
||||||
});
|
});
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "GET", path
|
callback, "GET", path,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -586,7 +586,7 @@ MatrixBaseApis.prototype.setRoomDirectoryVisibility =
|
|||||||
$roomId: roomId,
|
$roomId: roomId,
|
||||||
});
|
});
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "PUT", path, undefined, { "visibility": visibility }
|
callback, "PUT", path, undefined, { "visibility": visibility },
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -610,7 +610,7 @@ MatrixBaseApis.prototype.setRoomDirectoryVisibilityAppService =
|
|||||||
$roomId: roomId,
|
$roomId: roomId,
|
||||||
});
|
});
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "PUT", path, undefined, { "visibility": visibility }
|
callback, "PUT", path, undefined, { "visibility": visibility },
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -712,7 +712,7 @@ MatrixBaseApis.prototype.getProfileInfo = function(userId, info, callback) {
|
|||||||
MatrixBaseApis.prototype.getThreePids = function(callback) {
|
MatrixBaseApis.prototype.getThreePids = function(callback) {
|
||||||
const path = "/account/3pid";
|
const path = "/account/3pid";
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "GET", path, undefined, undefined
|
callback, "GET", path, undefined, undefined,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -730,7 +730,7 @@ MatrixBaseApis.prototype.addThreePid = function(creds, bind, callback) {
|
|||||||
'bind': bind,
|
'bind': bind,
|
||||||
};
|
};
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "POST", path, null, data
|
callback, "POST", path, null, data,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -749,7 +749,7 @@ MatrixBaseApis.prototype.deleteThreePid = function(medium, address) {
|
|||||||
'address': address,
|
'address': address,
|
||||||
};
|
};
|
||||||
return this._http.authedRequestWithPrefix(
|
return this._http.authedRequestWithPrefix(
|
||||||
undefined, "POST", path, null, data, httpApi.PREFIX_UNSTABLE
|
undefined, "POST", path, null, data, httpApi.PREFIX_UNSTABLE,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -769,7 +769,7 @@ MatrixBaseApis.prototype.setPassword = function(authDict, newPassword, callback)
|
|||||||
};
|
};
|
||||||
|
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "POST", path, null, data
|
callback, "POST", path, null, data,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -786,7 +786,7 @@ MatrixBaseApis.prototype.getDevices = function() {
|
|||||||
const path = "/devices";
|
const path = "/devices";
|
||||||
return this._http.authedRequestWithPrefix(
|
return this._http.authedRequestWithPrefix(
|
||||||
undefined, "GET", path, undefined, undefined,
|
undefined, "GET", path, undefined, undefined,
|
||||||
httpApi.PREFIX_UNSTABLE
|
httpApi.PREFIX_UNSTABLE,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -806,7 +806,7 @@ MatrixBaseApis.prototype.setDeviceDetails = function(device_id, body) {
|
|||||||
|
|
||||||
return this._http.authedRequestWithPrefix(
|
return this._http.authedRequestWithPrefix(
|
||||||
undefined, "PUT", path, undefined, body,
|
undefined, "PUT", path, undefined, body,
|
||||||
httpApi.PREFIX_UNSTABLE
|
httpApi.PREFIX_UNSTABLE,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -831,7 +831,7 @@ MatrixBaseApis.prototype.deleteDevice = function(device_id, auth) {
|
|||||||
|
|
||||||
return this._http.authedRequestWithPrefix(
|
return this._http.authedRequestWithPrefix(
|
||||||
undefined, "DELETE", path, undefined, body,
|
undefined, "DELETE", path, undefined, body,
|
||||||
httpApi.PREFIX_UNSTABLE
|
httpApi.PREFIX_UNSTABLE,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -849,7 +849,7 @@ MatrixBaseApis.prototype.deleteDevice = function(device_id, auth) {
|
|||||||
MatrixBaseApis.prototype.getPushers = function(callback) {
|
MatrixBaseApis.prototype.getPushers = function(callback) {
|
||||||
const path = "/pushers";
|
const path = "/pushers";
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "GET", path, undefined, undefined
|
callback, "GET", path, undefined, undefined,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -864,7 +864,7 @@ MatrixBaseApis.prototype.getPushers = function(callback) {
|
|||||||
MatrixBaseApis.prototype.setPusher = function(pusher, callback) {
|
MatrixBaseApis.prototype.setPusher = function(pusher, callback) {
|
||||||
const path = "/pushers/set";
|
const path = "/pushers/set";
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "POST", path, null, pusher
|
callback, "POST", path, null, pusher,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -893,7 +893,7 @@ MatrixBaseApis.prototype.addPushRule = function(scope, kind, ruleId, body, callb
|
|||||||
$ruleId: ruleId,
|
$ruleId: ruleId,
|
||||||
});
|
});
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "PUT", path, undefined, body
|
callback, "PUT", path, undefined, body,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -931,7 +931,7 @@ MatrixBaseApis.prototype.setPushRuleEnabled = function(scope, kind,
|
|||||||
$ruleId: ruleId,
|
$ruleId: ruleId,
|
||||||
});
|
});
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "PUT", path, undefined, {"enabled": enabled}
|
callback, "PUT", path, undefined, {"enabled": enabled},
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -952,7 +952,7 @@ MatrixBaseApis.prototype.setPushRuleActions = function(scope, kind,
|
|||||||
$ruleId: ruleId,
|
$ruleId: ruleId,
|
||||||
});
|
});
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "PUT", path, undefined, {"actions": actions}
|
callback, "PUT", path, undefined, {"actions": actions},
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -975,7 +975,7 @@ MatrixBaseApis.prototype.search = function(opts, callback) {
|
|||||||
queryparams.next_batch = opts.next_batch;
|
queryparams.next_batch = opts.next_batch;
|
||||||
}
|
}
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "POST", "/search", queryparams, opts.body
|
callback, "POST", "/search", queryparams, opts.body,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1009,7 +1009,7 @@ MatrixBaseApis.prototype.uploadKeysRequest = function(content, opts, callback) {
|
|||||||
path = "/keys/upload";
|
path = "/keys/upload";
|
||||||
}
|
}
|
||||||
return this._http.authedRequestWithPrefix(
|
return this._http.authedRequestWithPrefix(
|
||||||
callback, "POST", path, undefined, content, httpApi.PREFIX_UNSTABLE
|
callback, "POST", path, undefined, content, httpApi.PREFIX_UNSTABLE,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1032,7 +1032,7 @@ MatrixBaseApis.prototype.downloadKeysForUsers = function(userIds, callback) {
|
|||||||
const content = {device_keys: downloadQuery};
|
const content = {device_keys: downloadQuery};
|
||||||
return this._http.authedRequestWithPrefix(
|
return this._http.authedRequestWithPrefix(
|
||||||
callback, "POST", "/keys/query", undefined, content,
|
callback, "POST", "/keys/query", undefined, content,
|
||||||
httpApi.PREFIX_UNSTABLE
|
httpApi.PREFIX_UNSTABLE,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1063,7 +1063,7 @@ MatrixBaseApis.prototype.claimOneTimeKeys = function(devices, key_algorithm) {
|
|||||||
const content = {one_time_keys: queries};
|
const content = {one_time_keys: queries};
|
||||||
return this._http.authedRequestWithPrefix(
|
return this._http.authedRequestWithPrefix(
|
||||||
undefined, "POST", "/keys/claim", undefined, content,
|
undefined, "POST", "/keys/claim", undefined, content,
|
||||||
httpApi.PREFIX_UNSTABLE
|
httpApi.PREFIX_UNSTABLE,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1101,7 +1101,7 @@ MatrixBaseApis.prototype.requestEmailToken = function(email, clientSecret,
|
|||||||
};
|
};
|
||||||
return this._http.idServerRequest(
|
return this._http.idServerRequest(
|
||||||
callback, "POST", "/validate/email/requestToken",
|
callback, "POST", "/validate/email/requestToken",
|
||||||
params, httpApi.PREFIX_IDENTITY_V1
|
params, httpApi.PREFIX_IDENTITY_V1,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1123,7 +1123,7 @@ MatrixBaseApis.prototype.lookupThreePid = function(medium, address, callback) {
|
|||||||
};
|
};
|
||||||
return this._http.idServerRequest(
|
return this._http.idServerRequest(
|
||||||
callback, "GET", "/lookup",
|
callback, "GET", "/lookup",
|
||||||
params, httpApi.PREFIX_IDENTITY_V1
|
params, httpApi.PREFIX_IDENTITY_V1,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1142,7 +1142,7 @@ MatrixBaseApis.prototype.lookupThreePid = function(medium, address, callback) {
|
|||||||
* @return {module:client.Promise} Resolves to the result object
|
* @return {module:client.Promise} Resolves to the result object
|
||||||
*/
|
*/
|
||||||
MatrixBaseApis.prototype.sendToDevice = function(
|
MatrixBaseApis.prototype.sendToDevice = function(
|
||||||
eventType, contentMap, txnId
|
eventType, contentMap, txnId,
|
||||||
) {
|
) {
|
||||||
const path = utils.encodeUri("/sendToDevice/$eventType/$txnId", {
|
const path = utils.encodeUri("/sendToDevice/$eventType/$txnId", {
|
||||||
$eventType: eventType,
|
$eventType: eventType,
|
||||||
@@ -1155,7 +1155,7 @@ MatrixBaseApis.prototype.sendToDevice = function(
|
|||||||
|
|
||||||
return this._http.authedRequestWithPrefix(
|
return this._http.authedRequestWithPrefix(
|
||||||
undefined, "PUT", path, undefined, body,
|
undefined, "PUT", path, undefined, body,
|
||||||
httpApi.PREFIX_UNSTABLE
|
httpApi.PREFIX_UNSTABLE,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1170,7 +1170,7 @@ MatrixBaseApis.prototype.sendToDevice = function(
|
|||||||
MatrixBaseApis.prototype.getThirdpartyProtocols = function() {
|
MatrixBaseApis.prototype.getThirdpartyProtocols = function() {
|
||||||
return this._http.authedRequestWithPrefix(
|
return this._http.authedRequestWithPrefix(
|
||||||
undefined, "GET", "/thirdparty/protocols", undefined, undefined,
|
undefined, "GET", "/thirdparty/protocols", undefined, undefined,
|
||||||
httpApi.PREFIX_UNSTABLE
|
httpApi.PREFIX_UNSTABLE,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1189,7 +1189,7 @@ MatrixBaseApis.prototype.getThirdpartyLocation = function(protocol, params) {
|
|||||||
|
|
||||||
return this._http.authedRequestWithPrefix(
|
return this._http.authedRequestWithPrefix(
|
||||||
undefined, "GET", path, params, undefined,
|
undefined, "GET", path, params, undefined,
|
||||||
httpApi.PREFIX_UNSTABLE
|
httpApi.PREFIX_UNSTABLE,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
128
src/client.js
128
src/client.js
@@ -157,7 +157,7 @@ function MatrixClient(opts) {
|
|||||||
this._crypto = new Crypto(
|
this._crypto = new Crypto(
|
||||||
this, this,
|
this, this,
|
||||||
opts.sessionStore,
|
opts.sessionStore,
|
||||||
userId, this.deviceId
|
userId, this.deviceId,
|
||||||
);
|
);
|
||||||
|
|
||||||
this.olmVersion = Crypto.getOlmVersion();
|
this.olmVersion = Crypto.getOlmVersion();
|
||||||
@@ -395,11 +395,29 @@ MatrixClient.prototype.setDeviceBlocked = function(userId, deviceId, blocked) {
|
|||||||
_setDeviceVerification(this, userId, deviceId, null, blocked);
|
_setDeviceVerification(this, userId, deviceId, null, blocked);
|
||||||
};
|
};
|
||||||
|
|
||||||
function _setDeviceVerification(client, userId, deviceId, verified, blocked) {
|
/**
|
||||||
|
* Mark the given device as known/unknown
|
||||||
|
*
|
||||||
|
* @param {string} userId owner of the device
|
||||||
|
* @param {string} deviceId unique identifier for the device
|
||||||
|
*
|
||||||
|
* @param {boolean=} known whether to mark the device as known. defaults
|
||||||
|
* to 'true'.
|
||||||
|
*
|
||||||
|
* @fires module:client~event:MatrixClient"deviceVerificationChanged"
|
||||||
|
*/
|
||||||
|
MatrixClient.prototype.setDeviceKnown = function(userId, deviceId, known) {
|
||||||
|
if (known === undefined) {
|
||||||
|
known = true;
|
||||||
|
}
|
||||||
|
_setDeviceVerification(this, userId, deviceId, null, null, known);
|
||||||
|
};
|
||||||
|
|
||||||
|
function _setDeviceVerification(client, userId, deviceId, verified, blocked, known) {
|
||||||
if (!client._crypto) {
|
if (!client._crypto) {
|
||||||
throw new Error("End-to-End encryption disabled");
|
throw new Error("End-to-End encryption disabled");
|
||||||
}
|
}
|
||||||
client._crypto.setDeviceVerification(userId, deviceId, verified, blocked);
|
client._crypto.setDeviceVerification(userId, deviceId, verified, blocked, known);
|
||||||
client.emit("deviceVerificationChanged", userId, deviceId);
|
client.emit("deviceVerificationChanged", userId, deviceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -605,7 +623,7 @@ MatrixClient.prototype.setAccountData = function(eventType, contents, callback)
|
|||||||
$type: eventType,
|
$type: eventType,
|
||||||
});
|
});
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "PUT", path, undefined, contents
|
callback, "PUT", path, undefined, contents,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -655,7 +673,7 @@ MatrixClient.prototype.joinRoom = function(roomIdOrAlias, opts, callback) {
|
|||||||
if (opts.inviteSignUrl) {
|
if (opts.inviteSignUrl) {
|
||||||
sign_promise = this._http.requestOtherUrl(
|
sign_promise = this._http.requestOtherUrl(
|
||||||
undefined, 'POST',
|
undefined, 'POST',
|
||||||
opts.inviteSignUrl, { mxid: this.credentials.userId }
|
opts.inviteSignUrl, { mxid: this.credentials.userId },
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -758,7 +776,7 @@ MatrixClient.prototype.getRoomTags = function(roomId, callback) {
|
|||||||
$roomId: roomId,
|
$roomId: roomId,
|
||||||
});
|
});
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "GET", path, undefined
|
callback, "GET", path, undefined,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -777,7 +795,7 @@ MatrixClient.prototype.setRoomTag = function(roomId, tagName, metadata, callback
|
|||||||
$tag: tagName,
|
$tag: tagName,
|
||||||
});
|
});
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "PUT", path, undefined, metadata
|
callback, "PUT", path, undefined, metadata,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -795,7 +813,7 @@ MatrixClient.prototype.deleteRoomTag = function(roomId, tagName, callback) {
|
|||||||
$tag: tagName,
|
$tag: tagName,
|
||||||
});
|
});
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "DELETE", path, undefined, undefined
|
callback, "DELETE", path, undefined, undefined,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -815,7 +833,7 @@ MatrixClient.prototype.setRoomAccountData = function(roomId, eventType,
|
|||||||
$type: eventType,
|
$type: eventType,
|
||||||
});
|
});
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "PUT", path, undefined, content
|
callback, "PUT", path, undefined, content,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -844,7 +862,7 @@ MatrixClient.prototype.setPowerLevel = function(roomId, userId, powerLevel,
|
|||||||
$roomId: roomId,
|
$roomId: roomId,
|
||||||
});
|
});
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "PUT", path, undefined, content
|
callback, "PUT", path, undefined, content,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -984,12 +1002,12 @@ function _sendEventHttpRequest(client, event) {
|
|||||||
path = utils.encodeUri(pathTemplate, pathParams);
|
path = utils.encodeUri(pathTemplate, pathParams);
|
||||||
} else {
|
} else {
|
||||||
path = utils.encodeUri(
|
path = utils.encodeUri(
|
||||||
"/rooms/$roomId/send/$eventType/$txnId", pathParams
|
"/rooms/$roomId/send/$eventType/$txnId", pathParams,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return client._http.authedRequest(
|
return client._http.authedRequest(
|
||||||
undefined, "PUT", path, undefined, event.getWireContent()
|
undefined, "PUT", path, undefined, event.getWireContent(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1006,7 +1024,7 @@ MatrixClient.prototype.sendMessage = function(roomId, content, txnId, callback)
|
|||||||
callback = txnId; txnId = undefined;
|
callback = txnId; txnId = undefined;
|
||||||
}
|
}
|
||||||
return this.sendEvent(
|
return this.sendEvent(
|
||||||
roomId, "m.room.message", content, txnId, callback
|
roomId, "m.room.message", content, txnId, callback,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1156,7 +1174,7 @@ MatrixClient.prototype.sendReceipt = function(event, receiptType, callback) {
|
|||||||
$eventId: event.getId(),
|
$eventId: event.getId(),
|
||||||
});
|
});
|
||||||
const promise = this._http.authedRequest(
|
const promise = this._http.authedRequest(
|
||||||
callback, "POST", path, undefined, {}
|
callback, "POST", path, undefined, {},
|
||||||
);
|
);
|
||||||
|
|
||||||
const room = this.getRoom(event.getRoomId());
|
const room = this.getRoom(event.getRoomId());
|
||||||
@@ -1205,7 +1223,7 @@ MatrixClient.prototype.getUrlPreview = function(url, ts, callback) {
|
|||||||
callback, "GET", "/preview_url", {
|
callback, "GET", "/preview_url", {
|
||||||
url: url,
|
url: url,
|
||||||
ts: ts,
|
ts: ts,
|
||||||
}, undefined, httpApi.PREFIX_MEDIA_R0
|
}, undefined, httpApi.PREFIX_MEDIA_R0,
|
||||||
).then(function(response) {
|
).then(function(response) {
|
||||||
// TODO: expire cache occasionally
|
// TODO: expire cache occasionally
|
||||||
self.urlPreviewCache[key] = response;
|
self.urlPreviewCache[key] = response;
|
||||||
@@ -1237,7 +1255,7 @@ MatrixClient.prototype.sendTyping = function(roomId, isTyping, timeoutMs, callba
|
|||||||
data.timeout = timeoutMs ? timeoutMs : 20000;
|
data.timeout = timeoutMs ? timeoutMs : 20000;
|
||||||
}
|
}
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "PUT", path, undefined, data
|
callback, "PUT", path, undefined, data,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1263,7 +1281,7 @@ MatrixClient.prototype.invite = function(roomId, userId, callback) {
|
|||||||
*/
|
*/
|
||||||
MatrixClient.prototype.inviteByEmail = function(roomId, email, callback) {
|
MatrixClient.prototype.inviteByEmail = function(roomId, email, callback) {
|
||||||
return this.inviteByThreePid(
|
return this.inviteByThreePid(
|
||||||
roomId, "email", email, callback
|
roomId, "email", email, callback,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1279,7 +1297,7 @@ MatrixClient.prototype.inviteByEmail = function(roomId, email, callback) {
|
|||||||
MatrixClient.prototype.inviteByThreePid = function(roomId, medium, address, callback) {
|
MatrixClient.prototype.inviteByThreePid = function(roomId, medium, address, callback) {
|
||||||
const path = utils.encodeUri(
|
const path = utils.encodeUri(
|
||||||
"/rooms/$roomId/invite",
|
"/rooms/$roomId/invite",
|
||||||
{ $roomId: roomId }
|
{ $roomId: roomId },
|
||||||
);
|
);
|
||||||
|
|
||||||
let identityServerUrl = this.getIdentityServerUrl();
|
let identityServerUrl = this.getIdentityServerUrl();
|
||||||
@@ -1361,7 +1379,7 @@ MatrixClient.prototype.forget = function(roomId, deleteRoom, callback) {
|
|||||||
MatrixClient.prototype.unban = function(roomId, userId, callback) {
|
MatrixClient.prototype.unban = function(roomId, userId, callback) {
|
||||||
// unbanning = set their state to leave
|
// unbanning = set their state to leave
|
||||||
return _setMembershipState(
|
return _setMembershipState(
|
||||||
this, roomId, userId, "leave", undefined, callback
|
this, roomId, userId, "leave", undefined, callback,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1375,7 +1393,7 @@ MatrixClient.prototype.unban = function(roomId, userId, callback) {
|
|||||||
*/
|
*/
|
||||||
MatrixClient.prototype.kick = function(roomId, userId, reason, callback) {
|
MatrixClient.prototype.kick = function(roomId, userId, reason, callback) {
|
||||||
return _setMembershipState(
|
return _setMembershipState(
|
||||||
this, roomId, userId, "leave", reason, callback
|
this, roomId, userId, "leave", reason, callback,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1398,7 +1416,7 @@ function _setMembershipState(client, roomId, userId, membershipValue, reason,
|
|||||||
|
|
||||||
const path = utils.encodeUri(
|
const path = utils.encodeUri(
|
||||||
"/rooms/$roomId/state/m.room.member/$userId",
|
"/rooms/$roomId/state/m.room.member/$userId",
|
||||||
{ $roomId: roomId, $userId: userId}
|
{ $roomId: roomId, $userId: userId},
|
||||||
);
|
);
|
||||||
|
|
||||||
return client._http.authedRequest(callback, "PUT", path, undefined, {
|
return client._http.authedRequest(callback, "PUT", path, undefined, {
|
||||||
@@ -1431,7 +1449,7 @@ function _membershipChange(client, roomId, userId, membership, reason, callback)
|
|||||||
callback, "POST", path, undefined, {
|
callback, "POST", path, undefined, {
|
||||||
user_id: userId, // may be undefined e.g. on leave
|
user_id: userId, // may be undefined e.g. on leave
|
||||||
reason: reason,
|
reason: reason,
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1465,7 +1483,7 @@ MatrixClient.prototype.setProfileInfo = function(info, data, callback) {
|
|||||||
$info: info,
|
$info: info,
|
||||||
});
|
});
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "PUT", path, undefined, data
|
callback, "PUT", path, undefined, data,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1477,7 +1495,7 @@ MatrixClient.prototype.setProfileInfo = function(info, data, callback) {
|
|||||||
*/
|
*/
|
||||||
MatrixClient.prototype.setDisplayName = function(name, callback) {
|
MatrixClient.prototype.setDisplayName = function(name, callback) {
|
||||||
return this.setProfileInfo(
|
return this.setProfileInfo(
|
||||||
"displayname", { displayname: name }, callback
|
"displayname", { displayname: name }, callback,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1489,7 +1507,7 @@ MatrixClient.prototype.setDisplayName = function(name, callback) {
|
|||||||
*/
|
*/
|
||||||
MatrixClient.prototype.setAvatarUrl = function(url, callback) {
|
MatrixClient.prototype.setAvatarUrl = function(url, callback) {
|
||||||
return this.setProfileInfo(
|
return this.setProfileInfo(
|
||||||
"avatar_url", { avatar_url: url }, callback
|
"avatar_url", { avatar_url: url }, callback,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1509,7 +1527,7 @@ MatrixClient.prototype.setAvatarUrl = function(url, callback) {
|
|||||||
MatrixClient.prototype.mxcUrlToHttp =
|
MatrixClient.prototype.mxcUrlToHttp =
|
||||||
function(mxcUrl, width, height, resizeMethod, allowDirectLinks) {
|
function(mxcUrl, width, height, resizeMethod, allowDirectLinks) {
|
||||||
return contentRepo.getHttpUriForMxc(
|
return contentRepo.getHttpUriForMxc(
|
||||||
this.baseUrl, mxcUrl, width, height, resizeMethod, allowDirectLinks
|
this.baseUrl, mxcUrl, width, height, resizeMethod, allowDirectLinks,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1536,7 +1554,7 @@ MatrixClient.prototype.setPresence = function(opts, callback) {
|
|||||||
throw new Error("Bad presence value: " + opts.presence);
|
throw new Error("Bad presence value: " + opts.presence);
|
||||||
}
|
}
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
callback, "PUT", path, undefined, opts
|
callback, "PUT", path, undefined, opts,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1626,7 +1644,7 @@ MatrixClient.prototype.scrollback = function(room, limit, callback) {
|
|||||||
limit = limit - numAdded;
|
limit = limit - numAdded;
|
||||||
|
|
||||||
const path = utils.encodeUri(
|
const path = utils.encodeUri(
|
||||||
"/rooms/$roomId/messages", {$roomId: room.roomId}
|
"/rooms/$roomId/messages", {$roomId: room.roomId},
|
||||||
);
|
);
|
||||||
const params = {
|
const params = {
|
||||||
from: room.oldState.paginationToken,
|
from: room.oldState.paginationToken,
|
||||||
@@ -1696,7 +1714,7 @@ MatrixClient.prototype.paginateEventContext = function(eventContext, opts) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const path = utils.encodeUri(
|
const path = utils.encodeUri(
|
||||||
"/rooms/$roomId/messages", {$roomId: eventContext.getEvent().getRoomId()}
|
"/rooms/$roomId/messages", {$roomId: eventContext.getEvent().getRoomId()},
|
||||||
);
|
);
|
||||||
const params = {
|
const params = {
|
||||||
from: token,
|
from: token,
|
||||||
@@ -1706,7 +1724,7 @@ MatrixClient.prototype.paginateEventContext = function(eventContext, opts) {
|
|||||||
|
|
||||||
const self = this;
|
const self = this;
|
||||||
const promise =
|
const promise =
|
||||||
self._http.authedRequest(undefined, "GET", path, params
|
self._http.authedRequest(undefined, "GET", path, params,
|
||||||
).then(function(res) {
|
).then(function(res) {
|
||||||
let token = res.end;
|
let token = res.end;
|
||||||
if (res.chunk.length === 0) {
|
if (res.chunk.length === 0) {
|
||||||
@@ -1760,14 +1778,14 @@ MatrixClient.prototype.getEventTimeline = function(timelineSet, eventId) {
|
|||||||
"/rooms/$roomId/context/$eventId", {
|
"/rooms/$roomId/context/$eventId", {
|
||||||
$roomId: timelineSet.room.roomId,
|
$roomId: timelineSet.room.roomId,
|
||||||
$eventId: eventId,
|
$eventId: eventId,
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
// TODO: we should implement a backoff (as per scrollback()) to deal more
|
// TODO: we should implement a backoff (as per scrollback()) to deal more
|
||||||
// nicely with HTTP errors.
|
// nicely with HTTP errors.
|
||||||
const self = this;
|
const self = this;
|
||||||
const promise =
|
const promise =
|
||||||
self._http.authedRequest(undefined, "GET", path
|
self._http.authedRequest(undefined, "GET", path,
|
||||||
).then(function(res) {
|
).then(function(res) {
|
||||||
if (!res.event) {
|
if (!res.event) {
|
||||||
throw new Error("'event' not in '/context' result - homeserver too old?");
|
throw new Error("'event' not in '/context' result - homeserver too old?");
|
||||||
@@ -1867,7 +1885,7 @@ MatrixClient.prototype.paginateEventTimeline = function(eventTimeline, opts) {
|
|||||||
|
|
||||||
promise =
|
promise =
|
||||||
this._http.authedRequestWithPrefix(undefined, "GET", path, params,
|
this._http.authedRequestWithPrefix(undefined, "GET", path, params,
|
||||||
undefined, httpApi.PREFIX_UNSTABLE
|
undefined, httpApi.PREFIX_UNSTABLE,
|
||||||
).then(function(res) {
|
).then(function(res) {
|
||||||
const token = res.next_token;
|
const token = res.next_token;
|
||||||
const matrixEvents = [];
|
const matrixEvents = [];
|
||||||
@@ -1876,7 +1894,7 @@ MatrixClient.prototype.paginateEventTimeline = function(eventTimeline, opts) {
|
|||||||
const notification = res.notifications[i];
|
const notification = res.notifications[i];
|
||||||
const event = self.getEventMapper()(notification.event);
|
const event = self.getEventMapper()(notification.event);
|
||||||
event.setPushActions(
|
event.setPushActions(
|
||||||
PushProcessor.actionListToActionsObject(notification.actions)
|
PushProcessor.actionListToActionsObject(notification.actions),
|
||||||
);
|
);
|
||||||
event.event.room_id = notification.room_id; // XXX: gutwrenching
|
event.event.room_id = notification.room_id; // XXX: gutwrenching
|
||||||
matrixEvents[i] = event;
|
matrixEvents[i] = event;
|
||||||
@@ -1903,7 +1921,7 @@ MatrixClient.prototype.paginateEventTimeline = function(eventTimeline, opts) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
path = utils.encodeUri(
|
path = utils.encodeUri(
|
||||||
"/rooms/$roomId/messages", {$roomId: eventTimeline.getRoomId()}
|
"/rooms/$roomId/messages", {$roomId: eventTimeline.getRoomId()},
|
||||||
);
|
);
|
||||||
params = {
|
params = {
|
||||||
from: token,
|
from: token,
|
||||||
@@ -1919,7 +1937,7 @@ MatrixClient.prototype.paginateEventTimeline = function(eventTimeline, opts) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
promise =
|
promise =
|
||||||
this._http.authedRequest(undefined, "GET", path, params
|
this._http.authedRequest(undefined, "GET", path, params,
|
||||||
).then(function(res) {
|
).then(function(res) {
|
||||||
const token = res.end;
|
const token = res.end;
|
||||||
const matrixEvents = utils.map(res.chunk, self.getEventMapper());
|
const matrixEvents = utils.map(res.chunk, self.getEventMapper());
|
||||||
@@ -2055,7 +2073,7 @@ MatrixClient.prototype.requestRegisterEmailToken = function(email, clientSecret,
|
|||||||
sendAttempt, nextLink, callback) {
|
sendAttempt, nextLink, callback) {
|
||||||
return this._requestTokenFromEndpoint(
|
return this._requestTokenFromEndpoint(
|
||||||
"/register/email/requestToken",
|
"/register/email/requestToken",
|
||||||
email, clientSecret, sendAttempt, nextLink, callback
|
email, clientSecret, sendAttempt, nextLink, callback,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2083,7 +2101,7 @@ MatrixClient.prototype.requestAdd3pidEmailToken = function(email, clientSecret,
|
|||||||
sendAttempt, nextLink, callback) {
|
sendAttempt, nextLink, callback) {
|
||||||
return this._requestTokenFromEndpoint(
|
return this._requestTokenFromEndpoint(
|
||||||
"/account/3pid/email/requestToken",
|
"/account/3pid/email/requestToken",
|
||||||
email, clientSecret, sendAttempt, nextLink, callback
|
email, clientSecret, sendAttempt, nextLink, callback,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2110,7 +2128,7 @@ MatrixClient.prototype.requestPasswordEmailToken = function(email, clientSecret,
|
|||||||
sendAttempt, nextLink, callback) {
|
sendAttempt, nextLink, callback) {
|
||||||
return this._requestTokenFromEndpoint(
|
return this._requestTokenFromEndpoint(
|
||||||
"/account/password/email/requestToken",
|
"/account/password/email/requestToken",
|
||||||
email, clientSecret, sendAttempt, nextLink, callback
|
email, clientSecret, sendAttempt, nextLink, callback,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2143,7 +2161,7 @@ MatrixClient.prototype._requestTokenFromEndpoint = function(endpoint,
|
|||||||
};
|
};
|
||||||
return this._http.request(
|
return this._http.request(
|
||||||
callback, "POST", endpoint, undefined,
|
callback, "POST", endpoint, undefined,
|
||||||
params
|
params,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2169,7 +2187,7 @@ MatrixClient.prototype.getRoomPushRule = function(scope, roomId) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
"SyncApi.sync() must be done before accessing to push rules."
|
"SyncApi.sync() must be done before accessing to push rules.",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -2321,7 +2339,7 @@ MatrixClient.prototype.searchRoomEvents = function(opts) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return this.search({body: body}).then(
|
return this.search({body: body}).then(
|
||||||
this._processRoomEventsSearch.bind(this, searchResults)
|
this._processRoomEventsSearch.bind(this, searchResults),
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2351,7 +2369,7 @@ MatrixClient.prototype.backPaginateRoomEventsSearch = function(searchResults) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const promise = this.search(searchOpts).then(
|
const promise = this.search(searchOpts).then(
|
||||||
this._processRoomEventsSearch.bind(this, searchResults)
|
this._processRoomEventsSearch.bind(this, searchResults),
|
||||||
).finally(function() {
|
).finally(function() {
|
||||||
searchResults.pendingRequest = null;
|
searchResults.pendingRequest = null;
|
||||||
});
|
});
|
||||||
@@ -2441,11 +2459,11 @@ MatrixClient.prototype.createFilter = function(content) {
|
|||||||
$userId: this.credentials.userId,
|
$userId: this.credentials.userId,
|
||||||
});
|
});
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
undefined, "POST", path, undefined, content
|
undefined, "POST", path, undefined, content,
|
||||||
).then(function(response) {
|
).then(function(response) {
|
||||||
// persist the filter
|
// persist the filter
|
||||||
const filter = Filter.fromJson(
|
const filter = Filter.fromJson(
|
||||||
self.credentials.userId, response.filter_id, content
|
self.credentials.userId, response.filter_id, content,
|
||||||
);
|
);
|
||||||
self.store.storeFilter(filter);
|
self.store.storeFilter(filter);
|
||||||
return filter;
|
return filter;
|
||||||
@@ -2476,11 +2494,11 @@ MatrixClient.prototype.getFilter = function(userId, filterId, allowCached) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
undefined, "GET", path, undefined, undefined
|
undefined, "GET", path, undefined, undefined,
|
||||||
).then(function(response) {
|
).then(function(response) {
|
||||||
// persist the filter
|
// persist the filter
|
||||||
const filter = Filter.fromJson(
|
const filter = Filter.fromJson(
|
||||||
userId, filterId, response
|
userId, filterId, response,
|
||||||
);
|
);
|
||||||
self.store.storeFilter(filter);
|
self.store.storeFilter(filter);
|
||||||
return filter;
|
return filter;
|
||||||
@@ -2500,7 +2518,7 @@ MatrixClient.prototype.getOrCreateFilter = function(filterName, filter) {
|
|||||||
if (filterId) {
|
if (filterId) {
|
||||||
// check that the existing filter matches our expectations
|
// check that the existing filter matches our expectations
|
||||||
promise = self.getFilter(self.credentials.userId,
|
promise = self.getFilter(self.credentials.userId,
|
||||||
filterId, true
|
filterId, true,
|
||||||
).then(function(existingFilter) {
|
).then(function(existingFilter) {
|
||||||
const oldDef = existingFilter.getDefinition();
|
const oldDef = existingFilter.getDefinition();
|
||||||
const newDef = filter.getDefinition();
|
const newDef = filter.getDefinition();
|
||||||
@@ -2542,7 +2560,7 @@ MatrixClient.prototype.getOrCreateFilter = function(filterName, filter) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// create a new filter
|
// create a new filter
|
||||||
return self.createFilter(filter.getDefinition()
|
return self.createFilter(filter.getDefinition(),
|
||||||
).then(function(createdFilter) {
|
).then(function(createdFilter) {
|
||||||
// debuglog("Created new filter ID %s: %s", createdFilter.filterId,
|
// debuglog("Created new filter ID %s: %s", createdFilter.filterId,
|
||||||
// JSON.stringify(createdFilter.getDefinition()));
|
// JSON.stringify(createdFilter.getDefinition()));
|
||||||
@@ -2566,7 +2584,7 @@ MatrixClient.prototype.getOpenIdToken = function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
return this._http.authedRequest(
|
return this._http.authedRequest(
|
||||||
undefined, "POST", path, undefined, {}
|
undefined, "POST", path, undefined, {},
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2756,7 +2774,7 @@ function setupCallEventHandler(client) {
|
|||||||
console.log(
|
console.log(
|
||||||
"WARN: Already have a MatrixCall with id %s but got an " +
|
"WARN: Already have a MatrixCall with id %s but got an " +
|
||||||
"invite. Clobbering.",
|
"invite. Clobbering.",
|
||||||
content.call_id
|
content.call_id,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2764,7 +2782,7 @@ function setupCallEventHandler(client) {
|
|||||||
if (!call) {
|
if (!call) {
|
||||||
console.log(
|
console.log(
|
||||||
"Incoming call ID " + content.call_id + " but this client " +
|
"Incoming call ID " + content.call_id + " but this client " +
|
||||||
"doesn't support WebRTC"
|
"doesn't support WebRTC",
|
||||||
);
|
);
|
||||||
// don't hang up the call: there could be other clients
|
// don't hang up the call: there could be other clients
|
||||||
// connected that do support WebRTC and declining the
|
// connected that do support WebRTC and declining the
|
||||||
@@ -2780,7 +2798,7 @@ function setupCallEventHandler(client) {
|
|||||||
if (candidatesByCall[call.callId]) {
|
if (candidatesByCall[call.callId]) {
|
||||||
for (i = 0; i < candidatesByCall[call.callId].length; i++) {
|
for (i = 0; i < candidatesByCall[call.callId].length; i++) {
|
||||||
call._gotRemoteIceCandidate(
|
call._gotRemoteIceCandidate(
|
||||||
candidatesByCall[call.callId][i]
|
candidatesByCall[call.callId][i],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2809,14 +2827,14 @@ function setupCallEventHandler(client) {
|
|||||||
existingCall.callId > call.callId) {
|
existingCall.callId > call.callId) {
|
||||||
console.log(
|
console.log(
|
||||||
"Glare detected: answering incoming call " + call.callId +
|
"Glare detected: answering incoming call " + call.callId +
|
||||||
" and canceling outgoing call " + existingCall.callId
|
" and canceling outgoing call " + existingCall.callId,
|
||||||
);
|
);
|
||||||
existingCall._replacedBy(call);
|
existingCall._replacedBy(call);
|
||||||
call.answer();
|
call.answer();
|
||||||
} else {
|
} else {
|
||||||
console.log(
|
console.log(
|
||||||
"Glare detected: rejecting incoming call " + call.callId +
|
"Glare detected: rejecting incoming call " + call.callId +
|
||||||
" and keeping outgoing call " + existingCall.callId
|
" and keeping outgoing call " + existingCall.callId,
|
||||||
);
|
);
|
||||||
call.hangup();
|
call.hangup();
|
||||||
}
|
}
|
||||||
|
@@ -191,7 +191,7 @@ OlmDevice.prototype._getSession = function(deviceKey, sessionId, func) {
|
|||||||
OlmDevice.prototype._saveSession = function(deviceKey, session) {
|
OlmDevice.prototype._saveSession = function(deviceKey, session) {
|
||||||
const pickledSession = session.pickle(this._pickleKey);
|
const pickledSession = session.pickle(this._pickleKey);
|
||||||
this._sessionStore.storeEndToEndSession(
|
this._sessionStore.storeEndToEndSession(
|
||||||
deviceKey, session.session_id(), pickledSession
|
deviceKey, session.session_id(), pickledSession,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -284,7 +284,7 @@ OlmDevice.prototype.generateOneTimeKeys = function(numKeys) {
|
|||||||
* @return {string} sessionId for the outbound session.
|
* @return {string} sessionId for the outbound session.
|
||||||
*/
|
*/
|
||||||
OlmDevice.prototype.createOutboundSession = function(
|
OlmDevice.prototype.createOutboundSession = function(
|
||||||
theirIdentityKey, theirOneTimeKey
|
theirIdentityKey, theirOneTimeKey,
|
||||||
) {
|
) {
|
||||||
const self = this;
|
const self = this;
|
||||||
return this._getAccount(function(account) {
|
return this._getAccount(function(account) {
|
||||||
@@ -314,7 +314,7 @@ OlmDevice.prototype.createOutboundSession = function(
|
|||||||
* didn't use a valid one-time key).
|
* didn't use a valid one-time key).
|
||||||
*/
|
*/
|
||||||
OlmDevice.prototype.createInboundSession = function(
|
OlmDevice.prototype.createInboundSession = function(
|
||||||
theirDeviceIdentityKey, message_type, ciphertext
|
theirDeviceIdentityKey, message_type, ciphertext,
|
||||||
) {
|
) {
|
||||||
if (message_type !== 0) {
|
if (message_type !== 0) {
|
||||||
throw new Error("Need message_type == 0 to create inbound session");
|
throw new Error("Need message_type == 0 to create inbound session");
|
||||||
@@ -352,7 +352,7 @@ OlmDevice.prototype.createInboundSession = function(
|
|||||||
*/
|
*/
|
||||||
OlmDevice.prototype.getSessionIdsForDevice = function(theirDeviceIdentityKey) {
|
OlmDevice.prototype.getSessionIdsForDevice = function(theirDeviceIdentityKey) {
|
||||||
const sessions = this._sessionStore.getEndToEndSessions(
|
const sessions = this._sessionStore.getEndToEndSessions(
|
||||||
theirDeviceIdentityKey
|
theirDeviceIdentityKey,
|
||||||
);
|
);
|
||||||
return utils.keys(sessions);
|
return utils.keys(sessions);
|
||||||
};
|
};
|
||||||
@@ -417,7 +417,7 @@ OlmDevice.prototype.getSessionInfoForDevice = function(deviceIdentityKey) {
|
|||||||
* @return {string} ciphertext
|
* @return {string} ciphertext
|
||||||
*/
|
*/
|
||||||
OlmDevice.prototype.encryptMessage = function(
|
OlmDevice.prototype.encryptMessage = function(
|
||||||
theirDeviceIdentityKey, sessionId, payloadString
|
theirDeviceIdentityKey, sessionId, payloadString,
|
||||||
) {
|
) {
|
||||||
const self = this;
|
const self = this;
|
||||||
|
|
||||||
@@ -442,7 +442,7 @@ OlmDevice.prototype.encryptMessage = function(
|
|||||||
* @return {string} decrypted payload.
|
* @return {string} decrypted payload.
|
||||||
*/
|
*/
|
||||||
OlmDevice.prototype.decryptMessage = function(
|
OlmDevice.prototype.decryptMessage = function(
|
||||||
theirDeviceIdentityKey, sessionId, message_type, ciphertext
|
theirDeviceIdentityKey, sessionId, message_type, ciphertext,
|
||||||
) {
|
) {
|
||||||
const self = this;
|
const self = this;
|
||||||
|
|
||||||
@@ -467,7 +467,7 @@ OlmDevice.prototype.decryptMessage = function(
|
|||||||
* the given session.
|
* the given session.
|
||||||
*/
|
*/
|
||||||
OlmDevice.prototype.matchesSession = function(
|
OlmDevice.prototype.matchesSession = function(
|
||||||
theirDeviceIdentityKey, sessionId, message_type, ciphertext
|
theirDeviceIdentityKey, sessionId, message_type, ciphertext,
|
||||||
) {
|
) {
|
||||||
if (message_type !== 0) {
|
if (message_type !== 0) {
|
||||||
return false;
|
return false;
|
||||||
@@ -588,7 +588,7 @@ OlmDevice.prototype.getOutboundGroupSessionKey = function(sessionId) {
|
|||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
OlmDevice.prototype._saveInboundGroupSession = function(
|
OlmDevice.prototype._saveInboundGroupSession = function(
|
||||||
roomId, senderCurve25519Key, sessionId, session, keysClaimed
|
roomId, senderCurve25519Key, sessionId, session, keysClaimed,
|
||||||
) {
|
) {
|
||||||
const r = {
|
const r = {
|
||||||
room_id: roomId,
|
room_id: roomId,
|
||||||
@@ -597,7 +597,7 @@ OlmDevice.prototype._saveInboundGroupSession = function(
|
|||||||
};
|
};
|
||||||
|
|
||||||
this._sessionStore.storeEndToEndInboundGroupSession(
|
this._sessionStore.storeEndToEndInboundGroupSession(
|
||||||
senderCurve25519Key, sessionId, JSON.stringify(r)
|
senderCurve25519Key, sessionId, JSON.stringify(r),
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -618,10 +618,10 @@ OlmDevice.prototype._saveInboundGroupSession = function(
|
|||||||
* @template {T}
|
* @template {T}
|
||||||
*/
|
*/
|
||||||
OlmDevice.prototype._getInboundGroupSession = function(
|
OlmDevice.prototype._getInboundGroupSession = function(
|
||||||
roomId, senderKey, sessionId, func
|
roomId, senderKey, sessionId, func,
|
||||||
) {
|
) {
|
||||||
let r = this._sessionStore.getEndToEndInboundGroupSession(
|
let r = this._sessionStore.getEndToEndInboundGroupSession(
|
||||||
senderKey, sessionId
|
senderKey, sessionId,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (r === null) {
|
if (r === null) {
|
||||||
@@ -635,7 +635,7 @@ OlmDevice.prototype._getInboundGroupSession = function(
|
|||||||
if (roomId !== r.room_id) {
|
if (roomId !== r.room_id) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
"Mismatched room_id for inbound group session (expected " + r.room_id +
|
"Mismatched room_id for inbound group session (expected " + r.room_id +
|
||||||
", was " + roomId + ")"
|
", was " + roomId + ")",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -658,7 +658,7 @@ OlmDevice.prototype._getInboundGroupSession = function(
|
|||||||
* @param {Object<string, string>} keysClaimed Other keys the sender claims.
|
* @param {Object<string, string>} keysClaimed Other keys the sender claims.
|
||||||
*/
|
*/
|
||||||
OlmDevice.prototype.addInboundGroupSession = function(
|
OlmDevice.prototype.addInboundGroupSession = function(
|
||||||
roomId, senderKey, sessionId, sessionKey, keysClaimed
|
roomId, senderKey, sessionId, sessionKey, keysClaimed,
|
||||||
) {
|
) {
|
||||||
const self = this;
|
const self = this;
|
||||||
|
|
||||||
@@ -671,7 +671,7 @@ OlmDevice.prototype.addInboundGroupSession = function(
|
|||||||
}
|
}
|
||||||
|
|
||||||
const r = this._getInboundGroupSession(
|
const r = this._getInboundGroupSession(
|
||||||
roomId, senderKey, sessionId, updateSession
|
roomId, senderKey, sessionId, updateSession,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (r !== null) {
|
if (r !== null) {
|
||||||
@@ -684,11 +684,11 @@ OlmDevice.prototype.addInboundGroupSession = function(
|
|||||||
session.create(sessionKey);
|
session.create(sessionKey);
|
||||||
if (sessionId != session.session_id()) {
|
if (sessionId != session.session_id()) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
"Mismatched group session ID from senderKey: " + senderKey
|
"Mismatched group session ID from senderKey: " + senderKey,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
self._saveInboundGroupSession(
|
self._saveInboundGroupSession(
|
||||||
roomId, senderKey, sessionId, session, keysClaimed
|
roomId, senderKey, sessionId, session, keysClaimed,
|
||||||
);
|
);
|
||||||
} finally {
|
} finally {
|
||||||
session.free();
|
session.free();
|
||||||
@@ -712,7 +712,7 @@ OlmDevice.prototype.importInboundGroupSession = function(data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const r = this._getInboundGroupSession(
|
const r = this._getInboundGroupSession(
|
||||||
data.room_id, data.sender_key, data.session_id, updateSession
|
data.room_id, data.sender_key, data.session_id, updateSession,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (r !== null) {
|
if (r !== null) {
|
||||||
@@ -725,12 +725,12 @@ OlmDevice.prototype.importInboundGroupSession = function(data) {
|
|||||||
session.import_session(data.session_key);
|
session.import_session(data.session_key);
|
||||||
if (data.session_id != session.session_id()) {
|
if (data.session_id != session.session_id()) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
"Mismatched group session ID from senderKey: " + data.sender_key
|
"Mismatched group session ID from senderKey: " + data.sender_key,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
this._saveInboundGroupSession(
|
this._saveInboundGroupSession(
|
||||||
data.room_id, data.sender_key, data.session_id, session,
|
data.room_id, data.sender_key, data.session_id, session,
|
||||||
data.sender_claimed_keys
|
data.sender_claimed_keys,
|
||||||
);
|
);
|
||||||
} finally {
|
} finally {
|
||||||
session.free();
|
session.free();
|
||||||
@@ -751,7 +751,7 @@ OlmDevice.prototype.importInboundGroupSession = function(data) {
|
|||||||
* Object<string, string>}} result
|
* Object<string, string>}} result
|
||||||
*/
|
*/
|
||||||
OlmDevice.prototype.decryptGroupMessage = function(
|
OlmDevice.prototype.decryptGroupMessage = function(
|
||||||
roomId, senderKey, sessionId, body
|
roomId, senderKey, sessionId, body,
|
||||||
) {
|
) {
|
||||||
const self = this;
|
const self = this;
|
||||||
|
|
||||||
@@ -768,7 +768,7 @@ OlmDevice.prototype.decryptGroupMessage = function(
|
|||||||
if (messageIndexKey in self._inboundGroupSessionMessageIndexes) {
|
if (messageIndexKey in self._inboundGroupSessionMessageIndexes) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
"Duplicate message index, possible replay attack: " +
|
"Duplicate message index, possible replay attack: " +
|
||||||
messageIndexKey
|
messageIndexKey,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
self._inboundGroupSessionMessageIndexes[messageIndexKey] = true;
|
self._inboundGroupSessionMessageIndexes[messageIndexKey] = true;
|
||||||
@@ -779,7 +779,7 @@ OlmDevice.prototype.decryptGroupMessage = function(
|
|||||||
const keysProved = {curve25519: senderKey};
|
const keysProved = {curve25519: senderKey};
|
||||||
|
|
||||||
self._saveInboundGroupSession(
|
self._saveInboundGroupSession(
|
||||||
roomId, senderKey, sessionId, session, keysClaimed
|
roomId, senderKey, sessionId, session, keysClaimed,
|
||||||
);
|
);
|
||||||
return {
|
return {
|
||||||
result: plaintext,
|
result: plaintext,
|
||||||
@@ -789,7 +789,7 @@ OlmDevice.prototype.decryptGroupMessage = function(
|
|||||||
}
|
}
|
||||||
|
|
||||||
return this._getInboundGroupSession(
|
return this._getInboundGroupSession(
|
||||||
roomId, senderKey, sessionId, decrypt
|
roomId, senderKey, sessionId, decrypt,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -802,7 +802,7 @@ OlmDevice.prototype.decryptGroupMessage = function(
|
|||||||
*/
|
*/
|
||||||
OlmDevice.prototype.exportInboundGroupSession = function(senderKey, sessionId) {
|
OlmDevice.prototype.exportInboundGroupSession = function(senderKey, sessionId) {
|
||||||
const s = this._sessionStore.getEndToEndInboundGroupSession(
|
const s = this._sessionStore.getEndToEndInboundGroupSession(
|
||||||
senderKey, sessionId
|
senderKey, sessionId,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (s === null) {
|
if (s === null) {
|
||||||
@@ -844,7 +844,7 @@ OlmDevice.prototype.exportInboundGroupSession = function(senderKey, sessionId) {
|
|||||||
* was invalid then the message will be "OLM.BAD_MESSAGE_MAC".
|
* was invalid then the message will be "OLM.BAD_MESSAGE_MAC".
|
||||||
*/
|
*/
|
||||||
OlmDevice.prototype.verifySignature = function(
|
OlmDevice.prototype.verifySignature = function(
|
||||||
key, message, signature
|
key, message, signature,
|
||||||
) {
|
) {
|
||||||
this._getUtility(function(util) {
|
this._getUtility(function(util) {
|
||||||
util.ed25519_verify(key, message, signature);
|
util.ed25519_verify(key, message, signature);
|
||||||
|
@@ -85,7 +85,7 @@ module.exports.EncryptionAlgorithm = EncryptionAlgorithm;
|
|||||||
* @param {string=} oldMembership previous membership
|
* @param {string=} oldMembership previous membership
|
||||||
*/
|
*/
|
||||||
EncryptionAlgorithm.prototype.onRoomMembership = function(
|
EncryptionAlgorithm.prototype.onRoomMembership = function(
|
||||||
event, member, oldMembership
|
event, member, oldMembership,
|
||||||
) {};
|
) {};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -57,7 +57,7 @@ function OutboundSessionInfo(sessionId) {
|
|||||||
* @return {Boolean}
|
* @return {Boolean}
|
||||||
*/
|
*/
|
||||||
OutboundSessionInfo.prototype.needsRotation = function(
|
OutboundSessionInfo.prototype.needsRotation = function(
|
||||||
rotationPeriodMsgs, rotationPeriodMs
|
rotationPeriodMsgs, rotationPeriodMs,
|
||||||
) {
|
) {
|
||||||
const sessionLifetime = new Date().getTime() - this.creationTime;
|
const sessionLifetime = new Date().getTime() - this.creationTime;
|
||||||
|
|
||||||
@@ -66,7 +66,7 @@ OutboundSessionInfo.prototype.needsRotation = function(
|
|||||||
) {
|
) {
|
||||||
console.log(
|
console.log(
|
||||||
"Rotating megolm session after " + this.useCount +
|
"Rotating megolm session after " + this.useCount +
|
||||||
" messages, " + sessionLifetime + "ms"
|
" messages, " + sessionLifetime + "ms",
|
||||||
);
|
);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -86,7 +86,7 @@ OutboundSessionInfo.prototype.needsRotation = function(
|
|||||||
* in devicesInRoom.
|
* in devicesInRoom.
|
||||||
*/
|
*/
|
||||||
OutboundSessionInfo.prototype.sharedWithTooManyDevices = function(
|
OutboundSessionInfo.prototype.sharedWithTooManyDevices = function(
|
||||||
devicesInRoom
|
devicesInRoom,
|
||||||
) {
|
) {
|
||||||
for (const userId in this.sharedWithDevices) {
|
for (const userId in this.sharedWithDevices) {
|
||||||
if (!this.sharedWithDevices.hasOwnProperty(userId)) {
|
if (!this.sharedWithDevices.hasOwnProperty(userId)) {
|
||||||
@@ -106,7 +106,7 @@ OutboundSessionInfo.prototype.sharedWithTooManyDevices = function(
|
|||||||
if (!devicesInRoom[userId].hasOwnProperty(deviceId)) {
|
if (!devicesInRoom[userId].hasOwnProperty(deviceId)) {
|
||||||
console.log(
|
console.log(
|
||||||
"Starting new session because we shared with " +
|
"Starting new session because we shared with " +
|
||||||
userId + ":" + deviceId
|
userId + ":" + deviceId,
|
||||||
);
|
);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -220,7 +220,7 @@ MegolmEncryption.prototype._ensureOutboundSession = function(devicesInRoom) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return self._shareKeyWithDevices(
|
return self._shareKeyWithDevices(
|
||||||
session, shareMap
|
session, shareMap,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -250,7 +250,7 @@ MegolmEncryption.prototype._prepareNewSession = function() {
|
|||||||
|
|
||||||
this._olmDevice.addInboundGroupSession(
|
this._olmDevice.addInboundGroupSession(
|
||||||
this._roomId, this._olmDevice.deviceCurve25519Key, session_id,
|
this._roomId, this._olmDevice.deviceCurve25519Key, session_id,
|
||||||
key.key, {ed25519: this._olmDevice.deviceEd25519Key}
|
key.key, {ed25519: this._olmDevice.deviceEd25519Key},
|
||||||
);
|
);
|
||||||
|
|
||||||
return new OutboundSessionInfo(session_id);
|
return new OutboundSessionInfo(session_id);
|
||||||
@@ -285,7 +285,7 @@ MegolmEncryption.prototype._shareKeyWithDevices = function(session, devicesByUse
|
|||||||
const contentMap = {};
|
const contentMap = {};
|
||||||
|
|
||||||
return olmlib.ensureOlmSessionsForDevices(
|
return olmlib.ensureOlmSessionsForDevices(
|
||||||
this._olmDevice, this._baseApis, devicesByUser
|
this._olmDevice, this._baseApis, devicesByUser,
|
||||||
).then(function(devicemap) {
|
).then(function(devicemap) {
|
||||||
let haveTargets = false;
|
let haveTargets = false;
|
||||||
|
|
||||||
@@ -318,7 +318,7 @@ MegolmEncryption.prototype._shareKeyWithDevices = function(session, devicesByUse
|
|||||||
}
|
}
|
||||||
|
|
||||||
console.log(
|
console.log(
|
||||||
"sharing keys with device " + userId + ":" + deviceId
|
"sharing keys with device " + userId + ":" + deviceId,
|
||||||
);
|
);
|
||||||
|
|
||||||
const encryptedContent = {
|
const encryptedContent = {
|
||||||
@@ -334,7 +334,7 @@ MegolmEncryption.prototype._shareKeyWithDevices = function(session, devicesByUse
|
|||||||
self._olmDevice,
|
self._olmDevice,
|
||||||
userId,
|
userId,
|
||||||
deviceInfo,
|
deviceInfo,
|
||||||
payload
|
payload,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!contentMap[userId]) {
|
if (!contentMap[userId]) {
|
||||||
@@ -401,7 +401,7 @@ MegolmEncryption.prototype.encryptMessage = function(room, eventType, content) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const ciphertext = self._olmDevice.encryptGroupMessage(
|
const ciphertext = self._olmDevice.encryptGroupMessage(
|
||||||
session.sessionId, JSON.stringify(payloadJson)
|
session.sessionId, JSON.stringify(payloadJson),
|
||||||
);
|
);
|
||||||
|
|
||||||
const encryptedContent = {
|
const encryptedContent = {
|
||||||
@@ -434,10 +434,6 @@ MegolmEncryption.prototype._checkForUnknownDevices = function(devicesInRoom) {
|
|||||||
Object.keys(devicesInRoom[userId]).forEach((deviceId)=>{
|
Object.keys(devicesInRoom[userId]).forEach((deviceId)=>{
|
||||||
const device = devicesInRoom[userId][deviceId];
|
const device = devicesInRoom[userId][deviceId];
|
||||||
if (device.isUnverified() && !device.isKnown()) {
|
if (device.isUnverified() && !device.isKnown()) {
|
||||||
// mark the devices as known to the user, given we're about to
|
|
||||||
// yell at them.
|
|
||||||
this._crypto.setDeviceVerification(userId, device.deviceId,
|
|
||||||
undefined, undefined, true);
|
|
||||||
if (!unknownDevices[userId]) {
|
if (!unknownDevices[userId]) {
|
||||||
unknownDevices[userId] = {};
|
unknownDevices[userId] = {};
|
||||||
}
|
}
|
||||||
@@ -473,11 +469,13 @@ MegolmEncryption.prototype._getDevicesInRoom = function(room) {
|
|||||||
// with them, which means that they will have announced any new devices via
|
// with them, which means that they will have announced any new devices via
|
||||||
// an m.new_device.
|
// an m.new_device.
|
||||||
//
|
//
|
||||||
// XXX: what if the cache is stale, and the user left the room we had in common
|
// XXX: what if the cache is stale, and the user left the room we had in
|
||||||
// and then added new devices before joining this one? --Matthew
|
// common and then added new devices before joining this one? --Matthew
|
||||||
|
//
|
||||||
|
// yup, see https://github.com/vector-im/riot-web/issues/2305 --richvdh
|
||||||
var self = this;
|
var self = this;
|
||||||
return self._crypto.downloadKeys(roomMembers, false).then(function(devices) {
|
return self._crypto.downloadKeys(roomMembers, false).then(function(devices) {
|
||||||
// remove any blocked (aka blacklisted) devices
|
// remove any blocked devices
|
||||||
for (const userId in devices) {
|
for (const userId in devices) {
|
||||||
if (!devices.hasOwnProperty(userId)) {
|
if (!devices.hasOwnProperty(userId)) {
|
||||||
continue;
|
continue;
|
||||||
@@ -541,7 +539,7 @@ MegolmDecryption.prototype.decryptEvent = function(event) {
|
|||||||
let res;
|
let res;
|
||||||
try {
|
try {
|
||||||
res = this._olmDevice.decryptGroupMessage(
|
res = this._olmDevice.decryptGroupMessage(
|
||||||
event.getRoomId(), content.sender_key, content.session_id, content.ciphertext
|
event.getRoomId(), content.sender_key, content.session_id, content.ciphertext,
|
||||||
);
|
);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (e.message === 'OLM.UNKNOWN_MESSAGE_INDEX') {
|
if (e.message === 'OLM.UNKNOWN_MESSAGE_INDEX') {
|
||||||
@@ -554,7 +552,7 @@ MegolmDecryption.prototype.decryptEvent = function(event) {
|
|||||||
// We've got a message for a session we don't have.
|
// We've got a message for a session we don't have.
|
||||||
this._addEventToPendingList(event);
|
this._addEventToPendingList(event);
|
||||||
throw new base.DecryptionError(
|
throw new base.DecryptionError(
|
||||||
"The sender's device has not sent us the keys for this message."
|
"The sender's device has not sent us the keys for this message.",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -565,7 +563,7 @@ MegolmDecryption.prototype.decryptEvent = function(event) {
|
|||||||
// room, so neither the sender nor a MITM can lie about the room_id).
|
// room, so neither the sender nor a MITM can lie about the room_id).
|
||||||
if (payload.room_id !== event.getRoomId()) {
|
if (payload.room_id !== event.getRoomId()) {
|
||||||
throw new base.DecryptionError(
|
throw new base.DecryptionError(
|
||||||
"Message intended for room " + payload.room_id
|
"Message intended for room " + payload.room_id,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -609,7 +607,7 @@ MegolmDecryption.prototype.onRoomKeyEvent = function(event) {
|
|||||||
|
|
||||||
this._olmDevice.addInboundGroupSession(
|
this._olmDevice.addInboundGroupSession(
|
||||||
content.room_id, event.getSenderKey(), content.session_id,
|
content.room_id, event.getSenderKey(), content.session_id,
|
||||||
content.session_key, event.getKeysClaimed()
|
content.session_key, event.getKeysClaimed(),
|
||||||
);
|
);
|
||||||
|
|
||||||
// have another go at decrypting events sent with this session.
|
// have another go at decrypting events sent with this session.
|
||||||
@@ -656,5 +654,5 @@ MegolmDecryption.prototype._retryDecryption = function(senderKey, sessionId) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
base.registerAlgorithm(
|
base.registerAlgorithm(
|
||||||
olmlib.MEGOLM_ALGORITHM, MegolmEncryption, MegolmDecryption
|
olmlib.MEGOLM_ALGORITHM, MegolmEncryption, MegolmDecryption,
|
||||||
);
|
);
|
||||||
|
@@ -126,7 +126,7 @@ OlmEncryption.prototype.encryptMessage = function(room, eventType, content) {
|
|||||||
olmlib.encryptMessageForDevice(
|
olmlib.encryptMessageForDevice(
|
||||||
encryptedContent.ciphertext,
|
encryptedContent.ciphertext,
|
||||||
self._userId, self._deviceId, self._olmDevice,
|
self._userId, self._deviceId, self._olmDevice,
|
||||||
userId, deviceInfo, payloadFields
|
userId, deviceInfo, payloadFields,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -177,7 +177,7 @@ OlmDecryption.prototype.decryptEvent = function(event) {
|
|||||||
console.warn(
|
console.warn(
|
||||||
"Failed to decrypt Olm event (id=" +
|
"Failed to decrypt Olm event (id=" +
|
||||||
event.getId() + ") from " + deviceKey +
|
event.getId() + ") from " + deviceKey +
|
||||||
": " + e.message
|
": " + e.message,
|
||||||
);
|
);
|
||||||
throw new base.DecryptionError("Bad Encrypted Message");
|
throw new base.DecryptionError("Bad Encrypted Message");
|
||||||
}
|
}
|
||||||
@@ -189,10 +189,10 @@ OlmDecryption.prototype.decryptEvent = function(event) {
|
|||||||
if (payload.recipient != this._userId) {
|
if (payload.recipient != this._userId) {
|
||||||
console.warn(
|
console.warn(
|
||||||
"Event " + event.getId() + ": Intended recipient " +
|
"Event " + event.getId() + ": Intended recipient " +
|
||||||
payload.recipient + " does not match our id " + this._userId
|
payload.recipient + " does not match our id " + this._userId,
|
||||||
);
|
);
|
||||||
throw new base.DecryptionError(
|
throw new base.DecryptionError(
|
||||||
"Message was intented for " + payload.recipient
|
"Message was intented for " + payload.recipient,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -200,7 +200,7 @@ OlmDecryption.prototype.decryptEvent = function(event) {
|
|||||||
this._olmDevice.deviceEd25519Key) {
|
this._olmDevice.deviceEd25519Key) {
|
||||||
console.warn(
|
console.warn(
|
||||||
"Event " + event.getId() + ": Intended recipient ed25519 key " +
|
"Event " + event.getId() + ": Intended recipient ed25519 key " +
|
||||||
payload.recipient_keys.ed25519 + " did not match ours"
|
payload.recipient_keys.ed25519 + " did not match ours",
|
||||||
);
|
);
|
||||||
throw new base.DecryptionError("Message not intended for this device");
|
throw new base.DecryptionError("Message not intended for this device");
|
||||||
}
|
}
|
||||||
@@ -212,10 +212,10 @@ OlmDecryption.prototype.decryptEvent = function(event) {
|
|||||||
if (payload.sender != event.getSender()) {
|
if (payload.sender != event.getSender()) {
|
||||||
console.warn(
|
console.warn(
|
||||||
"Event " + event.getId() + ": original sender " + payload.sender +
|
"Event " + event.getId() + ": original sender " + payload.sender +
|
||||||
" does not match reported sender " + event.getSender()
|
" does not match reported sender " + event.getSender(),
|
||||||
);
|
);
|
||||||
throw new base.DecryptionError(
|
throw new base.DecryptionError(
|
||||||
"Message forwarded from " + payload.sender
|
"Message forwarded from " + payload.sender,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -223,10 +223,10 @@ OlmDecryption.prototype.decryptEvent = function(event) {
|
|||||||
if (payload.room_id !== event.getRoomId()) {
|
if (payload.room_id !== event.getRoomId()) {
|
||||||
console.warn(
|
console.warn(
|
||||||
"Event " + event.getId() + ": original room " + payload.room_id +
|
"Event " + event.getId() + ": original room " + payload.room_id +
|
||||||
" does not match reported room " + event.room_id
|
" does not match reported room " + event.room_id,
|
||||||
);
|
);
|
||||||
throw new base.DecryptionError(
|
throw new base.DecryptionError(
|
||||||
"Message intended for room " + payload.room_id
|
"Message intended for room " + payload.room_id,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -251,16 +251,16 @@ OlmDecryption.prototype._decryptMessage = function(theirDeviceIdentityKey, messa
|
|||||||
const sessionId = sessionIds[i];
|
const sessionId = sessionIds[i];
|
||||||
try {
|
try {
|
||||||
const payload = this._olmDevice.decryptMessage(
|
const payload = this._olmDevice.decryptMessage(
|
||||||
theirDeviceIdentityKey, sessionId, message.type, message.body
|
theirDeviceIdentityKey, sessionId, message.type, message.body,
|
||||||
);
|
);
|
||||||
console.log(
|
console.log(
|
||||||
"Decrypted Olm message from " + theirDeviceIdentityKey +
|
"Decrypted Olm message from " + theirDeviceIdentityKey +
|
||||||
" with session " + sessionId
|
" with session " + sessionId,
|
||||||
);
|
);
|
||||||
return payload;
|
return payload;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
const foundSession = this._olmDevice.matchesSession(
|
const foundSession = this._olmDevice.matchesSession(
|
||||||
theirDeviceIdentityKey, sessionId, message.type, message.body
|
theirDeviceIdentityKey, sessionId, message.type, message.body,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (foundSession) {
|
if (foundSession) {
|
||||||
@@ -268,7 +268,7 @@ OlmDecryption.prototype._decryptMessage = function(theirDeviceIdentityKey, messa
|
|||||||
// session, so it should have worked.
|
// session, so it should have worked.
|
||||||
throw new Error(
|
throw new Error(
|
||||||
"Error decrypting prekey message with existing session id " +
|
"Error decrypting prekey message with existing session id " +
|
||||||
sessionId + ": " + e.message
|
sessionId + ": " + e.message,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -288,7 +288,7 @@ OlmDecryption.prototype._decryptMessage = function(theirDeviceIdentityKey, messa
|
|||||||
|
|
||||||
throw new Error(
|
throw new Error(
|
||||||
"Error decrypting non-prekey message with existing sessions: " +
|
"Error decrypting non-prekey message with existing sessions: " +
|
||||||
JSON.stringify(decryptionErrors)
|
JSON.stringify(decryptionErrors),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -298,19 +298,19 @@ OlmDecryption.prototype._decryptMessage = function(theirDeviceIdentityKey, messa
|
|||||||
let res;
|
let res;
|
||||||
try {
|
try {
|
||||||
res = this._olmDevice.createInboundSession(
|
res = this._olmDevice.createInboundSession(
|
||||||
theirDeviceIdentityKey, message.type, message.body
|
theirDeviceIdentityKey, message.type, message.body,
|
||||||
);
|
);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
decryptionErrors["(new)"] = e.message;
|
decryptionErrors["(new)"] = e.message;
|
||||||
throw new Error(
|
throw new Error(
|
||||||
"Error decrypting prekey message: " +
|
"Error decrypting prekey message: " +
|
||||||
JSON.stringify(decryptionErrors)
|
JSON.stringify(decryptionErrors),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(
|
console.log(
|
||||||
"created new inbound Olm session ID " +
|
"created new inbound Olm session ID " +
|
||||||
res.session_id + " with " + theirDeviceIdentityKey
|
res.session_id + " with " + theirDeviceIdentityKey,
|
||||||
);
|
);
|
||||||
return res.payload;
|
return res.payload;
|
||||||
};
|
};
|
||||||
|
@@ -86,6 +86,7 @@ DeviceInfo.prototype.toStorage = function() {
|
|||||||
algorithms: this.algorithms,
|
algorithms: this.algorithms,
|
||||||
keys: this.keys,
|
keys: this.keys,
|
||||||
verified: this.verified,
|
verified: this.verified,
|
||||||
|
known: this.known,
|
||||||
unsigned: this.unsigned,
|
unsigned: this.unsigned,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@@ -69,7 +69,7 @@ function Crypto(baseApis, eventEmitter, sessionStore, userId, deviceId) {
|
|||||||
this._roomDecryptors = {};
|
this._roomDecryptors = {};
|
||||||
|
|
||||||
this._supportedAlgorithms = utils.keys(
|
this._supportedAlgorithms = utils.keys(
|
||||||
algorithms.DECRYPTION_CLASSES
|
algorithms.DECRYPTION_CLASSES,
|
||||||
);
|
);
|
||||||
|
|
||||||
// build our device keys: these will later be uploaded
|
// build our device keys: these will later be uploaded
|
||||||
@@ -82,7 +82,7 @@ function Crypto(baseApis, eventEmitter, sessionStore, userId, deviceId) {
|
|||||||
this._globalBlacklistUnverifiedDevices = false;
|
this._globalBlacklistUnverifiedDevices = false;
|
||||||
|
|
||||||
let myDevices = this._sessionStore.getEndToEndDevicesForUser(
|
let myDevices = this._sessionStore.getEndToEndDevicesForUser(
|
||||||
this._userId
|
this._userId,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!myDevices) {
|
if (!myDevices) {
|
||||||
@@ -98,11 +98,12 @@ function Crypto(baseApis, eventEmitter, sessionStore, userId, deviceId) {
|
|||||||
keys: this._deviceKeys,
|
keys: this._deviceKeys,
|
||||||
algorithms: this._supportedAlgorithms,
|
algorithms: this._supportedAlgorithms,
|
||||||
verified: DeviceVerification.VERIFIED,
|
verified: DeviceVerification.VERIFIED,
|
||||||
|
known: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
myDevices[this._deviceId] = deviceInfo;
|
myDevices[this._deviceId] = deviceInfo;
|
||||||
this._sessionStore.storeEndToEndDevicesForUser(
|
this._sessionStore.storeEndToEndDevicesForUser(
|
||||||
this._userId, myDevices
|
this._userId, myDevices,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -402,7 +403,7 @@ Crypto.prototype._doKeyDownloadForUsers = function(downloadUsers) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
this._baseApis.downloadKeysForUsers(
|
this._baseApis.downloadKeysForUsers(
|
||||||
downloadUsers
|
downloadUsers,
|
||||||
).done(function(res) {
|
).done(function(res) {
|
||||||
const dk = res.device_keys || {};
|
const dk = res.device_keys || {};
|
||||||
|
|
||||||
@@ -433,7 +434,7 @@ Crypto.prototype._doKeyDownloadForUsers = function(downloadUsers) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_updateStoredDeviceKeysForUser(
|
_updateStoredDeviceKeysForUser(
|
||||||
self._olmDevice, userId, userStore, dk[userId]
|
self._olmDevice, userId, userStore, dk[userId],
|
||||||
);
|
);
|
||||||
|
|
||||||
// update the session store
|
// update the session store
|
||||||
@@ -446,7 +447,7 @@ Crypto.prototype._doKeyDownloadForUsers = function(downloadUsers) {
|
|||||||
storage[deviceId] = userStore[deviceId].toStorage();
|
storage[deviceId] = userStore[deviceId].toStorage();
|
||||||
}
|
}
|
||||||
self._sessionStore.storeEndToEndDevicesForUser(
|
self._sessionStore.storeEndToEndDevicesForUser(
|
||||||
userId, storage
|
userId, storage,
|
||||||
);
|
);
|
||||||
|
|
||||||
deferMap[userId].resolve();
|
deferMap[userId].resolve();
|
||||||
@@ -732,7 +733,7 @@ Crypto.prototype.setDeviceVerification = function(userId, deviceId, verified,
|
|||||||
}
|
}
|
||||||
|
|
||||||
let knownStatus = dev.known;
|
let knownStatus = dev.known;
|
||||||
if (known !== null) {
|
if (known !== null && known !== undefined) {
|
||||||
knownStatus = known;
|
knownStatus = known;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -796,7 +797,7 @@ Crypto.prototype.getEventSenderDeviceInfo = function(event) {
|
|||||||
// identity key of the device which set up the Megolm session.
|
// identity key of the device which set up the Megolm session.
|
||||||
|
|
||||||
const device = this.getDeviceByIdentityKey(
|
const device = this.getDeviceByIdentityKey(
|
||||||
event.getSender(), algorithm, sender_key
|
event.getSender(), algorithm, sender_key,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (device === null) {
|
if (device === null) {
|
||||||
@@ -915,7 +916,7 @@ Crypto.prototype.ensureOlmSessionsForUsers = function(users) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return olmlib.ensureOlmSessionsForDevices(
|
return olmlib.ensureOlmSessionsForDevices(
|
||||||
this._olmDevice, this._baseApis, devicesByUser
|
this._olmDevice, this._baseApis, devicesByUser,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -940,13 +941,13 @@ Crypto.prototype.exportRoomKeys = function() {
|
|||||||
this._sessionStore.getAllEndToEndInboundGroupSessionKeys().map(
|
this._sessionStore.getAllEndToEndInboundGroupSessionKeys().map(
|
||||||
(s) => {
|
(s) => {
|
||||||
const sess = this._olmDevice.exportInboundGroupSession(
|
const sess = this._olmDevice.exportInboundGroupSession(
|
||||||
s.senderKey, s.sessionId
|
s.senderKey, s.sessionId,
|
||||||
);
|
);
|
||||||
|
|
||||||
sess.algorithm = olmlib.MEGOLM_ALGORITHM;
|
sess.algorithm = olmlib.MEGOLM_ALGORITHM;
|
||||||
return sess;
|
return sess;
|
||||||
}
|
},
|
||||||
)
|
),
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1001,7 +1002,7 @@ Crypto.prototype.encryptEventIfNeeded = function(event, room) {
|
|||||||
throw new Error(
|
throw new Error(
|
||||||
"Room was previously configured to use encryption, but is " +
|
"Room was previously configured to use encryption, but is " +
|
||||||
"no longer. Perhaps the homeserver is hiding the " +
|
"no longer. Perhaps the homeserver is hiding the " +
|
||||||
"configuration event."
|
"configuration event.",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
@@ -1016,7 +1017,7 @@ Crypto.prototype.encryptEventIfNeeded = function(event, room) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return alg.encryptMessage(
|
return alg.encryptMessage(
|
||||||
room, event.getType(), event.getContent()
|
room, event.getType(), event.getContent(),
|
||||||
).then(function(encryptedContent) {
|
).then(function(encryptedContent) {
|
||||||
event.makeEncrypted("m.room.encrypted", encryptedContent, myKeys);
|
event.makeEncrypted("m.room.encrypted", encryptedContent, myKeys);
|
||||||
});
|
});
|
||||||
@@ -1119,7 +1120,7 @@ Crypto.prototype._onInitialSyncCompleted = function(rooms) {
|
|||||||
const self = this;
|
const self = this;
|
||||||
this._baseApis.sendToDevice(
|
this._baseApis.sendToDevice(
|
||||||
"m.new_device", // OH HAI!
|
"m.new_device", // OH HAI!
|
||||||
content
|
content,
|
||||||
).done(function() {
|
).done(function() {
|
||||||
self._sessionStore.setDeviceAnnounced();
|
self._sessionStore.setDeviceAnnounced();
|
||||||
});
|
});
|
||||||
@@ -1227,7 +1228,7 @@ Crypto.prototype._flushNewDeviceRequests = function() {
|
|||||||
users.map(function(u) {
|
users.map(function(u) {
|
||||||
r[u] = r[u].catch(function(e) {
|
r[u] = r[u].catch(function(e) {
|
||||||
console.error(
|
console.error(
|
||||||
'Error updating device keys for user ' + u + ':', e
|
'Error updating device keys for user ' + u + ':', e,
|
||||||
);
|
);
|
||||||
|
|
||||||
// reinstate the pending flags on any users which failed; this will
|
// reinstate the pending flags on any users which failed; this will
|
||||||
@@ -1279,7 +1280,7 @@ Crypto.prototype._getRoomDecryptor = function(roomId, algorithm) {
|
|||||||
const AlgClass = algorithms.DECRYPTION_CLASSES[algorithm];
|
const AlgClass = algorithms.DECRYPTION_CLASSES[algorithm];
|
||||||
if (!AlgClass) {
|
if (!AlgClass) {
|
||||||
throw new algorithms.DecryptionError(
|
throw new algorithms.DecryptionError(
|
||||||
'Unknown encryption algorithm "' + algorithm + '".'
|
'Unknown encryption algorithm "' + algorithm + '".',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
alg = new AlgClass({
|
alg = new AlgClass({
|
||||||
|
@@ -52,7 +52,7 @@ module.exports.MEGOLM_ALGORITHM = "m.megolm.v1.aes-sha2";
|
|||||||
module.exports.encryptMessageForDevice = function(
|
module.exports.encryptMessageForDevice = function(
|
||||||
resultsObject,
|
resultsObject,
|
||||||
ourUserId, ourDeviceId, olmDevice, recipientUserId, recipientDevice,
|
ourUserId, ourDeviceId, olmDevice, recipientUserId, recipientDevice,
|
||||||
payloadFields
|
payloadFields,
|
||||||
) {
|
) {
|
||||||
const deviceKey = recipientDevice.getIdentityKey();
|
const deviceKey = recipientDevice.getIdentityKey();
|
||||||
const sessionId = olmDevice.getSessionIdForDevice(deviceKey);
|
const sessionId = olmDevice.getSessionIdForDevice(deviceKey);
|
||||||
@@ -64,7 +64,7 @@ module.exports.encryptMessageForDevice = function(
|
|||||||
|
|
||||||
console.log(
|
console.log(
|
||||||
"Using sessionid " + sessionId + " for device " +
|
"Using sessionid " + sessionId + " for device " +
|
||||||
recipientUserId + ":" + recipientDevice.deviceId
|
recipientUserId + ":" + recipientDevice.deviceId,
|
||||||
);
|
);
|
||||||
|
|
||||||
const payload = {
|
const payload = {
|
||||||
@@ -100,7 +100,7 @@ module.exports.encryptMessageForDevice = function(
|
|||||||
utils.extend(payload, payloadFields);
|
utils.extend(payload, payloadFields);
|
||||||
|
|
||||||
resultsObject[deviceKey] = olmDevice.encryptMessage(
|
resultsObject[deviceKey] = olmDevice.encryptMessage(
|
||||||
deviceKey, sessionId, JSON.stringify(payload)
|
deviceKey, sessionId, JSON.stringify(payload),
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -119,7 +119,7 @@ module.exports.encryptMessageForDevice = function(
|
|||||||
* {@link module:crypto~OlmSessionResult}
|
* {@link module:crypto~OlmSessionResult}
|
||||||
*/
|
*/
|
||||||
module.exports.ensureOlmSessionsForDevices = function(
|
module.exports.ensureOlmSessionsForDevices = function(
|
||||||
olmDevice, baseApis, devicesByUser
|
olmDevice, baseApis, devicesByUser,
|
||||||
) {
|
) {
|
||||||
const devicesWithoutSession = [
|
const devicesWithoutSession = [
|
||||||
// [userId, deviceId], ...
|
// [userId, deviceId], ...
|
||||||
@@ -159,7 +159,7 @@ module.exports.ensureOlmSessionsForDevices = function(
|
|||||||
|
|
||||||
const oneTimeKeyAlgorithm = "signed_curve25519";
|
const oneTimeKeyAlgorithm = "signed_curve25519";
|
||||||
return baseApis.claimOneTimeKeys(
|
return baseApis.claimOneTimeKeys(
|
||||||
devicesWithoutSession, oneTimeKeyAlgorithm
|
devicesWithoutSession, oneTimeKeyAlgorithm,
|
||||||
).then(function(res) {
|
).then(function(res) {
|
||||||
const otk_res = res.one_time_keys || {};
|
const otk_res = res.one_time_keys || {};
|
||||||
for (const userId in devicesByUser) {
|
for (const userId in devicesByUser) {
|
||||||
@@ -187,13 +187,13 @@ module.exports.ensureOlmSessionsForDevices = function(
|
|||||||
if (!oneTimeKey) {
|
if (!oneTimeKey) {
|
||||||
console.warn(
|
console.warn(
|
||||||
"No one-time keys (alg=" + oneTimeKeyAlgorithm +
|
"No one-time keys (alg=" + oneTimeKeyAlgorithm +
|
||||||
") for device " + userId + ":" + deviceId
|
") for device " + userId + ":" + deviceId,
|
||||||
);
|
);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const sid = _verifyKeyAndStartSession(
|
const sid = _verifyKeyAndStartSession(
|
||||||
olmDevice, oneTimeKey, userId, deviceInfo
|
olmDevice, oneTimeKey, userId, deviceInfo,
|
||||||
);
|
);
|
||||||
result[userId][deviceId].sessionId = sid;
|
result[userId][deviceId].sessionId = sid;
|
||||||
}
|
}
|
||||||
@@ -208,12 +208,12 @@ function _verifyKeyAndStartSession(olmDevice, oneTimeKey, userId, deviceInfo) {
|
|||||||
try {
|
try {
|
||||||
_verifySignature(
|
_verifySignature(
|
||||||
olmDevice, oneTimeKey, userId, deviceId,
|
olmDevice, oneTimeKey, userId, deviceId,
|
||||||
deviceInfo.getFingerprint()
|
deviceInfo.getFingerprint(),
|
||||||
);
|
);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(
|
console.error(
|
||||||
"Unable to verify signature on one-time key for device " +
|
"Unable to verify signature on one-time key for device " +
|
||||||
userId + ":" + deviceId + ":", e
|
userId + ":" + deviceId + ":", e,
|
||||||
);
|
);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -221,7 +221,7 @@ function _verifyKeyAndStartSession(olmDevice, oneTimeKey, userId, deviceInfo) {
|
|||||||
let sid;
|
let sid;
|
||||||
try {
|
try {
|
||||||
sid = olmDevice.createOutboundSession(
|
sid = olmDevice.createOutboundSession(
|
||||||
deviceInfo.getIdentityKey(), oneTimeKey.key
|
deviceInfo.getIdentityKey(), oneTimeKey.key,
|
||||||
);
|
);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// possibly a bad key
|
// possibly a bad key
|
||||||
@@ -251,7 +251,7 @@ function _verifyKeyAndStartSession(olmDevice, oneTimeKey, userId, deviceInfo) {
|
|||||||
* @param {string} signingKey base64-ed ed25519 public key
|
* @param {string} signingKey base64-ed ed25519 public key
|
||||||
*/
|
*/
|
||||||
const _verifySignature = module.exports.verifySignature = function(
|
const _verifySignature = module.exports.verifySignature = function(
|
||||||
olmDevice, obj, signingUserId, signingDeviceId, signingKey
|
olmDevice, obj, signingUserId, signingDeviceId, signingKey,
|
||||||
) {
|
) {
|
||||||
const signKeyId = "ed25519:" + signingDeviceId;
|
const signKeyId = "ed25519:" + signingDeviceId;
|
||||||
const signatures = obj.signatures || {};
|
const signatures = obj.signatures || {};
|
||||||
@@ -268,6 +268,6 @@ const _verifySignature = module.exports.verifySignature = function(
|
|||||||
const json = anotherjson.stringify(obj);
|
const json = anotherjson.stringify(obj);
|
||||||
|
|
||||||
olmDevice.verifySignature(
|
olmDevice.verifySignature(
|
||||||
signingKey, json, signature
|
signingKey, json, signature,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@@ -70,7 +70,7 @@ FilterComponent.prototype.check = function(event) {
|
|||||||
event.getRoomId(),
|
event.getRoomId(),
|
||||||
event.getSender(),
|
event.getSender(),
|
||||||
event.getType(),
|
event.getType(),
|
||||||
event.getContent() ? event.getContent().url !== undefined : false
|
event.getContent() ? event.getContent().url !== undefined : false,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -123,7 +123,7 @@ Filter.prototype.setDefinition = function(definition) {
|
|||||||
|
|
||||||
this._room_filter = new FilterComponent(room_filter_fields);
|
this._room_filter = new FilterComponent(room_filter_fields);
|
||||||
this._room_timeline_filter = new FilterComponent(
|
this._room_timeline_filter = new FilterComponent(
|
||||||
room_filter_json ? (room_filter_json.timeline || {}) : {}
|
room_filter_json ? (room_filter_json.timeline || {}) : {},
|
||||||
);
|
);
|
||||||
|
|
||||||
// don't bother porting this from synapse yet:
|
// don't bother porting this from synapse yet:
|
||||||
|
@@ -163,7 +163,7 @@ module.exports.MatrixHttpApi.prototype = {
|
|||||||
"Returning the raw JSON from uploadContent(). Future " +
|
"Returning the raw JSON from uploadContent(). Future " +
|
||||||
"versions of the js-sdk will change this default, to " +
|
"versions of the js-sdk will change this default, to " +
|
||||||
"return the parsed object. Set opts.rawResponse=false " +
|
"return the parsed object. Set opts.rawResponse=false " +
|
||||||
"to change this behaviour now."
|
"to change this behaviour now.",
|
||||||
);
|
);
|
||||||
rawResponse = true;
|
rawResponse = true;
|
||||||
}
|
}
|
||||||
@@ -176,7 +176,7 @@ module.exports.MatrixHttpApi.prototype = {
|
|||||||
"Returning only the content-uri from uploadContent(). " +
|
"Returning only the content-uri from uploadContent(). " +
|
||||||
"Future versions of the js-sdk will change this " +
|
"Future versions of the js-sdk will change this " +
|
||||||
"default, to return the whole response object. Set " +
|
"default, to return the whole response object. Set " +
|
||||||
"opts.onlyContentUri=false to change this behaviour now."
|
"opts.onlyContentUri=false to change this behaviour now.",
|
||||||
);
|
);
|
||||||
onlyContentUri = true;
|
onlyContentUri = true;
|
||||||
} else {
|
} else {
|
||||||
@@ -279,7 +279,7 @@ module.exports.MatrixHttpApi.prototype = {
|
|||||||
headers: {"Content-Type": contentType},
|
headers: {"Content-Type": contentType},
|
||||||
json: false,
|
json: false,
|
||||||
bodyParser: bodyParser,
|
bodyParser: bodyParser,
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -321,7 +321,7 @@ module.exports.MatrixHttpApi.prototype = {
|
|||||||
|
|
||||||
if (callback !== undefined && !utils.isFunction(callback)) {
|
if (callback !== undefined && !utils.isFunction(callback)) {
|
||||||
throw Error(
|
throw Error(
|
||||||
"Expected callback to be a function but got " + typeof callback
|
"Expected callback to be a function but got " + typeof callback,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -341,7 +341,7 @@ module.exports.MatrixHttpApi.prototype = {
|
|||||||
const defer = q.defer();
|
const defer = q.defer();
|
||||||
this.opts.request(
|
this.opts.request(
|
||||||
opts,
|
opts,
|
||||||
requestCallback(defer, callback, this.opts.onlyData)
|
requestCallback(defer, callback, this.opts.onlyData),
|
||||||
);
|
);
|
||||||
// ID server does not always take JSON, so we can't use requests' 'json'
|
// ID server does not always take JSON, so we can't use requests' 'json'
|
||||||
// option as we do with the home server, but it does return JSON, so
|
// option as we do with the home server, but it does return JSON, so
|
||||||
@@ -390,7 +390,7 @@ module.exports.MatrixHttpApi.prototype = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const request_promise = this.request(
|
const request_promise = this.request(
|
||||||
callback, method, path, queryParams, data, opts
|
callback, method, path, queryParams, data, opts,
|
||||||
);
|
);
|
||||||
|
|
||||||
const self = this;
|
const self = this;
|
||||||
@@ -441,7 +441,7 @@ module.exports.MatrixHttpApi.prototype = {
|
|||||||
const fullUri = this.opts.baseUrl + prefix + path;
|
const fullUri = this.opts.baseUrl + prefix + path;
|
||||||
|
|
||||||
return this.requestOtherUrl(
|
return this.requestOtherUrl(
|
||||||
callback, method, fullUri, queryParams, data, opts
|
callback, method, fullUri, queryParams, data, opts,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -476,7 +476,7 @@ module.exports.MatrixHttpApi.prototype = {
|
|||||||
callback, method, path, queryParams, data, {
|
callback, method, path, queryParams, data, {
|
||||||
localTimeoutMs: localTimeoutMs,
|
localTimeoutMs: localTimeoutMs,
|
||||||
prefix: prefix,
|
prefix: prefix,
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -511,7 +511,7 @@ module.exports.MatrixHttpApi.prototype = {
|
|||||||
callback, method, path, queryParams, data, {
|
callback, method, path, queryParams, data, {
|
||||||
localTimeoutMs: localTimeoutMs,
|
localTimeoutMs: localTimeoutMs,
|
||||||
prefix: prefix,
|
prefix: prefix,
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -556,7 +556,7 @@ module.exports.MatrixHttpApi.prototype = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return this._request(
|
return this._request(
|
||||||
callback, method, uri, queryParams, data, opts
|
callback, method, uri, queryParams, data, opts,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -608,7 +608,7 @@ module.exports.MatrixHttpApi.prototype = {
|
|||||||
_request: function(callback, method, uri, queryParams, data, opts) {
|
_request: function(callback, method, uri, queryParams, data, opts) {
|
||||||
if (callback !== undefined && !utils.isFunction(callback)) {
|
if (callback !== undefined && !utils.isFunction(callback)) {
|
||||||
throw Error(
|
throw Error(
|
||||||
"Expected callback to be a function but got " + typeof callback
|
"Expected callback to be a function but got " + typeof callback,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
opts = opts || {};
|
opts = opts || {};
|
||||||
@@ -674,10 +674,10 @@ module.exports.MatrixHttpApi.prototype = {
|
|||||||
const handlerFn = requestCallback(
|
const handlerFn = requestCallback(
|
||||||
defer, callback, self.opts.onlyData,
|
defer, callback, self.opts.onlyData,
|
||||||
parseErrorJson,
|
parseErrorJson,
|
||||||
opts.bodyParser
|
opts.bodyParser,
|
||||||
);
|
);
|
||||||
handlerFn(err, response, body);
|
handlerFn(err, response, body);
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
if (req && req.abort) {
|
if (req && req.abort) {
|
||||||
// FIXME: This is EVIL, but I can't think of a better way to expose
|
// FIXME: This is EVIL, but I can't think of a better way to expose
|
||||||
@@ -707,7 +707,7 @@ module.exports.MatrixHttpApi.prototype = {
|
|||||||
*/
|
*/
|
||||||
const requestCallback = function(
|
const requestCallback = function(
|
||||||
defer, userDefinedCallback, onlyData,
|
defer, userDefinedCallback, onlyData,
|
||||||
parseErrorJson, bodyParser
|
parseErrorJson, bodyParser,
|
||||||
) {
|
) {
|
||||||
userDefinedCallback = userDefinedCallback || function() {};
|
userDefinedCallback = userDefinedCallback || function() {};
|
||||||
|
|
||||||
|
@@ -154,7 +154,7 @@ InteractiveAuth.prototype = {
|
|||||||
}
|
}
|
||||||
self._data = error.data;
|
self._data = error.data;
|
||||||
self._startNextAuthStage();
|
self._startNextAuthStage();
|
||||||
}
|
},
|
||||||
).catch(this._completionDeferred.reject).done();
|
).catch(this._completionDeferred.reject).done();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@@ -259,14 +259,14 @@ EventTimelineSet.prototype.addEventsToTimeline = function(events, toStartOfTimel
|
|||||||
timeline, paginationToken) {
|
timeline, paginationToken) {
|
||||||
if (!timeline) {
|
if (!timeline) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
"'timeline' not specified for EventTimelineSet.addEventsToTimeline"
|
"'timeline' not specified for EventTimelineSet.addEventsToTimeline",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!toStartOfTimeline && timeline == this._liveTimeline) {
|
if (!toStartOfTimeline && timeline == this._liveTimeline) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
"EventTimelineSet.addEventsToTimeline cannot be used for adding events to " +
|
"EventTimelineSet.addEventsToTimeline cannot be used for adding events to " +
|
||||||
"the live timeline - use Room.addLiveEvents instead"
|
"the live timeline - use Room.addLiveEvents instead",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -440,7 +440,7 @@ EventTimelineSet.prototype.addLiveEvent = function(event, duplicateStrategy) {
|
|||||||
EventTimeline.setEventMetadata(
|
EventTimeline.setEventMetadata(
|
||||||
event,
|
event,
|
||||||
timeline.getState(EventTimeline.FORWARDS),
|
timeline.getState(EventTimeline.FORWARDS),
|
||||||
false
|
false,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!tlEvents[j].encryptedType) {
|
if (!tlEvents[j].encryptedType) {
|
||||||
|
@@ -79,7 +79,7 @@ EventTimeline.prototype.initialiseState = function(stateEvents) {
|
|||||||
utils.deepCopy(
|
utils.deepCopy(
|
||||||
stateEvents.map(function(mxEvent) {
|
stateEvents.map(function(mxEvent) {
|
||||||
return mxEvent.event;
|
return mxEvent.event;
|
||||||
})
|
}),
|
||||||
),
|
),
|
||||||
function(ev) {
|
function(ev) {
|
||||||
return new MatrixEvent(ev);
|
return new MatrixEvent(ev);
|
||||||
@@ -288,11 +288,11 @@ EventTimeline.prototype.addEvent = function(event, atStart) {
|
|||||||
EventTimeline.setEventMetadata = function(event, stateContext, toStartOfTimeline) {
|
EventTimeline.setEventMetadata = function(event, stateContext, toStartOfTimeline) {
|
||||||
// set sender and target properties
|
// set sender and target properties
|
||||||
event.sender = stateContext.getSentinelMember(
|
event.sender = stateContext.getSentinelMember(
|
||||||
event.getSender()
|
event.getSender(),
|
||||||
);
|
);
|
||||||
if (event.getType() === "m.room.member") {
|
if (event.getType() === "m.room.member") {
|
||||||
event.target = stateContext.getSentinelMember(
|
event.target = stateContext.getSentinelMember(
|
||||||
event.getStateKey()
|
event.getStateKey(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (event.isState()) {
|
if (event.isState()) {
|
||||||
|
@@ -70,7 +70,7 @@ module.exports.EventStatus = {
|
|||||||
* Default: true. <strong>This property is experimental and may change.</strong>
|
* Default: true. <strong>This property is experimental and may change.</strong>
|
||||||
*/
|
*/
|
||||||
module.exports.MatrixEvent = function MatrixEvent(
|
module.exports.MatrixEvent = function MatrixEvent(
|
||||||
event
|
event,
|
||||||
) {
|
) {
|
||||||
this.event = event || {};
|
this.event = event || {};
|
||||||
this.sender = null;
|
this.sender = null;
|
||||||
|
@@ -197,13 +197,13 @@ RoomMember.prototype.getAvatarUrl =
|
|||||||
}
|
}
|
||||||
const rawUrl = this.events.member ? this.events.member.getContent().avatar_url : null;
|
const rawUrl = this.events.member ? this.events.member.getContent().avatar_url : null;
|
||||||
const httpUrl = ContentRepo.getHttpUriForMxc(
|
const httpUrl = ContentRepo.getHttpUriForMxc(
|
||||||
baseUrl, rawUrl, width, height, resizeMethod, allowDirectLinks
|
baseUrl, rawUrl, width, height, resizeMethod, allowDirectLinks,
|
||||||
);
|
);
|
||||||
if (httpUrl) {
|
if (httpUrl) {
|
||||||
return httpUrl;
|
return httpUrl;
|
||||||
} else if (allowDefault) {
|
} else if (allowDefault) {
|
||||||
return ContentRepo.getIdenticonUri(
|
return ContentRepo.getIdenticonUri(
|
||||||
baseUrl, this.userId, width, height
|
baseUrl, this.userId, width, height,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
@@ -133,7 +133,7 @@ RoomState.prototype.setStateEvents = function(stateEvents) {
|
|||||||
self.events[event.getType()][event.getStateKey()] = event;
|
self.events[event.getType()][event.getStateKey()] = event;
|
||||||
if (event.getType() === "m.room.member") {
|
if (event.getType() === "m.room.member") {
|
||||||
_updateDisplayNameCache(
|
_updateDisplayNameCache(
|
||||||
self, event.getStateKey(), event.getContent().displayname
|
self, event.getStateKey(), event.getContent().displayname,
|
||||||
);
|
);
|
||||||
_updateThirdPartyTokenCache(self, event);
|
_updateThirdPartyTokenCache(self, event);
|
||||||
}
|
}
|
||||||
@@ -360,7 +360,7 @@ function _updateThirdPartyTokenCache(roomState, memberEvent) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const threePidInvite = roomState.getStateEvents(
|
const threePidInvite = roomState.getStateEvents(
|
||||||
"m.room.third_party_invite", token
|
"m.room.third_party_invite", token,
|
||||||
);
|
);
|
||||||
if (!threePidInvite) {
|
if (!threePidInvite) {
|
||||||
return;
|
return;
|
||||||
|
@@ -108,7 +108,7 @@ function Room(roomId, opts) {
|
|||||||
if (["chronological", "detached"].indexOf(opts.pendingEventOrdering) === -1) {
|
if (["chronological", "detached"].indexOf(opts.pendingEventOrdering) === -1) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
"opts.pendingEventOrdering MUST be either 'chronological' or " +
|
"opts.pendingEventOrdering MUST be either 'chronological' or " +
|
||||||
"'detached'. Got: '" + opts.pendingEventOrdering + "'"
|
"'detached'. Got: '" + opts.pendingEventOrdering + "'",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -339,11 +339,11 @@ Room.prototype.getAvatarUrl = function(baseUrl, width, height, resizeMethod,
|
|||||||
const mainUrl = roomAvatarEvent ? roomAvatarEvent.getContent().url : null;
|
const mainUrl = roomAvatarEvent ? roomAvatarEvent.getContent().url : null;
|
||||||
if (mainUrl) {
|
if (mainUrl) {
|
||||||
return ContentRepo.getHttpUriForMxc(
|
return ContentRepo.getHttpUriForMxc(
|
||||||
baseUrl, mainUrl, width, height, resizeMethod
|
baseUrl, mainUrl, width, height, resizeMethod,
|
||||||
);
|
);
|
||||||
} else if (allowDefault) {
|
} else if (allowDefault) {
|
||||||
return ContentRepo.getIdenticonUri(
|
return ContentRepo.getIdenticonUri(
|
||||||
baseUrl, this.roomId, width, height
|
baseUrl, this.roomId, width, height,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -365,7 +365,7 @@ Room.prototype.getAliases = function() {
|
|||||||
const alias_event = alias_events[i];
|
const alias_event = alias_events[i];
|
||||||
if (utils.isArray(alias_event.getContent().aliases)) {
|
if (utils.isArray(alias_event.getContent().aliases)) {
|
||||||
Array.prototype.push.apply(
|
Array.prototype.push.apply(
|
||||||
alias_strings, alias_event.getContent().aliases
|
alias_strings, alias_event.getContent().aliases,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -410,7 +410,7 @@ Room.prototype.addEventsToTimeline = function(events, toStartOfTimeline,
|
|||||||
timeline, paginationToken) {
|
timeline, paginationToken) {
|
||||||
timeline.getTimelineSet().addEventsToTimeline(
|
timeline.getTimelineSet().addEventsToTimeline(
|
||||||
events, toStartOfTimeline,
|
events, toStartOfTimeline,
|
||||||
timeline, paginationToken
|
timeline, paginationToken,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -508,7 +508,7 @@ Room.prototype.getOrCreateFilteredTimelineSet = function(filter) {
|
|||||||
|
|
||||||
timelineSet.getLiveTimeline().setPaginationToken(
|
timelineSet.getLiveTimeline().setPaginationToken(
|
||||||
timeline.getPaginationToken(EventTimeline.BACKWARDS),
|
timeline.getPaginationToken(EventTimeline.BACKWARDS),
|
||||||
EventTimeline.BACKWARDS
|
EventTimeline.BACKWARDS,
|
||||||
);
|
);
|
||||||
|
|
||||||
// alternatively, we could try to do something like this to try and re-paginate
|
// alternatively, we could try to do something like this to try and re-paginate
|
||||||
@@ -589,7 +589,7 @@ Room.prototype._addLiveEvent = function(event, duplicateStrategy) {
|
|||||||
// pointing to an event that wasn't yet in the timeline
|
// pointing to an event that wasn't yet in the timeline
|
||||||
if (event.sender) {
|
if (event.sender) {
|
||||||
this.addReceipt(synthesizeReceipt(
|
this.addReceipt(synthesizeReceipt(
|
||||||
event.sender.userId, event, "m.read"
|
event.sender.userId, event, "m.read",
|
||||||
), true);
|
), true);
|
||||||
|
|
||||||
// Any live events from a user could be taken as implicit
|
// Any live events from a user could be taken as implicit
|
||||||
@@ -636,7 +636,7 @@ Room.prototype.addPendingEvent = function(event, txnId) {
|
|||||||
EventTimeline.setEventMetadata(
|
EventTimeline.setEventMetadata(
|
||||||
event,
|
event,
|
||||||
this.getLiveTimeline().getState(EventTimeline.FORWARDS),
|
this.getLiveTimeline().getState(EventTimeline.FORWARDS),
|
||||||
false
|
false,
|
||||||
);
|
);
|
||||||
|
|
||||||
this._txnToEvent[txnId] = event;
|
this._txnToEvent[txnId] = event;
|
||||||
@@ -689,7 +689,7 @@ Room.prototype._handleRemoteEcho = function(remoteEvent, localEvent) {
|
|||||||
this._pendingEventList,
|
this._pendingEventList,
|
||||||
function(ev) {
|
function(ev) {
|
||||||
return ev.getId() == oldEventId;
|
return ev.getId() == oldEventId;
|
||||||
}, false
|
}, false,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -798,7 +798,7 @@ Room.prototype.updatePendingEvent = function(event, newStatus, newEventId) {
|
|||||||
this._pendingEventList,
|
this._pendingEventList,
|
||||||
function(ev) {
|
function(ev) {
|
||||||
return ev.getId() == oldEventId;
|
return ev.getId() == oldEventId;
|
||||||
}, false
|
}, false,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
this.removeEvent(oldEventId);
|
this.removeEvent(oldEventId);
|
||||||
@@ -836,13 +836,13 @@ Room.prototype.addLiveEvents = function(events, duplicateStrategy) {
|
|||||||
if (liveTimeline.getPaginationToken(EventTimeline.FORWARDS)) {
|
if (liveTimeline.getPaginationToken(EventTimeline.FORWARDS)) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
"live timeline " + i + " is no longer live - it has a pagination token " +
|
"live timeline " + i + " is no longer live - it has a pagination token " +
|
||||||
"(" + liveTimeline.getPaginationToken(EventTimeline.FORWARDS) + ")"
|
"(" + liveTimeline.getPaginationToken(EventTimeline.FORWARDS) + ")",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (liveTimeline.getNeighbouringTimeline(EventTimeline.FORWARDS)) {
|
if (liveTimeline.getNeighbouringTimeline(EventTimeline.FORWARDS)) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
"live timeline " + i + " is no longer live - " +
|
"live timeline " + i + " is no longer live - " +
|
||||||
"it has a neighbouring timeline"
|
"it has a neighbouring timeline",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -904,13 +904,13 @@ Room.prototype.recalculate = function(userId) {
|
|||||||
// consistent elsewhere.
|
// consistent elsewhere.
|
||||||
const self = this;
|
const self = this;
|
||||||
const membershipEvent = this.currentState.getStateEvents(
|
const membershipEvent = this.currentState.getStateEvents(
|
||||||
"m.room.member", userId
|
"m.room.member", userId,
|
||||||
);
|
);
|
||||||
if (membershipEvent && membershipEvent.getContent().membership === "invite") {
|
if (membershipEvent && membershipEvent.getContent().membership === "invite") {
|
||||||
const strippedStateEvents = membershipEvent.event.invite_room_state || [];
|
const strippedStateEvents = membershipEvent.event.invite_room_state || [];
|
||||||
utils.forEach(strippedStateEvents, function(strippedEvent) {
|
utils.forEach(strippedStateEvents, function(strippedEvent) {
|
||||||
const existingEvent = self.currentState.getStateEvents(
|
const existingEvent = self.currentState.getStateEvents(
|
||||||
strippedEvent.type, strippedEvent.state_key
|
strippedEvent.type, strippedEvent.state_key,
|
||||||
);
|
);
|
||||||
if (!existingEvent) {
|
if (!existingEvent) {
|
||||||
// set the fake stripped event instead
|
// set the fake stripped event instead
|
||||||
@@ -1193,7 +1193,7 @@ function calculateRoomName(room, userId, ignoreRoomNameEvent) {
|
|||||||
if (room.currentState.getMember(myMemberEvent.sender)) {
|
if (room.currentState.getMember(myMemberEvent.sender)) {
|
||||||
// extract who invited us to the room
|
// extract who invited us to the room
|
||||||
return "Invite from " + room.currentState.getMember(
|
return "Invite from " + room.currentState.getMember(
|
||||||
myMemberEvent.sender
|
myMemberEvent.sender,
|
||||||
).name;
|
).name;
|
||||||
} else if (allMembers[0].events.member) {
|
} else if (allMembers[0].events.member) {
|
||||||
// use the sender field from the invite event, although this only
|
// use the sender field from the invite event, although this only
|
||||||
|
@@ -88,7 +88,7 @@ module.exports.setTimeout = function(func, delayMs) {
|
|||||||
const idx = binarySearch(
|
const idx = binarySearch(
|
||||||
_callbackList, function(el) {
|
_callbackList, function(el) {
|
||||||
return el.runAt - runAt;
|
return el.runAt - runAt;
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
_callbackList.splice(idx, 0, data);
|
_callbackList.splice(idx, 0, data);
|
||||||
|
@@ -126,7 +126,7 @@ MatrixScheduler.prototype.queueEvent = function(event) {
|
|||||||
});
|
});
|
||||||
debuglog(
|
debuglog(
|
||||||
"Queue algorithm dumped event %s into queue '%s'",
|
"Queue algorithm dumped event %s into queue '%s'",
|
||||||
event.getId(), queueName
|
event.getId(), queueName,
|
||||||
);
|
);
|
||||||
_startProcessingQueues(this);
|
_startProcessingQueues(this);
|
||||||
return defer.promise;
|
return defer.promise;
|
||||||
@@ -213,7 +213,7 @@ function _processQueue(scheduler, queueName) {
|
|||||||
}
|
}
|
||||||
debuglog(
|
debuglog(
|
||||||
"Queue '%s' has %s pending events",
|
"Queue '%s' has %s pending events",
|
||||||
queueName, scheduler._queues[queueName].length
|
queueName, scheduler._queues[queueName].length,
|
||||||
);
|
);
|
||||||
// fire the process function and if it resolves, resolve the deferred. Else
|
// fire the process function and if it resolves, resolve the deferred. Else
|
||||||
// invoke the retry algorithm.
|
// invoke the retry algorithm.
|
||||||
@@ -230,11 +230,11 @@ function _processQueue(scheduler, queueName) {
|
|||||||
const waitTimeMs = scheduler.retryAlgorithm(obj.event, obj.attempts, err);
|
const waitTimeMs = scheduler.retryAlgorithm(obj.event, obj.attempts, err);
|
||||||
debuglog(
|
debuglog(
|
||||||
"retry(%s) err=%s event_id=%s waitTime=%s",
|
"retry(%s) err=%s event_id=%s waitTime=%s",
|
||||||
obj.attempts, err, obj.event.getId(), waitTimeMs
|
obj.attempts, err, obj.event.getId(), waitTimeMs,
|
||||||
);
|
);
|
||||||
if (waitTimeMs === -1) { // give up (you quitter!)
|
if (waitTimeMs === -1) { // give up (you quitter!)
|
||||||
debuglog(
|
debuglog(
|
||||||
"Queue '%s' giving up on event %s", queueName, obj.event.getId()
|
"Queue '%s' giving up on event %s", queueName, obj.event.getId(),
|
||||||
);
|
);
|
||||||
// remove this from the queue
|
// remove this from the queue
|
||||||
_removeNextEvent(scheduler, queueName);
|
_removeNextEvent(scheduler, queueName);
|
||||||
|
@@ -102,7 +102,7 @@ module.exports.MatrixInMemoryStore.prototype = {
|
|||||||
user.setDisplayName(member.name);
|
user.setDisplayName(member.name);
|
||||||
if (member.events.member) {
|
if (member.events.member) {
|
||||||
user.setRawDisplayName(
|
user.setRawDisplayName(
|
||||||
member.events.member.getDirectionalContent().displayname
|
member.events.member.getDirectionalContent().displayname,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -42,7 +42,7 @@ function WebStorageSessionStore(webStore) {
|
|||||||
typeof(webStore.length) !== 'number'
|
typeof(webStore.length) !== 'number'
|
||||||
) {
|
) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
"Supplied webStore does not meet the WebStorage API interface"
|
"Supplied webStore does not meet the WebStorage API interface",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -109,7 +109,7 @@ WebStorageSessionStore.prototype = {
|
|||||||
const sessions = this.getEndToEndSessions(deviceKey) || {};
|
const sessions = this.getEndToEndSessions(deviceKey) || {};
|
||||||
sessions[sessionId] = session;
|
sessions[sessionId] = session;
|
||||||
setJsonItem(
|
setJsonItem(
|
||||||
this.store, keyEndToEndSessions(deviceKey), sessions
|
this.store, keyEndToEndSessions(deviceKey), sessions,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
37
src/sync.js
37
src/sync.js
@@ -93,7 +93,6 @@ SyncApi.prototype.createRoom = function(roomId) {
|
|||||||
pendingEventOrdering: this.opts.pendingEventOrdering,
|
pendingEventOrdering: this.opts.pendingEventOrdering,
|
||||||
timelineSupport: client.timelineSupport,
|
timelineSupport: client.timelineSupport,
|
||||||
});
|
});
|
||||||
|
|
||||||
reEmit(client, room, ["Room.name", "Room.timeline", "Room.redaction",
|
reEmit(client, room, ["Room.name", "Room.timeline", "Room.redaction",
|
||||||
"Room.receipt", "Room.tags",
|
"Room.receipt", "Room.tags",
|
||||||
"Room.timelineReset",
|
"Room.timelineReset",
|
||||||
@@ -123,7 +122,7 @@ SyncApi.prototype._registerStateListeners = function(room) {
|
|||||||
[
|
[
|
||||||
"RoomMember.name", "RoomMember.typing", "RoomMember.powerLevel",
|
"RoomMember.name", "RoomMember.typing", "RoomMember.powerLevel",
|
||||||
"RoomMember.membership",
|
"RoomMember.membership",
|
||||||
]
|
],
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -159,11 +158,11 @@ SyncApi.prototype.syncLeftRooms = function() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return client.getOrCreateFilter(
|
return client.getOrCreateFilter(
|
||||||
getFilterName(client.credentials.userId, "LEFT_ROOMS"), filter
|
getFilterName(client.credentials.userId, "LEFT_ROOMS"), filter,
|
||||||
).then(function(filterId) {
|
).then(function(filterId) {
|
||||||
qps.filter = filterId;
|
qps.filter = filterId;
|
||||||
return client._http.authedRequest(
|
return client._http.authedRequest(
|
||||||
undefined, "GET", "/sync", qps, undefined, localTimeoutMs
|
undefined, "GET", "/sync", qps, undefined, localTimeoutMs,
|
||||||
);
|
);
|
||||||
}).then(function(data) {
|
}).then(function(data) {
|
||||||
let leaveRooms = [];
|
let leaveRooms = [];
|
||||||
@@ -227,13 +226,13 @@ SyncApi.prototype.peek = function(roomId) {
|
|||||||
// FIXME: Mostly duplicated from _processRoomEvents but not entirely
|
// FIXME: Mostly duplicated from _processRoomEvents but not entirely
|
||||||
// because "state" in this API is at the BEGINNING of the chunk
|
// because "state" in this API is at the BEGINNING of the chunk
|
||||||
const oldStateEvents = utils.map(
|
const oldStateEvents = utils.map(
|
||||||
utils.deepCopy(response.state), client.getEventMapper()
|
utils.deepCopy(response.state), client.getEventMapper(),
|
||||||
);
|
);
|
||||||
const stateEvents = utils.map(
|
const stateEvents = utils.map(
|
||||||
response.state, client.getEventMapper()
|
response.state, client.getEventMapper(),
|
||||||
);
|
);
|
||||||
const messages = utils.map(
|
const messages = utils.map(
|
||||||
response.messages.chunk, client.getEventMapper()
|
response.messages.chunk, client.getEventMapper(),
|
||||||
);
|
);
|
||||||
|
|
||||||
// XXX: copypasted from /sync until we kill off this
|
// XXX: copypasted from /sync until we kill off this
|
||||||
@@ -402,7 +401,7 @@ SyncApi.prototype.sync = function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
client.getOrCreateFilter(
|
client.getOrCreateFilter(
|
||||||
getFilterName(client.credentials.userId), filter
|
getFilterName(client.credentials.userId), filter,
|
||||||
).done(function(filterId) {
|
).done(function(filterId) {
|
||||||
// reset the notifications timeline to prepare it to paginate from
|
// reset the notifications timeline to prepare it to paginate from
|
||||||
// the current point in time.
|
// the current point in time.
|
||||||
@@ -512,7 +511,7 @@ SyncApi.prototype._sync = function(syncOptions) {
|
|||||||
const clientSideTimeoutMs = this.opts.pollTimeout + BUFFER_PERIOD_MS;
|
const clientSideTimeoutMs = this.opts.pollTimeout + BUFFER_PERIOD_MS;
|
||||||
|
|
||||||
this._currentSyncRequest = client._http.authedRequest(
|
this._currentSyncRequest = client._http.authedRequest(
|
||||||
undefined, "GET", "/sync", qps, undefined, clientSideTimeoutMs
|
undefined, "GET", "/sync", qps, undefined, clientSideTimeoutMs,
|
||||||
);
|
);
|
||||||
|
|
||||||
this._currentSyncRequest.done(function(data) {
|
this._currentSyncRequest.done(function(data) {
|
||||||
@@ -645,7 +644,7 @@ SyncApi.prototype._processSyncResponse = function(syncToken, data) {
|
|||||||
}
|
}
|
||||||
client.emit("accountData", accountDataEvent);
|
client.emit("accountData", accountDataEvent);
|
||||||
return accountDataEvent;
|
return accountDataEvent;
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -661,13 +660,13 @@ SyncApi.prototype._processSyncResponse = function(syncToken, data) {
|
|||||||
content.msgtype == "m.bad.encrypted"
|
content.msgtype == "m.bad.encrypted"
|
||||||
) {
|
) {
|
||||||
console.warn(
|
console.warn(
|
||||||
"Unable to decrypt to-device event: " + content.body
|
"Unable to decrypt to-device event: " + content.body,
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
client.emit("toDeviceEvent", toDeviceEvent);
|
client.emit("toDeviceEvent", toDeviceEvent);
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -719,10 +718,10 @@ SyncApi.prototype._processSyncResponse = function(syncToken, data) {
|
|||||||
// we do this first so it's correct when any of the events fire
|
// we do this first so it's correct when any of the events fire
|
||||||
if (joinObj.unread_notifications) {
|
if (joinObj.unread_notifications) {
|
||||||
room.setUnreadNotificationCount(
|
room.setUnreadNotificationCount(
|
||||||
'total', joinObj.unread_notifications.notification_count
|
'total', joinObj.unread_notifications.notification_count,
|
||||||
);
|
);
|
||||||
room.setUnreadNotificationCount(
|
room.setUnreadNotificationCount(
|
||||||
'highlight', joinObj.unread_notifications.highlight_count
|
'highlight', joinObj.unread_notifications.highlight_count,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -881,7 +880,7 @@ SyncApi.prototype._startKeepAlives = function(delay) {
|
|||||||
if (delay > 0) {
|
if (delay > 0) {
|
||||||
self._keepAliveTimer = setTimeout(
|
self._keepAliveTimer = setTimeout(
|
||||||
self._pokeKeepAlive.bind(self),
|
self._pokeKeepAlive.bind(self),
|
||||||
delay
|
delay,
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
self._pokeKeepAlive();
|
self._pokeKeepAlive();
|
||||||
@@ -913,7 +912,7 @@ SyncApi.prototype._pokeKeepAlive = function() {
|
|||||||
{
|
{
|
||||||
prefix: '',
|
prefix: '',
|
||||||
localTimeoutMs: 15 * 1000,
|
localTimeoutMs: 15 * 1000,
|
||||||
}
|
},
|
||||||
).done(function() {
|
).done(function() {
|
||||||
success();
|
success();
|
||||||
}, function(err) {
|
}, function(err) {
|
||||||
@@ -927,7 +926,7 @@ SyncApi.prototype._pokeKeepAlive = function() {
|
|||||||
} else {
|
} else {
|
||||||
self._keepAliveTimer = setTimeout(
|
self._keepAliveTimer = setTimeout(
|
||||||
self._pokeKeepAlive.bind(self),
|
self._pokeKeepAlive.bind(self),
|
||||||
5000 + Math.floor(Math.random() * 5000)
|
5000 + Math.floor(Math.random() * 5000),
|
||||||
);
|
);
|
||||||
// A keepalive has failed, so we emit the
|
// A keepalive has failed, so we emit the
|
||||||
// error state (whether or not this is the
|
// error state (whether or not this is the
|
||||||
@@ -1046,8 +1045,8 @@ SyncApi.prototype._processRoomEvents = function(room, stateEventList,
|
|||||||
utils.deepCopy(
|
utils.deepCopy(
|
||||||
stateEventList.map(function(mxEvent) {
|
stateEventList.map(function(mxEvent) {
|
||||||
return mxEvent.event;
|
return mxEvent.event;
|
||||||
})
|
}),
|
||||||
), client.getEventMapper()
|
), client.getEventMapper(),
|
||||||
);
|
);
|
||||||
const stateEvents = stateEventList;
|
const stateEvents = stateEventList;
|
||||||
|
|
||||||
|
@@ -51,7 +51,7 @@ module.exports.encodeUri = function(pathTemplate, variables) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
pathTemplate = pathTemplate.replace(
|
pathTemplate = pathTemplate.replace(
|
||||||
key, encodeURIComponent(variables[key])
|
key, encodeURIComponent(variables[key]),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return pathTemplate;
|
return pathTemplate;
|
||||||
|
@@ -141,8 +141,8 @@ MatrixCall.prototype.placeScreenSharingCall =
|
|||||||
self.emit("error",
|
self.emit("error",
|
||||||
callError(
|
callError(
|
||||||
MatrixCall.ERR_NO_USER_MEDIA,
|
MatrixCall.ERR_NO_USER_MEDIA,
|
||||||
"Failed to get screen-sharing stream: " + err
|
"Failed to get screen-sharing stream: " + err,
|
||||||
)
|
),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
this.type = 'video';
|
this.type = 'video';
|
||||||
@@ -311,7 +311,7 @@ MatrixCall.prototype._initWithInvite = function(event) {
|
|||||||
this.peerConn.setRemoteDescription(
|
this.peerConn.setRemoteDescription(
|
||||||
new this.webRtc.RtcSessionDescription(this.msg.offer),
|
new this.webRtc.RtcSessionDescription(this.msg.offer),
|
||||||
hookCallback(self, self._onSetRemoteDescriptionSuccess),
|
hookCallback(self, self._onSetRemoteDescriptionSuccess),
|
||||||
hookCallback(self, self._onSetRemoteDescriptionError)
|
hookCallback(self, self._onSetRemoteDescriptionError),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
setState(this, 'ringing');
|
setState(this, 'ringing');
|
||||||
@@ -370,7 +370,7 @@ MatrixCall.prototype.answer = function() {
|
|||||||
this.webRtc.getUserMedia(
|
this.webRtc.getUserMedia(
|
||||||
_getUserMediaVideoContraints(this.type),
|
_getUserMediaVideoContraints(this.type),
|
||||||
hookCallback(self, self._gotUserMediaForAnswer),
|
hookCallback(self, self._gotUserMediaForAnswer),
|
||||||
hookCallback(self, self._getUserMediaFailed)
|
hookCallback(self, self._getUserMediaFailed),
|
||||||
);
|
);
|
||||||
setState(this, 'wait_local_media');
|
setState(this, 'wait_local_media');
|
||||||
} else if (this.localAVStream) {
|
} else if (this.localAVStream) {
|
||||||
@@ -528,7 +528,7 @@ MatrixCall.prototype._gotUserMediaForInvite = function(stream) {
|
|||||||
this.peerConn.addStream(stream);
|
this.peerConn.addStream(stream);
|
||||||
this.peerConn.createOffer(
|
this.peerConn.createOffer(
|
||||||
hookCallback(self, self._gotLocalOffer),
|
hookCallback(self, self._gotLocalOffer),
|
||||||
hookCallback(self, self._getLocalOfferFailed)
|
hookCallback(self, self._getLocalOfferFailed),
|
||||||
);
|
);
|
||||||
setState(self, 'create_offer');
|
setState(self, 'create_offer');
|
||||||
};
|
};
|
||||||
@@ -600,7 +600,7 @@ MatrixCall.prototype._gotLocalIceCandidate = function(event) {
|
|||||||
if (event.candidate) {
|
if (event.candidate) {
|
||||||
debuglog(
|
debuglog(
|
||||||
"Got local ICE " + event.candidate.sdpMid + " candidate: " +
|
"Got local ICE " + event.candidate.sdpMid + " candidate: " +
|
||||||
event.candidate.candidate
|
event.candidate.candidate,
|
||||||
);
|
);
|
||||||
// As with the offer, note we need to make a copy of this object, not
|
// As with the offer, note we need to make a copy of this object, not
|
||||||
// pass the original: that broke in Chrome ~m43.
|
// pass the original: that broke in Chrome ~m43.
|
||||||
@@ -627,7 +627,7 @@ MatrixCall.prototype._gotRemoteIceCandidate = function(cand) {
|
|||||||
this.peerConn.addIceCandidate(
|
this.peerConn.addIceCandidate(
|
||||||
new this.webRtc.RtcIceCandidate(cand),
|
new this.webRtc.RtcIceCandidate(cand),
|
||||||
function() {},
|
function() {},
|
||||||
function(e) {}
|
function(e) {},
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -645,7 +645,7 @@ MatrixCall.prototype._receivedAnswer = function(msg) {
|
|||||||
this.peerConn.setRemoteDescription(
|
this.peerConn.setRemoteDescription(
|
||||||
new this.webRtc.RtcSessionDescription(msg.answer),
|
new this.webRtc.RtcSessionDescription(msg.answer),
|
||||||
hookCallback(self, self._onSetRemoteDescriptionSuccess),
|
hookCallback(self, self._onSetRemoteDescriptionSuccess),
|
||||||
hookCallback(self, self._onSetRemoteDescriptionError)
|
hookCallback(self, self._onSetRemoteDescriptionError),
|
||||||
);
|
);
|
||||||
setState(self, 'connecting');
|
setState(self, 'connecting');
|
||||||
};
|
};
|
||||||
@@ -705,7 +705,7 @@ MatrixCall.prototype._gotLocalOffer = function(description) {
|
|||||||
MatrixCall.prototype._getLocalOfferFailed = function(error) {
|
MatrixCall.prototype._getLocalOfferFailed = function(error) {
|
||||||
this.emit(
|
this.emit(
|
||||||
"error",
|
"error",
|
||||||
callError(MatrixCall.ERR_LOCAL_OFFER_FAILED, "Failed to start audio for call!")
|
callError(MatrixCall.ERR_LOCAL_OFFER_FAILED, "Failed to start audio for call!"),
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -720,8 +720,8 @@ MatrixCall.prototype._getUserMediaFailed = function(error) {
|
|||||||
callError(
|
callError(
|
||||||
MatrixCall.ERR_NO_USER_MEDIA,
|
MatrixCall.ERR_NO_USER_MEDIA,
|
||||||
"Couldn't start capturing media! Is your microphone set up and " +
|
"Couldn't start capturing media! Is your microphone set up and " +
|
||||||
"does this app have permission?"
|
"does this app have permission?",
|
||||||
)
|
),
|
||||||
);
|
);
|
||||||
this.hangup("user_media_failed");
|
this.hangup("user_media_failed");
|
||||||
};
|
};
|
||||||
@@ -735,7 +735,7 @@ MatrixCall.prototype._onIceConnectionStateChanged = function() {
|
|||||||
return; // because ICE can still complete as we're ending the call
|
return; // because ICE can still complete as we're ending the call
|
||||||
}
|
}
|
||||||
debuglog(
|
debuglog(
|
||||||
"Ice connection state changed to: " + this.peerConn.iceConnectionState
|
"Ice connection state changed to: " + this.peerConn.iceConnectionState,
|
||||||
);
|
);
|
||||||
// ideally we'd consider the call to be connected when we get media but
|
// ideally we'd consider the call to be connected when we get media but
|
||||||
// chrome doesn't implement any of the 'onstarted' events yet
|
// chrome doesn't implement any of the 'onstarted' events yet
|
||||||
@@ -755,7 +755,7 @@ MatrixCall.prototype._onIceConnectionStateChanged = function() {
|
|||||||
MatrixCall.prototype._onSignallingStateChanged = function() {
|
MatrixCall.prototype._onSignallingStateChanged = function() {
|
||||||
debuglog(
|
debuglog(
|
||||||
"call " + this.callId + ": Signalling state changed to: " +
|
"call " + this.callId + ": Signalling state changed to: " +
|
||||||
this.peerConn.signalingState
|
this.peerConn.signalingState,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1031,7 +1031,7 @@ const _tryPlayRemoteAudioStream = function(self) {
|
|||||||
const checkForErrorListener = function(self) {
|
const checkForErrorListener = function(self) {
|
||||||
if (self.listeners("error").length === 0) {
|
if (self.listeners("error").length === 0) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
"You MUST attach an error listener using call.on('error', function() {})"
|
"You MUST attach an error listener using call.on('error', function() {})",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -1073,7 +1073,7 @@ const _sendCandidateQueue = function(self) {
|
|||||||
if (self.candidateSendTries > 5) {
|
if (self.candidateSendTries > 5) {
|
||||||
debuglog(
|
debuglog(
|
||||||
"Failed to send candidates on attempt %s. Giving up for now.",
|
"Failed to send candidates on attempt %s. Giving up for now.",
|
||||||
self.candidateSendTries
|
self.candidateSendTries,
|
||||||
);
|
);
|
||||||
self.candidateSendTries = 0;
|
self.candidateSendTries = 0;
|
||||||
return;
|
return;
|
||||||
@@ -1093,7 +1093,7 @@ const _placeCallWithConstraints = function(self, constraints) {
|
|||||||
self.webRtc.getUserMedia(
|
self.webRtc.getUserMedia(
|
||||||
constraints,
|
constraints,
|
||||||
hookCallback(self, self._gotUserMediaForInvite),
|
hookCallback(self, self._gotUserMediaForInvite),
|
||||||
hookCallback(self, self._getUserMediaFailed)
|
hookCallback(self, self._getUserMediaFailed),
|
||||||
);
|
);
|
||||||
setState(self, 'wait_local_media');
|
setState(self, 'wait_local_media');
|
||||||
self.direction = 'outbound';
|
self.direction = 'outbound';
|
||||||
@@ -1131,7 +1131,7 @@ const _getChromeScreenSharingConstraints = function(call) {
|
|||||||
if (!screen) {
|
if (!screen) {
|
||||||
call.emit("error", callError(
|
call.emit("error", callError(
|
||||||
MatrixCall.ERR_NO_USER_MEDIA,
|
MatrixCall.ERR_NO_USER_MEDIA,
|
||||||
"Couldn't determine screen sharing constaints."
|
"Couldn't determine screen sharing constaints.",
|
||||||
));
|
));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user