diff --git a/app/federation/server/PeerClient.js b/app/federation/server/PeerClient.js index 8b6a0b144b3a..38ceabf807a8 100644 --- a/app/federation/server/PeerClient.js +++ b/app/federation/server/PeerClient.js @@ -5,9 +5,9 @@ import { Meteor } from 'meteor/meteor'; import { updateStatus } from './settingsUpdater'; import { logger } from './logger'; import { FederatedMessage, FederatedRoom, FederatedUser } from './federatedResources'; -import { callbacks } from '../../callbacks'; -import { settings } from '../../settings'; -import { FederationEvents, FederationKeys, Messages, Rooms, Subscriptions, Users } from '../../models'; +import { callbacks } from '../../callbacks/server'; +import { settings } from '../../settings/server'; +import { FederationEvents, FederationKeys, Messages, Rooms, Subscriptions, Users } from '../../models/server'; import { Federation } from '.'; @@ -232,9 +232,7 @@ export class PeerClient { // Should we use queues in here? const events = FederationEvents.getUnfulfilled(); - for (const e of events) { - this.propagateEvent(e); - } + events.forEach((e) => this.propagateEvent(e)); } // ##### diff --git a/app/federation/server/PeerServer/PeerServer.js b/app/federation/server/PeerServer/PeerServer.js index 73c51ba053e5..f6b2ecd5b794 100644 --- a/app/federation/server/PeerServer/PeerServer.js +++ b/app/federation/server/PeerServer/PeerServer.js @@ -58,7 +58,7 @@ export class PeerServer { federatedRoom.create(); // Refresh federation peers - FederationPeers.refreshPeers(); + FederationPeers.refreshPeers(localPeerDomain); } handleRoomCreatedEvent(e) { @@ -81,7 +81,7 @@ export class PeerServer { federatedRoom.create(true); // Refresh federation peers - FederationPeers.refreshPeers(); + FederationPeers.refreshPeers(localPeerDomain); } handleUserJoinedEvent(e) { @@ -111,7 +111,7 @@ export class PeerServer { federatedRoom.refreshFederation(); // Refresh federation peers - FederationPeers.refreshPeers(); + FederationPeers.refreshPeers(localPeerDomain); } handleUserAddedEvent(e) { @@ -150,7 +150,7 @@ export class PeerServer { federatedRoom.refreshFederation(); // Refresh federation peers - FederationPeers.refreshPeers(); + FederationPeers.refreshPeers(localPeerDomain); } handleUserLeftEvent(e) { @@ -180,7 +180,7 @@ export class PeerServer { federatedRoom.refreshFederation(); // Refresh federation peers - FederationPeers.refreshPeers(); + FederationPeers.refreshPeers(localPeerDomain); } handleUserRemovedEvent(e) { @@ -214,7 +214,7 @@ export class PeerServer { federatedRoom.refreshFederation(); // Refresh federation peers - FederationPeers.refreshPeers(); + FederationPeers.refreshPeers(localPeerDomain); } handleUserMutedEvent(e) { diff --git a/app/federation/server/federatedResources/FederatedUser.js b/app/federation/server/federatedResources/FederatedUser.js index de6a7fee0652..5b21c5fd07f3 100644 --- a/app/federation/server/federatedResources/FederatedUser.js +++ b/app/federation/server/federatedResources/FederatedUser.js @@ -67,6 +67,9 @@ export class FederatedUser extends FederatedResource { localUser.username = user.username.split('@')[0]; localUser.name = user.name.split('@')[0]; } + if (federation.peer !== localPeerIdentifier) { + localUser.isRemote = true; + } return localUser; } diff --git a/app/federation/server/federation-settings.js b/app/federation/server/federation-settings.js index 333d45938f55..385d077af5f0 100644 --- a/app/federation/server/federation-settings.js +++ b/app/federation/server/federation-settings.js @@ -7,6 +7,8 @@ Meteor.startup(function() { // const federationUniqueId = FederationKeys.getUniqueId(); const federationPublicKey = FederationKeys.getPublicKeyString(); + const defaultHubURL = process.env.NODE_ENV === 'development' ? 'http://localhost:8080' : 'https://hub.rocket.chat'; + settings.addGroup('Federation', function() { this.add('FEDERATION_Enabled', false, { type: 'boolean', @@ -45,7 +47,7 @@ Meteor.startup(function() { i18nDescription: 'FEDERATION_Public_Key_Description', }); - this.add('FEDERATION_Hub_URL', 'https://hub.rocket.chat', { + this.add('FEDERATION_Hub_URL', defaultHubURL, { group: 'Federation Hub', type: 'string', i18nLabel: 'FEDERATION_Hub_URL', diff --git a/app/federation/server/methods/dashboard.js b/app/federation/server/methods/dashboard.js index b05dd122a428..d272991cd641 100644 --- a/app/federation/server/methods/dashboard.js +++ b/app/federation/server/methods/dashboard.js @@ -1,19 +1,25 @@ import { Meteor } from 'meteor/meteor'; import moment from 'moment'; -import { FederationEvents, FederationPeers, Users } from '../../../models'; +// We do not import the whole Federation object here because statistics cron +// job use this file, and some of the features are not available on the cron +import { FederationEvents, FederationPeers, Users } from '../../../models/server'; -import { Federation } from '..'; +export function getStatistics() { + const numberOfEvents = FederationEvents.findByType('png').count(); + const numberOfFederatedUsers = Users.findRemote().count(); + const numberOfActivePeers = FederationPeers.findActiveRemote().count(); + const numberOfInactivePeers = FederationPeers.findNotActiveRemote().count(); + + return { numberOfEvents, numberOfFederatedUsers, numberOfActivePeers, numberOfInactivePeers }; +} export function federationGetOverviewData() { if (!Meteor.userId()) { throw new Meteor.Error('not-authorized'); } - const numberOfEvents = FederationEvents.find({ t: { $ne: 'png' } }).count(); - const numberOfFederatedUsers = Users.find({ federation: { $exists: true }, 'federation.peer': { $ne: Federation.localIdentifier } }).count(); - const numberOfActivePeers = FederationPeers.find({ active: true, peer: { $ne: Federation.localIdentifier } }).count(); - const numberOfInactivePeers = FederationPeers.find({ active: false, peer: { $ne: Federation.localIdentifier } }).count(); + const { numberOfEvents, numberOfFederatedUsers, numberOfActivePeers, numberOfInactivePeers } = getStatistics(); return { data: [{ @@ -37,7 +43,7 @@ export function federationGetPeerStatuses() { throw new Meteor.Error('not-authorized'); } - const peers = FederationPeers.find({ peer: { $ne: Federation.localIdentifier } }).fetch(); + const peers = FederationPeers.findRemote().fetch(); const peerStatuses = []; diff --git a/app/lib/server/functions/deleteUser.js b/app/lib/server/functions/deleteUser.js index 537732d1617f..e96c9e36f6ac 100644 --- a/app/lib/server/functions/deleteUser.js +++ b/app/lib/server/functions/deleteUser.js @@ -6,6 +6,7 @@ import { Users, Subscriptions, Messages, Rooms, Integrations, FederationPeers } import { hasRole, getUsersInRole } from '../../../authorization'; import { settings } from '../../../settings'; import { Notifications } from '../../../notifications'; +import { getConfig } from '../../../federation/server/config'; export const deleteUser = function(userId) { const user = Users.findOneById(userId, { @@ -99,5 +100,6 @@ export const deleteUser = function(userId) { Users.removeById(userId); // Remove user from users database // Refresh the peers list - FederationPeers.refreshPeers(); + const { peer: { domain: localPeerDomain } } = getConfig(); + FederationPeers.refreshPeers(localPeerDomain); }; diff --git a/app/models/server/models/FederationEvents.js b/app/models/server/models/FederationEvents.js index 82a09247c0e6..55dbcb366acd 100644 --- a/app/models/server/models/FederationEvents.js +++ b/app/models/server/models/FederationEvents.js @@ -20,6 +20,10 @@ const normalizePeers = (basePeers, options) => { class FederationEventsModel extends Base { constructor() { super('federation_events'); + + this.tryEnsureIndex({ t: 1 }); + this.tryEnsureIndex({ fulfilled: 1 }); + this.tryEnsureIndex({ ts: 1 }); } // Sometimes events errored but the error is final @@ -256,7 +260,11 @@ class FederationEventsModel extends Base { // Get all unfulfilled events getUnfulfilled() { - return this.find({ fulfilled: false }, { sort: { ts: 1 } }).fetch(); + return this.find({ fulfilled: false }, { sort: { ts: 1 } }); + } + + findByType(t) { + return this.find({ t }); } } diff --git a/app/models/server/models/FederationPeers.js b/app/models/server/models/FederationPeers.js index 75acdcd44e77..283d2f31e761 100644 --- a/app/models/server/models/FederationPeers.js +++ b/app/models/server/models/FederationPeers.js @@ -1,32 +1,27 @@ -import { Meteor } from 'meteor/meteor'; - import { Base } from './_Base'; - -import { Users } from '..'; +import { Users } from '../raw'; class FederationPeersModel extends Base { constructor() { super('federation_peers'); - } - refreshPeers() { - const collectionObj = this.model.rawCollection(); - const findAndModify = Meteor.wrapAsync(collectionObj.findAndModify, collectionObj); - - const users = Users.find({ federation: { $exists: true } }, { fields: { federation: 1 } }).fetch(); + this.tryEnsureIndex({ active: 1, isRemote: 1 }); + } - const peers = [...new Set(users.map((u) => u.federation.peer))]; + async refreshPeers(localIdentifier) { + const peers = await Users.getDistinctFederationPeers(); - for (const peer of peers) { - findAndModify({ peer }, [], { + peers.forEach((peer) => + this.update({ peer }, { $setOnInsert: { + isRemote: localIdentifier !== peer, active: false, peer, last_seen_at: null, last_failure_at: null, }, - }, { upsert: true }); - } + }, { upsert: true }) + ); this.remove({ peer: { $nin: peers } }); } @@ -48,6 +43,18 @@ class FederationPeersModel extends Base { this.update({ peer }, { $set: updateQuery }); } } + + findActiveRemote() { + return this.find({ active: true, isRemote: true }); + } + + findNotActiveRemote() { + return this.find({ active: false, isRemote: true }); + } + + findRemote() { + return this.find({ isRemote: true }); + } } export const FederationPeers = new FederationPeersModel(); diff --git a/app/models/server/models/Users.js b/app/models/server/models/Users.js index 734370cb2da5..d347847097cf 100644 --- a/app/models/server/models/Users.js +++ b/app/models/server/models/Users.js @@ -21,6 +21,7 @@ export class Users extends Base { this.tryEnsureIndex({ type: 1 }); this.tryEnsureIndex({ 'visitorEmails.address': 1 }); this.tryEnsureIndex({ federation: 1 }, { sparse: true }); + this.tryEnsureIndex({ isRemote: 1 }, { sparse: true }); } getLoginTokensByUserId(userId) { @@ -666,6 +667,10 @@ export class Users extends Base { return this.findOne(query, options); } + findRemote() { + return this.find({ isRemote: true }); + } + // UPDATE addImportIds(_id, importIds) { importIds = [].concat(importIds); diff --git a/app/models/server/raw/Users.js b/app/models/server/raw/Users.js index bc5977e2200c..95baf14b3d3c 100644 --- a/app/models/server/raw/Users.js +++ b/app/models/server/raw/Users.js @@ -19,4 +19,8 @@ export class UsersRaw extends BaseRaw { return this.findOne(query, { fields: { roles: 1 } }); } + + getDistinctFederationPeers() { + return this.col.distinct('federation.peer', { federation: { $exists: true } }); + } } diff --git a/app/statistics/server/functions/get.js b/app/statistics/server/functions/get.js index 4b4898a2c9ac..799d35b6653f 100644 --- a/app/statistics/server/functions/get.js +++ b/app/statistics/server/functions/get.js @@ -18,6 +18,7 @@ import { settings } from '../../../settings/server'; import { Info, getMongoInfo } from '../../../utils/server'; import { Migrations } from '../../../migrations/server'; import { statistics } from '../statisticsNamespace'; +import { getStatistics as federationGetStatistics } from '../../../federation/server/methods/dashboard'; const wizardFields = [ 'Organization_Type', @@ -100,6 +101,13 @@ statistics.get = function _getStatistics() { statistics.totalDirectMessages = _.reduce(Rooms.findByType('d', { fields: { msgs: 1 } }).fetch(), function _countDirectMessages(num, room) { return num + room.msgs; }, 0); statistics.totalLivechatMessages = _.reduce(Rooms.findByType('l', { fields: { msgs: 1 } }).fetch(), function _countLivechatMessages(num, room) { return num + room.msgs; }, 0); + // Federation statistics + const federationOverviewData = federationGetStatistics(); + + statistics.federatedServers = federationOverviewData.numberOfActivePeers + federationOverviewData.numberOfInactivePeers; + statistics.federatedServersActive = federationOverviewData.numberOfActivePeers; + statistics.federatedUsers = federationOverviewData.numberOfFederatedUsers; + statistics.lastLogin = Users.getLastLogin(); statistics.lastMessageSentAt = Messages.getLastTimestamp(); statistics.lastSeenSubscription = Subscriptions.getLastSeen(); diff --git a/package-lock.json b/package-lock.json index e958db8fa85b..6cd1946d13ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3978,16 +3978,6 @@ "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", "dev": true }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, "camelcase": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", @@ -4324,13 +4314,11 @@ "chromedriver": "^2.35", "colors": "1.1.2", "commander": "^2.9.0", - "cucumber": "github:xolvio/cucumber-js#cf953cb5b5de30dbcc279f59e4ebff3aa040071c", "deep-extend": "^0.4.1", "exit": "^0.1.2", "fibers": "^1.0.14", "freeport": "~1.0.5", "fs-extra": "^1.0.0", - "glob": "github:lucetius/node-glob#51c7ca6e69bfbd17db5f1ea710e3f2a7a457d9ce", "hapi": "8.8.0", "jasmine": "^2.4.1", "loglevel": "~1.4.0", @@ -4368,6 +4356,27 @@ "type-detect": "^4.0.0" } }, + "cucumber": { + "version": "github:xolvio/cucumber-js#cf953cb5b5de30dbcc279f59e4ebff3aa040071c", + "from": "github:xolvio/cucumber-js#cf953cb5b5de30dbcc279f59e4ebff3aa040071c", + "requires": { + "camel-case": "^3.0.0", + "cli-table": "^0.3.1", + "co": "^4.6.0", + "colors": "^1.1.2", + "commander": "^2.9.0", + "duration": "^0.2.0", + "fibers": "^1.0.7", + "figures": "1.7.0", + "gherkin": "4.0.0", + "glob": "^7.0.0", + "is-generator": "^1.0.2", + "lodash": "^4.0.0", + "meteor-promise": "^0.8.0", + "stack-chain": "^1.3.5", + "stacktrace-js": "^1.3.0" + } + }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -4386,13 +4395,11 @@ "fibers": { "version": "1.0.15", "resolved": "https://registry.npmjs.org/fibers/-/fibers-1.0.15.tgz", - "integrity": "sha1-IvA5yPGLhWGQ+75N7PBWFUwerpw=", - "dev": true + "integrity": "sha1-IvA5yPGLhWGQ+75N7PBWFUwerpw=" }, "glob": { - "version": "github:lucetius/node-glob#51c7ca6e69bfbd17db5f1ea710e3f2a7a457d9ce", - "from": "github:lucetius/node-glob#chimp", - "dev": true, + "version": "7.1.1", + "resolved": "github:lucetius/node-glob#51c7ca6e69bfbd17db5f1ea710e3f2a7a457d9ce", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4469,8 +4476,7 @@ "once": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/once/-/once-1.3.0.tgz", - "integrity": "sha1-FRr4a/wfCMS58H0GqyUP/L61ZYE=", - "dev": true + "integrity": "sha1-FRr4a/wfCMS58H0GqyUP/L61ZYE=" }, "progress": { "version": "1.1.8", @@ -4616,23 +4622,6 @@ "restore-cursor": "^2.0.0" } }, - "cli-table": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", - "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", - "dev": true, - "requires": { - "colors": "1.0.3" - }, - "dependencies": { - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", - "dev": true - } - } - }, "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", @@ -4750,8 +4739,7 @@ "colors": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" }, "colour": { "version": "0.7.1", @@ -5179,36 +5167,6 @@ "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=", "dev": true }, - "cucumber": { - "version": "github:xolvio/cucumber-js#cf953cb5b5de30dbcc279f59e4ebff3aa040071c", - "from": "github:xolvio/cucumber-js#v1.3.0-chimp.6", - "dev": true, - "requires": { - "camel-case": "^3.0.0", - "cli-table": "^0.3.1", - "co": "^4.6.0", - "colors": "^1.1.2", - "commander": "^2.9.0", - "duration": "^0.2.0", - "fibers": "^1.0.7", - "figures": "1.7.0", - "gherkin": "4.0.0", - "glob": "^7.0.0", - "is-generator": "^1.0.2", - "lodash": "^4.0.0", - "meteor-promise": "^0.8.0", - "stack-chain": "^1.3.5", - "stacktrace-js": "^1.3.0" - }, - "dependencies": { - "fibers": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/fibers/-/fibers-1.0.15.tgz", - "integrity": "sha1-IvA5yPGLhWGQ+75N7PBWFUwerpw=", - "dev": true - } - } - }, "cuid": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/cuid/-/cuid-1.3.8.tgz", @@ -5246,15 +5204,6 @@ "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", "dev": true }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "^0.10.9" - } - }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -5836,16 +5785,6 @@ "stream-shift": "^1.0.0" } }, - "duration": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz", - "integrity": "sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.46" - } - }, "eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -6031,15 +5970,6 @@ } } }, - "error-stack-parser": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-1.3.6.tgz", - "integrity": "sha1-4Oc7k+QXE40c18C3RrGkoUhUwpI=", - "dev": true, - "requires": { - "stackframe": "^0.3.1" - } - }, "es-abstract": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", @@ -6062,28 +5992,6 @@ "is-symbol": "^1.0.2" } }, - "es5-ext": { - "version": "0.10.50", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.50.tgz", - "integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "^1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, "es6-promise": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", @@ -6097,16 +6005,6 @@ "es6-promise": "^4.0.3" } }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -7073,16 +6971,6 @@ "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", "dev": true }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, "file-entry-cache": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", @@ -8023,12 +7911,6 @@ "assert-plus": "^1.0.0" } }, - "gherkin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/gherkin/-/gherkin-4.0.0.tgz", - "integrity": "sha1-edzgTRIj6kO0hip2vlzo+JwSwyw=", - "dev": true - }, "github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", @@ -9172,6 +9054,18 @@ "hoek": "2.x.x", "joi": "6.x.x", "wreck": "5.x.x" + }, + "dependencies": { + "wreck": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/wreck/-/wreck-5.6.1.tgz", + "integrity": "sha1-r/ADBAATiJ11YZtccYcN0qjdBpo=", + "dev": true, + "requires": { + "boom": "2.x.x", + "hoek": "2.x.x" + } + } } }, "heavy": { @@ -9183,6 +9077,20 @@ "boom": "2.x.x", "hoek": "2.x.x", "joi": "5.x.x" + }, + "dependencies": { + "joi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-5.1.0.tgz", + "integrity": "sha1-FSrQfbjunGQBmX/1/SwSiWBwv1g=", + "dev": true, + "requires": { + "hoek": "^2.2.x", + "isemail": "1.x.x", + "moment": "2.x.x", + "topo": "1.x.x" + } + } } }, "hoek": { @@ -10328,12 +10236,6 @@ "number-is-nan": "^1.0.0" } }, - "is-generator": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-generator/-/is-generator-1.0.3.tgz", - "integrity": "sha1-wUwhBX7TbjKNuANHlmxpP4hjifM=", - "dev": true - }, "is-glob": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", @@ -11531,12 +11433,6 @@ "signal-exit": "^3.0.0" } }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true - }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -12037,8 +11933,7 @@ "meteor-promise": { "version": "0.8.6", "resolved": "https://registry.npmjs.org/meteor-promise/-/meteor-promise-0.8.6.tgz", - "integrity": "sha512-HP6tOr67z/9XU2Dr0F2SSr8WRTuE23AG9Dj578DCJPEYHs67OLKBviU8A8rwvbwMD7Lu2+Of+yAMz2Wd8r4yxg==", - "dev": true + "integrity": "sha512-HP6tOr67z/9XU2Dr0F2SSr8WRTuE23AG9Dj578DCJPEYHs67OLKBviU8A8rwvbwMD7Lu2+Of+yAMz2Wd8r4yxg==" }, "methods": { "version": "1.1.2", @@ -12617,26 +12512,11 @@ "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", "dev": true }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dev": true, - "requires": { - "lower-case": "^1.1.1" - } - }, "node-abi": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.7.1.tgz", @@ -15942,69 +15822,11 @@ "figgy-pudding": "^3.5.1" } }, - "stack-chain": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-1.3.7.tgz", - "integrity": "sha1-0ZLJ/06moiyUxN1FkXHj8AzqEoU=", - "dev": true - }, - "stack-generator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-1.1.0.tgz", - "integrity": "sha1-NvapIHUabBD0maE8Msu19RoLiyU=", - "dev": true, - "requires": { - "stackframe": "^1.0.2" - }, - "dependencies": { - "stackframe": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.0.4.tgz", - "integrity": "sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw==", - "dev": true - } - } - }, "stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" }, - "stackframe": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-0.3.1.tgz", - "integrity": "sha1-M6qE8Rd6VUjIk1Uzy/6zQgl19aQ=", - "dev": true - }, - "stacktrace-gps": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-2.4.4.tgz", - "integrity": "sha1-acgn6dbW9Bz0ONfxleLjy/zyjEQ=", - "dev": true, - "requires": { - "source-map": "0.5.6", - "stackframe": "~0.3" - }, - "dependencies": { - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true - } - } - }, - "stacktrace-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-1.3.1.tgz", - "integrity": "sha1-Z8qyWJr1xBe5Yvc2mUAne7O2oYs=", - "dev": true, - "requires": { - "error-stack-parser": "^1.3.6", - "stack-generator": "^1.0.7", - "stacktrace-gps": "^2.4.3" - } - }, "starttls": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/starttls/-/starttls-1.0.1.tgz", @@ -17330,12 +17152,6 @@ "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", "dev": true }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true - }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", diff --git a/server/startup/migrations/index.js b/server/startup/migrations/index.js index 2dc6efd4e316..1f1aa93ec6b2 100644 --- a/server/startup/migrations/index.js +++ b/server/startup/migrations/index.js @@ -145,4 +145,5 @@ import './v144'; import './v145'; import './v146'; import './v147'; +import './v148'; import './xrun'; diff --git a/server/startup/migrations/v148.js b/server/startup/migrations/v148.js new file mode 100644 index 000000000000..8333bc51659d --- /dev/null +++ b/server/startup/migrations/v148.js @@ -0,0 +1,30 @@ +import { Migrations } from '../../../app/migrations/server'; +import { Users, Settings, FederationPeers } from '../../../app/models/server'; + +Migrations.add({ + version: 148, + up() { + const { value: localDomain } = Settings.findOne({ _id: 'FEDERATION_Domain' }); + + Users.update({ + federation: { $exists: true }, 'federation.peer': { $ne: localDomain }, + }, { + $set: { isRemote: true }, + }, { multi: true }); + + FederationPeers.update({ + peer: { $ne: localDomain }, + }, { + $set: { isRemote: true }, + }, { multi: true }); + + FederationPeers.update({ + peer: localDomain, + }, { + $set: { isRemote: false }, + }, { multi: true }); + }, + down() { + // Down migration does not apply in this case + }, +});