Example #1
0
        internal static async Task <TransportParams> Create(string host, AblyAuth auth, ClientOptions options, string connectionKey = null, long?connectionSerial = null, ILogger logger = null)
        {
            var result = new TransportParams();

            result.Host       = host;
            result.Tls        = options.Tls;
            result.Port       = options.Tls ? options.TlsPort : options.Port;
            result.ClientId   = options.GetClientId();
            result.AuthMethod = auth.AuthMethod;
            if (result.AuthMethod == AuthMethod.Basic)
            {
                result.AuthValue = ApiKey.Parse(options.Key).ToString();
            }
            else
            {
                var token = await auth.GetCurrentValidTokenAndRenewIfNecessaryAsync();

                if (token == null)
                {
                    throw new AblyException("There is no valid token. Can't authenticate", 40100, HttpStatusCode.Unauthorized);
                }

                result.AuthValue = token.Token;
            }

            result.ConnectionKey     = connectionKey;
            result.ConnectionSerial  = connectionSerial;
            result.EchoMessages      = options.EchoMessages;
            result.FallbackHosts     = options.FallbackHosts;
            result.UseBinaryProtocol = options.UseBinaryProtocol;
            result.RecoverValue      = options.Recover;
            result.Logger            = logger ?? options.Logger;
            return(result);
        }
Example #2
0
        public void Parse_WithValidKeyWithWhiteSpaceOnBothSides_ReturnsValidApiKeyObject()
        {
            var key = ApiKey.Parse(" 123.456:789 ");

            Assert.Equal(key.AppId, "123");
            Assert.Equal(key.KeyName, "123.456");
            Assert.Equal(key.KeySecret, "789");
        }
Example #3
0
        public void Parse_WithValidKeyReturns_ApiKeyWithAppIdKeyAndValue()
        {
            var key = ApiKey.Parse("123.456:789");

            Assert.Equal(key.AppId, "123");
            Assert.Equal(key.KeyName, "123.456");
            Assert.Equal(key.KeySecret, "789");
        }
Example #4
0
        public void Parse_WithValidKeyWithWhiteSpaceOnBothSides_ReturnsValidApiKeyObject()
        {
            var key = ApiKey.Parse(" 123.456:789 ");

            key.AppId.Should().Be("123");
            key.KeyName.Should().Be("123.456");
            key.KeySecret.Should().Be("789");
        }
Example #5
0
        public void Parse_WithValidKeyReturns_ApiKeyWithAppIdKeyAndValue()
        {
            var key = ApiKey.Parse("123.456:789");

            key.AppId.Should().Be("123");
            key.KeyName.Should().Be("123.456");
            key.KeySecret.Should().Be("789");
        }
            public async Task WithDefaultTokenParams_ShouldSetTokenRequestValuesCorrectly()
            {
                var client = GetClientWithTokenParams();

                var request = await client.Auth.CreateTokenRequestAsync();

                request.Capability.Should().Be(Capability.AllowAll);
                request.ClientId.Should().Be("123");
                request.KeyName.Should().Be(ApiKey.Parse(client.Options.Key).KeyName);
                request.Ttl.Should().Be(TimeSpan.FromHours(2));
                request.Timestamp.Should().Be(Now.AddMinutes(1));
                request.Nonce.Should().Be("defaultnonce");
            }
Example #7
0
            public async Task WithDefaultTokenParams_ShouldSetTokenRequestValuesCorrectly()
            {
                var client = GetClientWithTokenParams();

                var request = await CreateTokenRequest(client);

                request.Capability.Should().Be(Capability.AllowAll);
                request.ClientId.Should().Be("123");
                request.KeyName.Should().Be(ApiKey.Parse(client.Options.Key).KeyName);
                request.Ttl.Should().Be(TimeSpan.FromHours(2));
                Debug.Assert(request.Timestamp.HasValue, "Expected a 'Value', got none.");
                request.Timestamp.Value.Should().BeCloseTo(Now.AddMinutes(1), TimeSpan.FromMilliseconds(100));
                request.Nonce.Should().Be("defaultnonce");
            }
