Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F33069247
D9267.1768441602.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
10 KB
Referenced Files
None
Subscribers
None
D9267.1768441602.diff
View Options
diff --git a/keyserver/src/responders/redux-state-responders.js b/keyserver/src/responders/redux-state-responders.js
--- a/keyserver/src/responders/redux-state-responders.js
+++ b/keyserver/src/responders/redux-state-responders.js
@@ -27,17 +27,13 @@
} from 'lib/types/message-types.js';
import { threadPermissions } from 'lib/types/thread-permission-types.js';
import { threadTypes } from 'lib/types/thread-types-enum.js';
-import {
- threadStoreValidator,
- rawThreadInfoValidator,
-} from 'lib/types/thread-types.js';
+import { threadStoreValidator } from 'lib/types/thread-types.js';
import {
currentUserInfoValidator,
userInfosValidator,
} from 'lib/types/user-types.js';
import { currentDateInTimeZone } from 'lib/utils/date-utils.js';
import { ServerError } from 'lib/utils/errors.js';
-import { hash } from 'lib/utils/objects.js';
import { promiseAll } from 'lib/utils/promises.js';
import type { URLInfo } from 'lib/utils/url-utils.js';
import { tShape, ashoatKeyserverID } from 'lib/utils/validation-utils.js';
@@ -61,7 +57,7 @@
import { getWebPushConfig } from '../push/providers.js';
import { setNewSession } from '../session/cookies.js';
import { Viewer } from '../session/viewer.js';
-import { validateOutput } from '../utils/validation-utils.js';
+import { serverStateSyncSpecs } from '../shared/state-sync/state-sync-specs.js';
const initialKeyserverInfoValidator = tShape<InitialKeyserverInfo>({
sessionID: t.maybe(t.String),
@@ -329,13 +325,9 @@
const { threadInfos } = await threadStorePromise;
const threadHashes = {};
for (const id in threadInfos) {
- const threadInfo = threadInfos[id];
- const convertedThreadInfo = validateOutput(
- viewer.platformDetails,
- rawThreadInfoValidator,
- threadInfo,
+ threadHashes[id] = serverStateSyncSpecs.threads.getServerInfoHash(
+ threadInfos[id],
);
- threadHashes[id] = hash(convertedThreadInfo);
}
return { threadHashes };
})();
diff --git a/keyserver/src/shared/state-sync/current-user-state-sync-spec.js b/keyserver/src/shared/state-sync/current-user-state-sync-spec.js
--- a/keyserver/src/shared/state-sync/current-user-state-sync-spec.js
+++ b/keyserver/src/shared/state-sync/current-user-state-sync-spec.js
@@ -2,10 +2,13 @@
import { currentUserStateSyncSpec as libSpec } from 'lib/shared/state-sync/current-user-state-sync-spec.js';
import type { CurrentUserInfo } from 'lib/types/user-types.js';
+import { currentUserInfoValidator } from 'lib/types/user-types.js';
+import { hash } from 'lib/utils/objects.js';
import type { ServerStateSyncSpec } from './state-sync-spec.js';
import { fetchCurrentUserInfo } from '../../fetchers/user-fetchers.js';
import type { Viewer } from '../../session/viewer.js';
+import { validateOutput } from '../../utils/validation-utils.js';
export const currentUserStateSyncSpec: ServerStateSyncSpec<
CurrentUserInfo,
@@ -18,5 +21,11 @@
fetchFullSocketSyncPayload(viewer: Viewer) {
return fetchCurrentUserInfo(viewer);
},
+ getServerInfosHash: getHash,
+ getServerInfoHash: getHash,
...libSpec,
});
+
+function getHash(currentUserInfo: CurrentUserInfo) {
+ return hash(validateOutput(null, currentUserInfoValidator, currentUserInfo));
+}
diff --git a/keyserver/src/shared/state-sync/entries-state-sync-spec.js b/keyserver/src/shared/state-sync/entries-state-sync-spec.js
--- a/keyserver/src/shared/state-sync/entries-state-sync-spec.js
+++ b/keyserver/src/shared/state-sync/entries-state-sync-spec.js
@@ -2,11 +2,13 @@
import { serverEntryInfosObject } from 'lib/shared/entry-utils.js';
import { entriesStateSyncSpec as libSpec } from 'lib/shared/state-sync/entries-state-sync-spec.js';
-import type {
- CalendarQuery,
- RawEntryInfo,
- RawEntryInfos,
+import {
+ type CalendarQuery,
+ type RawEntryInfo,
+ type RawEntryInfos,
+ rawEntryInfoValidator,
} from 'lib/types/entry-types.js';
+import { hash, combineUnorderedHashes, values } from 'lib/utils/objects.js';
import type { ServerStateSyncSpec } from './state-sync-spec.js';
import {
@@ -14,6 +16,7 @@
fetchEntryInfosByID,
} from '../../fetchers/entry-fetchers.js';
import type { Viewer } from '../../session/viewer.js';
+import { validateOutput } from '../../utils/validation-utils.js';
export const entriesStateSyncSpec: ServerStateSyncSpec<
RawEntryInfos,
@@ -35,5 +38,13 @@
const result = await fetchEntryInfos(viewer, query);
return result.rawEntryInfos;
},
+ getServerInfosHash(infos: RawEntryInfos) {
+ return combineUnorderedHashes(values(infos).map(getServerInfoHash));
+ },
+ getServerInfoHash,
...libSpec,
});
+
+function getServerInfoHash(info: RawEntryInfo) {
+ return hash(validateOutput(null, rawEntryInfoValidator, info));
+}
diff --git a/keyserver/src/shared/state-sync/state-sync-spec.js b/keyserver/src/shared/state-sync/state-sync-spec.js
--- a/keyserver/src/shared/state-sync/state-sync-spec.js
+++ b/keyserver/src/shared/state-sync/state-sync-spec.js
@@ -11,5 +11,7 @@
viewer: Viewer,
calendarQuery: $ReadOnlyArray<CalendarQuery>,
) => Promise<FullSocketSyncPayload>,
+ +getServerInfosHash: (infos: Infos) => number,
+ +getServerInfoHash: (info: Info) => number,
...StateSyncSpec<Infos, Info>,
};
diff --git a/keyserver/src/shared/state-sync/threads-state-sync-spec.js b/keyserver/src/shared/state-sync/threads-state-sync-spec.js
--- a/keyserver/src/shared/state-sync/threads-state-sync-spec.js
+++ b/keyserver/src/shared/state-sync/threads-state-sync-spec.js
@@ -4,11 +4,14 @@
import {
type RawThreadInfos,
type RawThreadInfo,
+ rawThreadInfoValidator,
} from 'lib/types/thread-types.js';
+import { hash, combineUnorderedHashes, values } from 'lib/utils/objects.js';
import type { ServerStateSyncSpec } from './state-sync-spec.js';
import { fetchThreadInfos } from '../../fetchers/thread-fetchers.js';
import type { Viewer } from '../../session/viewer.js';
+import { validateOutput } from '../../utils/validation-utils.js';
export const threadsStateSyncSpec: ServerStateSyncSpec<
RawThreadInfos,
@@ -24,5 +27,13 @@
const result = await fetchThreadInfos(viewer);
return result.threadInfos;
},
+ getServerInfosHash(infos: RawThreadInfos) {
+ return combineUnorderedHashes(values(infos).map(getServerInfoHash));
+ },
+ getServerInfoHash,
...libSpec,
});
+
+function getServerInfoHash(info: RawThreadInfo) {
+ return hash(validateOutput(null, rawThreadInfoValidator, info));
+}
diff --git a/keyserver/src/shared/state-sync/users-state-sync-spec.js b/keyserver/src/shared/state-sync/users-state-sync-spec.js
--- a/keyserver/src/shared/state-sync/users-state-sync-spec.js
+++ b/keyserver/src/shared/state-sync/users-state-sync-spec.js
@@ -2,11 +2,13 @@
import { usersStateSyncSpec as libSpec } from 'lib/shared/state-sync/users-state-sync-spec.js';
import type { UserInfos, UserInfo } from 'lib/types/user-types.js';
-import { values } from 'lib/utils/objects.js';
+import { userInfoValidator } from 'lib/types/user-types.js';
+import { values, hash, combineUnorderedHashes } from 'lib/utils/objects.js';
import type { ServerStateSyncSpec } from './state-sync-spec.js';
import { fetchKnownUserInfos } from '../../fetchers/user-fetchers.js';
import type { Viewer } from '../../session/viewer.js';
+import { validateOutput } from '../../utils/validation-utils.js';
export const usersStateSyncSpec: ServerStateSyncSpec<
UserInfos,
@@ -24,5 +26,13 @@
const result = await fetchKnownUserInfos(viewer);
return values(result);
},
+ getServerInfosHash(infos: UserInfos) {
+ return combineUnorderedHashes(values(infos).map(getServerInfoHash));
+ },
+ getServerInfoHash,
...libSpec,
});
+
+function getServerInfoHash(info: UserInfo) {
+ return hash(validateOutput(null, userInfoValidator, info));
+}
diff --git a/keyserver/src/socket/session-utils.js b/keyserver/src/socket/session-utils.js
--- a/keyserver/src/socket/session-utils.js
+++ b/keyserver/src/socket/session-utils.js
@@ -4,6 +4,10 @@
import t from 'tcomb';
import type { TUnion } from 'tcomb';
+import {
+ FUTURE_CODE_VERSION,
+ hasMinCodeVersion,
+} from 'lib/shared/version-utils.js';
import type { UpdateActivityResult } from 'lib/types/activity-types.js';
import type { IdentityKeysBlob } from 'lib/types/crypto-types.js';
import { isDeviceType } from 'lib/types/device-types.js';
@@ -385,9 +389,22 @@
const promises = Object.fromEntries(
values(serverStateSyncSpecs).map(spec => [
spec.hashKey,
+ // The FlowFixMes in the following function are needed because flow
+ // doesn't understand that `data` is of the generic Info type of the
+ // spec we are currently iterating on
(async () => {
+ // $FlowFixMe
const data = await spec.fetch(viewer);
- return hash(data);
+ if (
+ !hasMinCodeVersion(viewer.platformDetails, {
+ native: FUTURE_CODE_VERSION,
+ web: FUTURE_CODE_VERSION,
+ })
+ ) {
+ return hash(data);
+ }
+ // $FlowFixMe
+ return spec.getServerInfosHash(data);
})(),
]),
);
@@ -452,7 +469,18 @@
// out which infos don't match first
const infos = fetchedData[key];
for (const infoID in infos) {
- hashesToCheck[`${innerHashKey}|${infoID}`] = hash(infos[infoID]);
+ let hashValue;
+ if (
+ hasMinCodeVersion(viewer.platformDetails, {
+ native: FUTURE_CODE_VERSION,
+ web: FUTURE_CODE_VERSION,
+ })
+ ) {
+ hashValue = spec.getServerInfoHash(infos[infoID]);
+ } else {
+ hashValue = hash(infos[infoID]);
+ }
+ hashesToCheck[`${innerHashKey}|${infoID}`] = hashValue;
}
failUnmentioned[key] = true;
} else if (isTopLevelKey) {
diff --git a/lib/utils/objects.js b/lib/utils/objects.js
--- a/lib/utils/objects.js
+++ b/lib/utils/objects.js
@@ -73,6 +73,14 @@
return stringHash(stableStringify(obj));
}
+// This function doesn't look at the order of the hashes inside of the array
+// e.g `combineUnorderedHashes([1,2,3]) === combineUnorderedHashes([3,1,2])`
+// so it should only be used if the hashes include their ordering in them
+// somehow (e.g. `RawThreadInfo` contains `id`)
+function combineUnorderedHashes(hashes: $ReadOnlyArray<number>): number {
+ return hashes.reduce((a, v) => a ^ v, 0);
+}
+
// returns an object with properties from obj1 not included in obj2
function deepDiff<K, T>(
obj1: NestedObjectMap<K, T>,
@@ -125,6 +133,7 @@
findMaximumDepth,
values,
hash,
+ combineUnorderedHashes,
assertObjectsAreEqual,
deepDiff,
entries,
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Jan 15, 1:46 AM (16 h, 28 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5935208
Default Alt Text
D9267.1768441602.diff (10 KB)
Attached To
Mode
D9267: [keyserver] Add new hashing to keyserver state check
Attached
Detach File
Event Timeline
Log In to Comment