[IMPROVE] Add flag to identify remote federation users (#15004)

* added isRemote flag to users

* set isRemote on peers collection
* moved some finds to its models
* use new raw model

* Add more indeces and model methods
pull/14879/head
Alan Sikora 7 years ago committed by Diego Sampaio
parent aaae20c982
commit 1a5c38cdf8
  1. 10
      app/federation/server/PeerClient.js
  2. 12
      app/federation/server/PeerServer/PeerServer.js
  3. 3
      app/federation/server/federatedResources/FederatedUser.js
  4. 4
      app/federation/server/federation-settings.js
  5. 20
      app/federation/server/methods/dashboard.js
  6. 4
      app/lib/server/functions/deleteUser.js
  7. 10
      app/models/server/models/FederationEvents.js
  8. 37
      app/models/server/models/FederationPeers.js
  9. 5
      app/models/server/models/Users.js
  10. 4
      app/models/server/raw/Users.js
  11. 8
      app/statistics/server/functions/get.js
  12. 290
      package-lock.json
  13. 1
      server/startup/migrations/index.js
  14. 30
      server/startup/migrations/v148.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));
}
// #####

@ -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) {

@ -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;
}

@ -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',

@ -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 = [];

@ -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);
};

@ -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 });
}
}

@ -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();

@ -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);

@ -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 } });
}
}

@ -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();

290
package-lock.json generated

@ -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",

@ -145,4 +145,5 @@ import './v144';
import './v145';
import './v146';
import './v147';
import './v148';
import './xrun';

@ -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
},
});
Loading…
Cancel
Save