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));
            }
        }
Beispiel #2
0
        /// <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");
            }
        }