|
@@ -50,6 +50,7 @@ const async = require('async')
|
|
|
|
|
|
|
|
const RealTimeClient = require('./helpers/RealTimeClient')
|
|
const RealTimeClient = require('./helpers/RealTimeClient')
|
|
|
const FixturesManager = require('./helpers/FixturesManager')
|
|
const FixturesManager = require('./helpers/FixturesManager')
|
|
|
|
|
+const MockWebServer = require('./helpers/MockWebServer')
|
|
|
|
|
|
|
|
const settings = require('@overleaf/settings')
|
|
const settings = require('@overleaf/settings')
|
|
|
const Keys = settings.redis.documentupdater.key_schema
|
|
const Keys = settings.redis.documentupdater.key_schema
|
|
@@ -64,12 +65,16 @@ function cleanupPreviousUpdates(docId, cb) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
describe('MatrixTests', function () {
|
|
describe('MatrixTests', function () {
|
|
|
- let privateProjectId, privateDocId, readWriteProjectId, readWriteDocId
|
|
|
|
|
|
|
+ let privateProjectId,
|
|
|
|
|
+ privateDocId,
|
|
|
|
|
+ readWriteProjectId,
|
|
|
|
|
+ readWriteDocId,
|
|
|
|
|
+ readWriteAnonymousAccessToken
|
|
|
|
|
|
|
|
let privateClient
|
|
let privateClient
|
|
|
before(function setupPrivateProject(done) {
|
|
before(function setupPrivateProject(done) {
|
|
|
FixturesManager.setUpEditorSession(
|
|
FixturesManager.setUpEditorSession(
|
|
|
- { privilegeLevel: 'owner' },
|
|
|
|
|
|
|
+ { privilegeLevel: 'owner', publicAccessLevel: 'readAndWrite' },
|
|
|
(err, { project_id: projectId, doc_id: docId }) => {
|
|
(err, { project_id: projectId, doc_id: docId }) => {
|
|
|
if (err) return done(err)
|
|
if (err) return done(err)
|
|
|
privateProjectId = projectId
|
|
privateProjectId = projectId
|
|
@@ -94,9 +99,10 @@ describe('MatrixTests', function () {
|
|
|
{
|
|
{
|
|
|
publicAccess: 'readAndWrite',
|
|
publicAccess: 'readAndWrite',
|
|
|
},
|
|
},
|
|
|
- (err, { project_id: projectId, doc_id: docId }) => {
|
|
|
|
|
|
|
+ (err, { project_id: projectId, doc_id: docId, anonymousAccessToken }) => {
|
|
|
readWriteProjectId = projectId
|
|
readWriteProjectId = projectId
|
|
|
readWriteDocId = docId
|
|
readWriteDocId = docId
|
|
|
|
|
+ readWriteAnonymousAccessToken = anonymousAccessToken
|
|
|
done(err)
|
|
done(err)
|
|
|
}
|
|
}
|
|
|
)
|
|
)
|
|
@@ -104,31 +110,19 @@ describe('MatrixTests', function () {
|
|
|
|
|
|
|
|
const USER_SETUP = {
|
|
const USER_SETUP = {
|
|
|
anonymous: {
|
|
anonymous: {
|
|
|
- setup(cb) {
|
|
|
|
|
- RealTimeClient.setSession({}, err => {
|
|
|
|
|
- if (err) return cb(err)
|
|
|
|
|
- cb(null, {
|
|
|
|
|
- client: RealTimeClient.connect(),
|
|
|
|
|
- })
|
|
|
|
|
- })
|
|
|
|
|
|
|
+ getAnonymousAccessToken() {
|
|
|
|
|
+ return readWriteAnonymousAccessToken
|
|
|
},
|
|
},
|
|
|
- },
|
|
|
|
|
-
|
|
|
|
|
- registered: {
|
|
|
|
|
setup(cb) {
|
|
setup(cb) {
|
|
|
- const userId = FixturesManager.getRandomId()
|
|
|
|
|
RealTimeClient.setSession(
|
|
RealTimeClient.setSession(
|
|
|
{
|
|
{
|
|
|
- user: {
|
|
|
|
|
- _id: userId,
|
|
|
|
|
- first_name: 'Joe',
|
|
|
|
|
- last_name: 'Bloggs',
|
|
|
|
|
|
|
+ anonTokenAccess: {
|
|
|
|
|
+ [readWriteProjectId]: readWriteAnonymousAccessToken,
|
|
|
},
|
|
},
|
|
|
},
|
|
},
|
|
|
err => {
|
|
err => {
|
|
|
if (err) return cb(err)
|
|
if (err) return cb(err)
|
|
|
cb(null, {
|
|
cb(null, {
|
|
|
- user_id: userId,
|
|
|
|
|
client: RealTimeClient.connect(),
|
|
client: RealTimeClient.connect(),
|
|
|
})
|
|
})
|
|
|
}
|
|
}
|
|
@@ -136,12 +130,40 @@ describe('MatrixTests', function () {
|
|
|
},
|
|
},
|
|
|
},
|
|
},
|
|
|
|
|
|
|
|
|
|
+ registered: {
|
|
|
|
|
+ getAnonymousAccessToken() {},
|
|
|
|
|
+ setup(cb) {
|
|
|
|
|
+ const userId = FixturesManager.getRandomId()
|
|
|
|
|
+ const user = { _id: userId, first_name: 'Joe', last_name: 'Bloggs' }
|
|
|
|
|
+ RealTimeClient.setSession({ user }, err => {
|
|
|
|
|
+ if (err) return cb(err)
|
|
|
|
|
+
|
|
|
|
|
+ MockWebServer.inviteUserToProject(
|
|
|
|
|
+ readWriteProjectId,
|
|
|
|
|
+ user,
|
|
|
|
|
+ 'readAndWrite'
|
|
|
|
|
+ )
|
|
|
|
|
+ cb(null, {
|
|
|
|
|
+ user_id: userId,
|
|
|
|
|
+ client: RealTimeClient.connect(),
|
|
|
|
|
+ })
|
|
|
|
|
+ })
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
registeredWithOwnedProject: {
|
|
registeredWithOwnedProject: {
|
|
|
|
|
+ getAnonymousAccessToken() {},
|
|
|
setup(cb) {
|
|
setup(cb) {
|
|
|
FixturesManager.setUpEditorSession(
|
|
FixturesManager.setUpEditorSession(
|
|
|
{ privilegeLevel: 'owner' },
|
|
{ privilegeLevel: 'owner' },
|
|
|
(err, { project_id: projectId, user_id: userId, doc_id: docId }) => {
|
|
(err, { project_id: projectId, user_id: userId, doc_id: docId }) => {
|
|
|
if (err) return cb(err)
|
|
if (err) return cb(err)
|
|
|
|
|
+
|
|
|
|
|
+ MockWebServer.inviteUserToProject(
|
|
|
|
|
+ readWriteProjectId,
|
|
|
|
|
+ { _id: userId },
|
|
|
|
|
+ 'readAndWrite'
|
|
|
|
|
+ )
|
|
|
cb(null, {
|
|
cb(null, {
|
|
|
user_id: userId,
|
|
user_id: userId,
|
|
|
project_id: projectId,
|
|
project_id: projectId,
|
|
@@ -169,8 +191,12 @@ describe('MatrixTests', function () {
|
|
|
|
|
|
|
|
joinReadWriteProject: {
|
|
joinReadWriteProject: {
|
|
|
getActions(cb) {
|
|
getActions(cb) {
|
|
|
|
|
+ const anonymousAccessToken = userItem.getAnonymousAccessToken()
|
|
|
cb(null, [
|
|
cb(null, [
|
|
|
- { rpc: 'joinProject', args: [{ project_id: readWriteProjectId }] },
|
|
|
|
|
|
|
+ {
|
|
|
|
|
+ rpc: 'joinProject',
|
|
|
|
|
+ args: [{ project_id: readWriteProjectId, anonymousAccessToken }],
|
|
|
|
|
+ },
|
|
|
])
|
|
])
|
|
|
},
|
|
},
|
|
|
needsOwnProject: false,
|
|
needsOwnProject: false,
|
|
@@ -178,8 +204,12 @@ describe('MatrixTests', function () {
|
|
|
|
|
|
|
|
joinReadWriteProjectAndDoc: {
|
|
joinReadWriteProjectAndDoc: {
|
|
|
getActions(cb) {
|
|
getActions(cb) {
|
|
|
|
|
+ const anonymousAccessToken = userItem.getAnonymousAccessToken()
|
|
|
cb(null, [
|
|
cb(null, [
|
|
|
- { rpc: 'joinProject', args: [{ project_id: readWriteProjectId }] },
|
|
|
|
|
|
|
+ {
|
|
|
|
|
+ rpc: 'joinProject',
|
|
|
|
|
+ args: [{ project_id: readWriteProjectId, anonymousAccessToken }],
|
|
|
|
|
+ },
|
|
|
{ rpc: 'joinDoc', args: [readWriteDocId] },
|
|
{ rpc: 'joinDoc', args: [readWriteDocId] },
|
|
|
])
|
|
])
|
|
|
},
|
|
},
|
|
@@ -188,8 +218,12 @@ describe('MatrixTests', function () {
|
|
|
|
|
|
|
|
joinOwnProject: {
|
|
joinOwnProject: {
|
|
|
getActions(cb) {
|
|
getActions(cb) {
|
|
|
|
|
+ const anonymousAccessToken = userItem.getAnonymousAccessToken()
|
|
|
cb(null, [
|
|
cb(null, [
|
|
|
- { rpc: 'joinProject', args: [{ project_id: options.project_id }] },
|
|
|
|
|
|
|
+ {
|
|
|
|
|
+ rpc: 'joinProject',
|
|
|
|
|
+ args: [{ project_id: options.project_id, anonymousAccessToken }],
|
|
|
|
|
+ },
|
|
|
])
|
|
])
|
|
|
},
|
|
},
|
|
|
needsOwnProject: true,
|
|
needsOwnProject: true,
|
|
@@ -197,8 +231,12 @@ describe('MatrixTests', function () {
|
|
|
|
|
|
|
|
joinOwnProjectAndDoc: {
|
|
joinOwnProjectAndDoc: {
|
|
|
getActions(cb) {
|
|
getActions(cb) {
|
|
|
|
|
+ const anonymousAccessToken = userItem.getAnonymousAccessToken()
|
|
|
cb(null, [
|
|
cb(null, [
|
|
|
- { rpc: 'joinProject', args: [{ project_id: options.project_id }] },
|
|
|
|
|
|
|
+ {
|
|
|
|
|
+ rpc: 'joinProject',
|
|
|
|
|
+ args: [{ project_id: options.project_id, anonymousAccessToken }],
|
|
|
|
|
+ },
|
|
|
{ rpc: 'joinDoc', args: [options.doc_id] },
|
|
{ rpc: 'joinDoc', args: [options.doc_id] },
|
|
|
])
|
|
])
|
|
|
},
|
|
},
|
|
@@ -252,6 +290,23 @@ describe('MatrixTests', function () {
|
|
|
},
|
|
},
|
|
|
},
|
|
},
|
|
|
|
|
|
|
|
|
|
+ joinProjectWithBadAccessToken: {
|
|
|
|
|
+ getActions(cb) {
|
|
|
|
|
+ cb(null, [
|
|
|
|
|
+ {
|
|
|
|
|
+ rpc: 'joinProject',
|
|
|
|
|
+ args: [
|
|
|
|
|
+ {
|
|
|
|
|
+ project_id: privateProjectId,
|
|
|
|
|
+ anonymousAccessToken: 'invalid-access-token',
|
|
|
|
|
+ },
|
|
|
|
|
+ ],
|
|
|
|
|
+ fails: 1,
|
|
|
|
|
+ },
|
|
|
|
|
+ ])
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
joinProjectWithDocId: {
|
|
joinProjectWithDocId: {
|
|
|
getActions(cb) {
|
|
getActions(cb) {
|
|
|
cb(null, [
|
|
cb(null, [
|