Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F3757016
D9168.id32741.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
14 KB
Referenced Files
None
Subscribers
None
D9168.id32741.diff
View Options
diff --git a/keyserver/src/fetchers/thread-fetchers.js b/keyserver/src/fetchers/thread-fetchers.js
--- a/keyserver/src/fetchers/thread-fetchers.js
+++ b/keyserver/src/fetchers/thread-fetchers.js
@@ -18,7 +18,7 @@
} from 'lib/types/thread-types.js';
import { ServerError } from 'lib/utils/errors.js';
-import { getUploadURL } from './upload-fetchers.js';
+import { getUploadURL, makeUploadURI } from './upload-fetchers.js';
import { dbQuery, SQL, mergeAndConditions } from '../database/database.js';
import type { SQLStatementType } from '../database/types.js';
import type { Viewer } from '../session/viewer.js';
@@ -113,7 +113,7 @@
t.source_message, t.replies_count, t.avatar, t.pinned_count, m.user,
m.role, m.permissions, m.subscription,
m.last_read_message < m.last_message AS unread, m.sender,
- up.id AS upload_id, up.secret AS upload_secret
+ up.id AS upload_id, up.secret AS upload_secret, up.extra AS upload_extra
`
.append(primaryFetchClause)
.append(
@@ -158,11 +158,15 @@
if (threadsRow.avatar) {
const avatar: AvatarDBContent = JSON.parse(threadsRow.avatar);
let clientAvatar: ?ClientAvatar;
- if (avatar && avatar.type !== 'image') {
+ if (
+ avatar &&
+ avatar.type !== 'image' &&
+ avatar.type !== 'encrypted_image'
+ ) {
clientAvatar = avatar;
} else if (
avatar &&
- avatar.type === 'image' &&
+ (avatar.type === 'image' || avatar.type === 'encrypted_image') &&
threadsRow.upload_id &&
threadsRow.upload_secret
) {
@@ -171,10 +175,24 @@
uploadID === avatar.uploadID,
`uploadID of upload should match uploadID of image avatar`,
);
- clientAvatar = {
- type: 'image',
- uri: getUploadURL(uploadID, threadsRow.upload_secret),
- };
+ if (avatar.type === 'encrypted_image' && threadsRow.upload_extra) {
+ const uploadExtra = JSON.parse(threadsRow.upload_extra);
+ clientAvatar = {
+ type: 'encrypted_image',
+ blobURI: makeUploadURI(
+ uploadExtra.blobHash,
+ uploadID,
+ threadsRow.upload_secret,
+ ),
+ encryptionKey: uploadExtra.encryptionKey,
+ thumbHash: uploadExtra.thumbHash,
+ };
+ } else {
+ clientAvatar = {
+ type: 'image',
+ uri: getUploadURL(uploadID, threadsRow.upload_secret),
+ };
+ }
}
threadInfos[threadID] = {
diff --git a/keyserver/src/fetchers/user-fetchers.js b/keyserver/src/fetchers/user-fetchers.js
--- a/keyserver/src/fetchers/user-fetchers.js
+++ b/keyserver/src/fetchers/user-fetchers.js
@@ -22,7 +22,7 @@
} from 'lib/types/user-types.js';
import { ServerError } from 'lib/utils/errors.js';
-import { getUploadURL } from './upload-fetchers.js';
+import { getUploadURL, makeUploadURI } from './upload-fetchers.js';
import { dbQuery, SQL } from '../database/database.js';
import type { Viewer } from '../session/viewer.js';
@@ -35,7 +35,7 @@
const query = SQL`
SELECT u.id, u.username, u.avatar,
- up.id AS upload_id, up.secret AS upload_secret
+ up.id AS upload_id, up.secret AS upload_secret, up.extra AS upload_extra
FROM users u
LEFT JOIN uploads up
ON up.container = u.id
@@ -49,11 +49,15 @@
const avatar: ?AvatarDBContent = row.avatar ? JSON.parse(row.avatar) : null;
let clientAvatar: ?ClientAvatar;
- if (avatar && avatar.type !== 'image') {
+ if (
+ avatar &&
+ avatar.type !== 'image' &&
+ avatar.type !== 'encrypted_image'
+ ) {
clientAvatar = avatar;
} else if (
avatar &&
- avatar.type === 'image' &&
+ (avatar.type === 'image' || avatar.type === 'encrypted_image') &&
row.upload_id &&
row.upload_secret
) {
@@ -62,10 +66,24 @@
uploadID === avatar.uploadID,
'uploadID of upload should match uploadID of image avatar',
);
- clientAvatar = {
- type: 'image',
- uri: getUploadURL(uploadID, row.upload_secret),
- };
+ if (avatar.type === 'encrypted_image' && row.upload_extra) {
+ const uploadExtra = JSON.parse(row.upload_extra);
+ clientAvatar = {
+ type: 'encrypted_image',
+ blobURI: makeUploadURI(
+ uploadExtra.blobHash,
+ uploadID,
+ row.upload_secret,
+ ),
+ encryptionKey: uploadExtra.encryptionKey,
+ thumbHash: uploadExtra.thumbHash,
+ };
+ } else {
+ clientAvatar = {
+ type: 'image',
+ uri: getUploadURL(uploadID, row.upload_secret),
+ };
+ }
}
userInfos[id] = clientAvatar
@@ -106,8 +124,8 @@
const query = SQL`
SELECT ru.user1, ru.user2, u.username, u.avatar, ru.status AS undirected_status,
rd1.status AS user1_directed_status, rd2.status AS user2_directed_status,
- up1.id AS user1_upload_id, up1.secret AS user1_upload_secret,
- up2.id AS user2_upload_id, up2.secret AS user2_upload_secret
+ up1.id AS user1_upload_id, up1.secret AS user1_upload_secret, up1.extra AS user1_upload_extra,
+ up2.id AS user2_upload_id, up2.secret AS user2_upload_secret, up2.extra AS user2_upload_extra
FROM relationships_undirected ru
LEFT JOIN relationships_directed rd1
ON rd1.user1 = ru.user1 AND rd1.user2 = ru.user2
@@ -135,8 +153,8 @@
CAST(NULL AS UNSIGNED) AS undirected_status,
CAST(NULL AS UNSIGNED) AS user1_directed_status,
CAST(NULL AS UNSIGNED) AS user2_directed_status,
- up.id AS user1_upload_id, up.secret AS user1_upload_secret,
- NULL AS user2_upload_id, NULL AS user2_upload_secret
+ up.id AS user1_upload_id, up.secret AS user1_upload_secret, up.extra AS user1_upload_extra,
+ NULL AS user2_upload_id, NULL AS user2_upload_secret, NULL AS user2_upload_extra
FROM users u
LEFT JOIN uploads up
ON up.container = u.id
@@ -153,11 +171,15 @@
const avatar: ?AvatarDBContent = row.avatar ? JSON.parse(row.avatar) : null;
let clientAvatar: ?ClientAvatar;
- if (avatar && avatar.type !== 'image') {
+ if (
+ avatar &&
+ avatar.type !== 'image' &&
+ avatar.type !== 'encrypted_image'
+ ) {
clientAvatar = avatar;
} else if (
avatar &&
- avatar.type === 'image' &&
+ (avatar.type === 'image' || avatar.type === 'encrypted_image') &&
row.user1_upload_id &&
row.user1_upload_secret
) {
@@ -166,13 +188,27 @@
uploadID === avatar.uploadID,
'uploadID of upload should match uploadID of image avatar',
);
- clientAvatar = {
- type: 'image',
- uri: getUploadURL(uploadID, row.user1_upload_secret),
- };
+ if (avatar.type === 'encrypted_image' && row.user1_upload_extra) {
+ const uploadExtra = JSON.parse(row.user1_upload_extra);
+ clientAvatar = {
+ type: 'encrypted_image',
+ blobURI: makeUploadURI(
+ uploadExtra.blobHash,
+ uploadID,
+ row.user1_upload_secret,
+ ),
+ encryptionKey: uploadExtra.encryptionKey,
+ thumbHash: uploadExtra.thumbHash,
+ };
+ } else {
+ clientAvatar = {
+ type: 'image',
+ uri: getUploadURL(uploadID, row.user1_upload_secret),
+ };
+ }
} else if (
avatar &&
- avatar.type === 'image' &&
+ (avatar.type === 'image' || avatar.type === 'encrypted_image') &&
row.user2_upload_id &&
row.user2_upload_secret
) {
@@ -181,10 +217,24 @@
uploadID === avatar.uploadID,
'uploadID of upload should match uploadID of image avatar',
);
- clientAvatar = {
- type: 'image',
- uri: getUploadURL(uploadID, row.user2_upload_secret),
- };
+ if (avatar.type === 'encrypted_image' && row.user2_upload_extra) {
+ const uploadExtra = JSON.parse(row.user2_upload_extra);
+ clientAvatar = {
+ type: 'encrypted_image',
+ blobURI: makeUploadURI(
+ uploadExtra.blobHash,
+ uploadID,
+ row.user2_upload_secret,
+ ),
+ encryptionKey: uploadExtra.encryptionKey,
+ thumbHash: uploadExtra.thumbHash,
+ };
+ } else {
+ clientAvatar = {
+ type: 'image',
+ uri: getUploadURL(uploadID, row.user2_upload_secret),
+ };
+ }
}
const userInfo = clientAvatar
@@ -290,7 +340,7 @@
): Promise<LoggedInUserInfo> {
const userQuery = SQL`
SELECT u.id, u.username, u.avatar,
- up.id AS upload_id, up.secret AS upload_secret
+ up.id AS upload_id, up.secret AS upload_secret, up.extra AS upload_extra
FROM users u
LEFT JOIN uploads up
ON up.container = u.id
@@ -314,7 +364,7 @@
}
const id = userRow.id.toString();
- const { username, upload_id, upload_secret } = userRow;
+ const { username, upload_id, upload_secret, upload_extra } = userRow;
let loggedInUserInfo: LoggedInUserInfo = {
id,
@@ -326,18 +376,33 @@
: null;
let clientAvatar: ?ClientAvatar;
- if (avatar && avatar.type !== 'image') {
+ if (avatar && avatar.type !== 'image' && avatar.type !== 'encrypted_image') {
clientAvatar = avatar;
- } else if (avatar && avatar.type === 'image' && upload_id && upload_secret) {
+ } else if (
+ avatar &&
+ (avatar.type === 'image' || avatar.type === 'encrypted_image') &&
+ upload_id &&
+ upload_secret
+ ) {
const uploadID = upload_id.toString();
invariant(
uploadID === avatar.uploadID,
'uploadID of upload should match uploadID of image avatar',
);
- clientAvatar = {
- type: 'image',
- uri: getUploadURL(uploadID, upload_secret),
- };
+ if (avatar.type === 'encrypted_image' && upload_extra) {
+ const uploadExtra = JSON.parse(upload_extra);
+ clientAvatar = {
+ type: 'encrypted_image',
+ blobURI: makeUploadURI(uploadExtra.blobHash, uploadID, upload_secret),
+ encryptionKey: uploadExtra.encryptionKey,
+ thumbHash: uploadExtra.thumbHash,
+ };
+ } else {
+ clientAvatar = {
+ type: 'image',
+ uri: getUploadURL(uploadID, upload_secret),
+ };
+ }
}
if (avatar) {
diff --git a/keyserver/src/updaters/account-updaters.js b/keyserver/src/updaters/account-updaters.js
--- a/keyserver/src/updaters/account-updaters.js
+++ b/keyserver/src/updaters/account-updaters.js
@@ -30,7 +30,7 @@
import { createUpdates } from '../creators/update-creator.js';
import { dbQuery, SQL } from '../database/database.js';
-import { getUploadURL } from '../fetchers/upload-fetchers.js';
+import { getUploadURL, makeUploadURI } from '../fetchers/upload-fetchers.js';
import { fetchKnownUserInfos } from '../fetchers/user-fetchers.js';
import type { Viewer } from '../session/viewer.js';
@@ -131,7 +131,10 @@
const newAvatarValue =
request.type === 'remove' ? null : JSON.stringify(request);
- const mediaID = request.type === 'image' ? request.uploadID : null;
+ const mediaID =
+ request.type === 'image' || request.type === 'encrypted_image'
+ ? request.uploadID
+ : null;
const query = SQL`
START TRANSACTION;
@@ -176,7 +179,7 @@
COMMIT;
- SELECT id AS upload_id, secret AS upload_secret
+ SELECT id AS upload_id, secret AS upload_secret, extra AS upload_extra
FROM uploads
WHERE id = ${mediaID}
AND uploader = ${viewer.userID}
@@ -201,16 +204,24 @@
if (request.type === 'remove') {
return null;
- } else if (request.type !== 'image') {
+ } else if (request.type !== 'image' && request.type !== 'encrypted_image') {
return request;
} else {
- const [{ upload_id, upload_secret }] = selectResult;
+ const [{ upload_id, upload_secret, upload_extra }] = selectResult;
const uploadID = upload_id.toString();
invariant(
uploadID === request.uploadID,
'uploadID of upload should match uploadID of UpdateUserAvatarRequest',
);
-
+ if (request.type === 'encrypted_image') {
+ const uploadExtra = JSON.parse(upload_extra);
+ return {
+ type: 'encrypted_image',
+ blobURI: makeUploadURI(uploadExtra.blobHash, uploadID, upload_secret),
+ encryptionKey: uploadExtra.encryptionKey,
+ thumbHash: uploadExtra.thumbHash,
+ };
+ }
return {
type: 'image',
uri: getUploadURL(uploadID, upload_secret),
diff --git a/keyserver/src/updaters/thread-updaters.js b/keyserver/src/updaters/thread-updaters.js
--- a/keyserver/src/updaters/thread-updaters.js
+++ b/keyserver/src/updaters/thread-updaters.js
@@ -635,7 +635,9 @@
if (avatarUpdate !== undefined) {
const avatarUploadID =
- avatar && avatar.type === 'image' ? avatar.uploadID : null;
+ avatar && (avatar.type === 'image' || avatar.type === 'encrypted_image')
+ ? avatar.uploadID
+ : null;
const avatarUpdateQuery = SQL`
START TRANSACTION;
diff --git a/lib/components/base-edit-thread-avatar-provider.react.js b/lib/components/base-edit-thread-avatar-provider.react.js
--- a/lib/components/base-edit-thread-avatar-provider.react.js
+++ b/lib/components/base-edit-thread-avatar-provider.react.js
@@ -79,7 +79,10 @@
},
};
const action = changeThreadSettingsActionTypes.started;
- if (avatarRequest.type === 'image') {
+ if (
+ avatarRequest.type === 'image' ||
+ avatarRequest.type === 'encrypted_image'
+ ) {
updateThreadAvatarMediaUploadInProgress(false);
}
const promise = changeThreadSettingsCall(updateThreadRequest);
diff --git a/lib/components/edit-user-avatar-provider.react.js b/lib/components/edit-user-avatar-provider.react.js
--- a/lib/components/edit-user-avatar-provider.react.js
+++ b/lib/components/edit-user-avatar-provider.react.js
@@ -72,7 +72,7 @@
const baseSetUserAvatar = React.useCallback(
async (request: UpdateUserAvatarRequest) => {
const promise = (async () => {
- if (request.type === 'image') {
+ if (request.type === 'image' || request.type === 'encrypted_image') {
setUserAvatarMediaUploadInProgress(false);
}
return await updateUserAvatarCall(request);
diff --git a/native/account/registration/avatar-selection.react.js b/native/account/registration/avatar-selection.react.js
--- a/native/account/registration/avatar-selection.react.js
+++ b/native/account/registration/avatar-selection.react.js
@@ -91,7 +91,8 @@
} else if (selection.updateUserAvatarRequest.type !== 'remove') {
const clientRequest = selection.updateUserAvatarRequest;
invariant(
- clientRequest.type !== 'image',
+ clientRequest.type !== 'image' &&
+ clientRequest.type !== 'encrypted_image',
'image avatars need to be uploaded',
);
const newAvatarData = {
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Jan 11, 6:55 AM (20 h, 9 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2860894
Default Alt Text
D9168.id32741.diff (14 KB)
Attached To
Mode
D9168: [keyserver][lib] Support new avatar type for encrypted images
Attached
Detach File
Event Timeline
Log In to Comment