private static SignalProtocolAddress GetPreferredProtocolAddress(SignalProtocolStore store, SignalServiceAddress address, int sourceDevice) { SignalProtocolAddress?uuidAddress = address.Uuid.HasValue ? new SignalProtocolAddress(address.Uuid.Value.ToString(), (uint)sourceDevice) : null; SignalProtocolAddress?e164Address = address.GetNumber() != null ? new SignalProtocolAddress(address.GetNumber(), (uint)sourceDevice) : null; if (uuidAddress != null && store.ContainsSession(uuidAddress)) { return(uuidAddress); } else if (e164Address != null && store.ContainsSession(e164Address)) { return(e164Address); } else { return(new SignalProtocolAddress(address.GetIdentifier(), (uint)sourceDevice)); } }
/// <summary> /// Fetches a profile from the server. Blocks until the response arrives or a timeout occurs. /// </summary> /// <param name="address"></param> /// <param name="unidentifiedAccess"></param> /// <returns></returns> public async Task <SignalServiceProfile> GetProfileAsync(SignalServiceAddress address, UnidentifiedAccess?unidentifiedAccess) { logger.LogTrace("GetProfile()"); var headers = new List <string>() { "content-type:application/json" }; if (unidentifiedAccess != null) { headers.Add("Unidentified-Access-Key:" + Base64.EncodeBytes(unidentifiedAccess.UnidentifiedAccessKey)); } WebSocketRequestMessage requestMessage = new WebSocketRequestMessage() { Id = BitConverter.ToUInt64(Util.GetSecretBytes(sizeof(long)), 0), Verb = "GET", Path = $"/v1/profile/{address.GetIdentifier()}" }; var sendTask = (await websocket.SendRequest(requestMessage)).Task; var timerCancelSource = new CancellationTokenSource(); if (await Task.WhenAny(sendTask, Task.Delay(TimeSpan.FromSeconds(10), timerCancelSource.Token)) == sendTask) { timerCancelSource.Cancel(); var(Status, Body) = sendTask.Result; if (Status < 200 || Status >= 300) { throw new IOException("non-successful response: " + Status); } return(JsonUtil.FromJson <SignalServiceProfile>(Body)); } else { throw new IOException("timeout reached while waiting for profile"); } }