Example #8
0
        public ActionResult Confirm(ApiConfirmation model)
        {
            if (!ModelState.IsValid)
            {
                return(View(model));
            }

            ApiKey toBeConfirmed = ApiKey.Parse(model.ApiKey);

            // TODO: make async
            _apiKeys.Confirm(toBeConfirmed, DateTimeOffset.UtcNow);

            return(View(model));
        }
Example #9
0
        public async Task AddAuthHeader_WithBasicAuthentication_AddsCorrectAuthorisationHeader()
        {
            //Arrange
            var    rest          = new AblyRest(ValidKey);
            ApiKey key           = ApiKey.Parse(ValidKey);
            var    request       = new AblyRequest("/test", HttpMethod.Get, Protocol.Json);
            var    expectedValue = "Basic " + key.ToString().ToBase64();

            //Act
            await rest.AblyAuth.AddAuthHeader(request);

            //Assert
            var authHeader = request.Headers.First();

            authHeader.Key.Should().Be("Authorization");
            authHeader.Value.Should().Be(expectedValue);
        }
Example #10
0
        public void AddAuthHeader_WithBasicAuthentication_AddsCorrectAuthorisationHeader()
        {
            //Arrange
            var    rest          = new RestClient(ValidKey);
            ApiKey key           = ApiKey.Parse(ValidKey);
            var    request       = new AblyRequest("/test", HttpMethod.Get, Protocol.Json);
            var    expectedValue = "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(key.ToString()));

            //Act
            rest.AddAuthHeader(request);

            //Assert
            var authHeader = request.Headers.First();

            Assert.Equal("Authorization", authHeader.Key);

            Assert.Equal(expectedValue, authHeader.Value);
        }
Example #11
0
 public void Parse_WithKeyNotContaining3PartsSeparatedByColon_ThrowsInvalidKeyException(string key)
 {
     Assert.Throws <AblyException>(delegate { ApiKey.Parse(key); });
 }
Example #12
0
        internal static async Task <TransportParams> Create(string host, AblyAuth auth, ClientOptions options, string connectionKey = null, long?connectionSerial = null, ILogger logger = null)
        {
            var result = new TransportParams
            {
                Host                 = host,
                Tls                  = options.Tls,
                Port                 = options.Tls ? options.TlsPort : options.Port,
                ClientId             = options.GetClientId(),
                ConnectionKey        = connectionKey,
                ConnectionSerial     = connectionSerial,
                EchoMessages         = options.EchoMessages,
                FallbackHosts        = options.GetFallbackHosts(),
                UseBinaryProtocol    = options.UseBinaryProtocol,
                RecoverValue         = options.Recover,
                Logger               = logger ?? options.Logger,
                AdditionalParameters = StringifyParameters(options.TransportParams),
                AuthMethod           = auth.AuthMethod,
            };

            if (result.AuthMethod == AuthMethod.Basic)
            {
                result.AuthValue = ApiKey.Parse(options.Key).ToString();
            }
            else
            {
                var token = await auth.GetCurrentValidTokenAndRenewIfNecessaryAsync();

                if (token == null)
                {
                    throw new AblyException("There is no valid token. Can't authenticate", ErrorCodes.Unauthorized, HttpStatusCode.Unauthorized);
                }

                result.AuthValue = token.Token;
            }

            return(result);

            Dictionary <string, string> StringifyParameters(Dictionary <string, object> originalParams)
            {
                if (originalParams is null)
                {
                    return(new Dictionary <string, string>());
                }

                return(originalParams.ToDictionary(x => x.Key, x => ConvertValue(x.Key, x.Value)));

                string ConvertValue(string key, object value)
                {
                    switch (value)
                    {
                    case bool boolValue:
                        return(boolValue.ToString().ToLower());

                    case null:
                        return(string.Empty);

                    default:
                        try
                        {
                            return(value.ToString());
                        }
                        catch (Exception e)
                        {
                            logger?.Error($"Error converting custom transport parameter '{key}'. Error: {e.Message}");

                            return(string.Empty);
                        }
                    }
                }
            }
        }