diff --git a/keyserver/addons/rust-node-addon/src/identity_client/get_inbound_keys_for_user.rs b/keyserver/addons/rust-node-addon/src/identity_client/get_inbound_keys_for_user.rs --- a/keyserver/addons/rust-node-addon/src/identity_client/get_inbound_keys_for_user.rs +++ b/keyserver/addons/rust-node-addon/src/identity_client/get_inbound_keys_for_user.rs @@ -19,7 +19,10 @@ ) .await?; - let inbound_keys_for_user_request = InboundKeysForUserRequest { user_id }; + let inbound_keys_for_user_request = InboundKeysForUserRequest { + user_id, + selected_devices: Vec::new(), + }; let mut response = identity_client .get_inbound_keys_for_user(inbound_keys_for_user_request) diff --git a/native/native_rust_library/src/identity/x3dh.rs b/native/native_rust_library/src/identity/x3dh.rs --- a/native/native_rust_library/src/identity/x3dh.rs +++ b/native/native_rust_library/src/identity/x3dh.rs @@ -76,6 +76,7 @@ RUNTIME.spawn(async move { let get_keyserver_keys_request = OutboundKeysForUserRequest { user_id: keyserver_id, + selected_devices: Vec::new(), }; let auth_info = AuthInfo { access_token, @@ -292,6 +293,7 @@ let response = identity_client .get_outbound_keys_for_user(OutboundKeysForUserRequest { user_id: get_outbound_keys_request_info.user_id, + selected_devices: Vec::new(), }) .await? .into_inner(); @@ -320,6 +322,7 @@ let response = identity_client .get_inbound_keys_for_user(InboundKeysForUserRequest { user_id: get_inbound_keys_request_info.user_id, + selected_devices: Vec::new(), }) .await? .into_inner(); diff --git a/services/commtest/tests/identity_keyserver_tests.rs b/services/commtest/tests/identity_keyserver_tests.rs --- a/services/commtest/tests/identity_keyserver_tests.rs +++ b/services/commtest/tests/identity_keyserver_tests.rs @@ -42,6 +42,7 @@ // Currently allowed to request your own outbound keys let keyserver_request = OutboundKeysForUserRequest { user_id: device_info.user_id.clone(), + selected_devices: Vec::new(), }; println!("Getting keyserver info for user, {}", device_info.user_id); diff --git a/services/commtest/tests/identity_one_time_key_tests.rs b/services/commtest/tests/identity_one_time_key_tests.rs --- a/services/commtest/tests/identity_one_time_key_tests.rs +++ b/services/commtest/tests/identity_one_time_key_tests.rs @@ -99,6 +99,7 @@ let keyserver_request = OutboundKeysForUserRequest { user_id: device_info.user_id, + selected_devices: Vec::new(), }; let first_keyserver_response = identity_client diff --git a/services/commtest/tests/identity_tunnelbroker_tests.rs b/services/commtest/tests/identity_tunnelbroker_tests.rs --- a/services/commtest/tests/identity_tunnelbroker_tests.rs +++ b/services/commtest/tests/identity_tunnelbroker_tests.rs @@ -58,6 +58,7 @@ // Request outbound keys, which should trigger identity service to ask for more keys let keyserver_request = OutboundKeysForUserRequest { user_id: keyserver.user_id.clone(), + selected_devices: Vec::new(), }; println!("Getting keyserver info for user, {}", keyserver.user_id); diff --git a/shared/protos/identity_auth.proto b/shared/protos/identity_auth.proto --- a/shared/protos/identity_auth.proto +++ b/shared/protos/identity_auth.proto @@ -171,6 +171,9 @@ // The device receiving a request only needs the content key and prekey. message OutboundKeysForUserRequest { string user_id = 1; + // Specifies for which devices we want to retrieve outbound keys. + // If not specified or empty, all devices will be returned. + repeated string selected_devices = 2; } // GetInboundKeysForUser @@ -189,6 +192,9 @@ message InboundKeysForUserRequest { string user_id = 1; + // Specifies for which devices we want to retrieve inbound keys. + // If not specified or empty, all devices will be returned. + repeated string selected_devices = 2; } // UpdateUserPassword diff --git a/web/protobufs/identity-auth-structs.cjs b/web/protobufs/identity-auth-structs.cjs --- a/web/protobufs/identity-auth-structs.cjs +++ b/web/protobufs/identity-auth-structs.cjs @@ -214,7 +214,7 @@ * @constructor */ proto.identity.auth.OutboundKeysForUserRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, proto.identity.auth.OutboundKeysForUserRequest.repeatedFields_, null); }; goog.inherits(proto.identity.auth.OutboundKeysForUserRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -277,7 +277,7 @@ * @constructor */ proto.identity.auth.InboundKeysForUserRequest = function(opt_data) { - jspb.Message.initialize(this, opt_data, 0, -1, null, null); + jspb.Message.initialize(this, opt_data, 0, -1, proto.identity.auth.InboundKeysForUserRequest.repeatedFields_, null); }; goog.inherits(proto.identity.auth.InboundKeysForUserRequest, jspb.Message); if (goog.DEBUG && !COMPILED) { @@ -2240,6 +2240,13 @@ +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.identity.auth.OutboundKeysForUserRequest.repeatedFields_ = [2]; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -2271,7 +2278,8 @@ */ proto.identity.auth.OutboundKeysForUserRequest.toObject = function(includeInstance, msg) { var f, obj = { - userId: jspb.Message.getFieldWithDefault(msg, 1, "") + userId: jspb.Message.getFieldWithDefault(msg, 1, ""), + selectedDevicesList: (f = jspb.Message.getRepeatedField(msg, 2)) == null ? undefined : f }; if (includeInstance) { @@ -2312,6 +2320,10 @@ var value = /** @type {string} */ (reader.readString()); msg.setUserId(value); break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.addSelectedDevices(value); + break; default: reader.skipField(); break; @@ -2348,6 +2360,13 @@ f ); } + f = message.getSelectedDevicesList(); + if (f.length > 0) { + writer.writeRepeatedString( + 2, + f + ); + } }; @@ -2369,6 +2388,43 @@ }; +/** + * repeated string selected_devices = 2; + * @return {!Array} + */ +proto.identity.auth.OutboundKeysForUserRequest.prototype.getSelectedDevicesList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 2)); +}; + + +/** + * @param {!Array} value + * @return {!proto.identity.auth.OutboundKeysForUserRequest} returns this + */ +proto.identity.auth.OutboundKeysForUserRequest.prototype.setSelectedDevicesList = function(value) { + return jspb.Message.setField(this, 2, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.identity.auth.OutboundKeysForUserRequest} returns this + */ +proto.identity.auth.OutboundKeysForUserRequest.prototype.addSelectedDevices = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.identity.auth.OutboundKeysForUserRequest} returns this + */ +proto.identity.auth.OutboundKeysForUserRequest.prototype.clearSelectedDevicesList = function() { + return this.setSelectedDevicesList([]); +}; + + @@ -2808,6 +2864,13 @@ +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.identity.auth.InboundKeysForUserRequest.repeatedFields_ = [2]; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -2839,7 +2902,8 @@ */ proto.identity.auth.InboundKeysForUserRequest.toObject = function(includeInstance, msg) { var f, obj = { - userId: jspb.Message.getFieldWithDefault(msg, 1, "") + userId: jspb.Message.getFieldWithDefault(msg, 1, ""), + selectedDevicesList: (f = jspb.Message.getRepeatedField(msg, 2)) == null ? undefined : f }; if (includeInstance) { @@ -2880,6 +2944,10 @@ var value = /** @type {string} */ (reader.readString()); msg.setUserId(value); break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.addSelectedDevices(value); + break; default: reader.skipField(); break; @@ -2916,6 +2984,13 @@ f ); } + f = message.getSelectedDevicesList(); + if (f.length > 0) { + writer.writeRepeatedString( + 2, + f + ); + } }; @@ -2937,6 +3012,43 @@ }; +/** + * repeated string selected_devices = 2; + * @return {!Array} + */ +proto.identity.auth.InboundKeysForUserRequest.prototype.getSelectedDevicesList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 2)); +}; + + +/** + * @param {!Array} value + * @return {!proto.identity.auth.InboundKeysForUserRequest} returns this + */ +proto.identity.auth.InboundKeysForUserRequest.prototype.setSelectedDevicesList = function(value) { + return jspb.Message.setField(this, 2, value || []); +}; + + +/** + * @param {string} value + * @param {number=} opt_index + * @return {!proto.identity.auth.InboundKeysForUserRequest} returns this + */ +proto.identity.auth.InboundKeysForUserRequest.prototype.addSelectedDevices = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.identity.auth.InboundKeysForUserRequest} returns this + */ +proto.identity.auth.InboundKeysForUserRequest.prototype.clearSelectedDevicesList = function() { + return this.setSelectedDevicesList([]); +}; + + diff --git a/web/protobufs/identity-auth-structs.cjs.flow b/web/protobufs/identity-auth-structs.cjs.flow --- a/web/protobufs/identity-auth-structs.cjs.flow +++ b/web/protobufs/identity-auth-structs.cjs.flow @@ -195,6 +195,11 @@ getUserId(): string; setUserId(value: string): OutboundKeysForUserRequest; + getSelectedDevicesList(): Array; + setSelectedDevicesList(value: Array): OutboundKeysForUserRequest; + clearSelectedDevicesList(): OutboundKeysForUserRequest; + addSelectedDevices(value: string, index?: number): OutboundKeysForUserRequest; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): OutboundKeysForUserRequestObject; static toObject(includeInstance: boolean, msg: OutboundKeysForUserRequest): OutboundKeysForUserRequestObject; @@ -205,6 +210,7 @@ export type OutboundKeysForUserRequestObject = { userId: string, + selectedDevicesList: Array, }; declare export class InboundKeyInfo extends Message { @@ -263,6 +269,11 @@ getUserId(): string; setUserId(value: string): InboundKeysForUserRequest; + getSelectedDevicesList(): Array; + setSelectedDevicesList(value: Array): InboundKeysForUserRequest; + clearSelectedDevicesList(): InboundKeysForUserRequest; + addSelectedDevices(value: string, index?: number): InboundKeysForUserRequest; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): InboundKeysForUserRequestObject; static toObject(includeInstance: boolean, msg: InboundKeysForUserRequest): InboundKeysForUserRequestObject; @@ -273,6 +284,7 @@ export type InboundKeysForUserRequestObject = { userId: string, + selectedDevicesList: Array, }; declare export class UpdateUserPasswordStartRequest extends Message {