Exemplo n.º 1
0
        public HandshakeResponseModel Post(HandshakeRequestModel model)
        {
            // Check if we have an identity token
            if (string.IsNullOrEmpty(model.Identity))
            {
                return(new HandshakeResponseModel
                {
                    IsSuccessful = false,
                });
            }

            // Process as handshake, matching identity token
            var user = dbContext.MqttUsers
                       .Where(x => x.Identity == model.Identity)
                       .FirstOrDefault();

            // Check if user is found
            if (user == null)
            {
                return(new HandshakeResponseModel
                {
                    IsSuccessful = false,
                });
            }

            // Add handshake
            user.LastHandshakeAt = DateTime.Now;
            var userHandshake = new MqttUserHandshake
            {
                MqttUserId  = user.Id,
                HandshakeAt = user.LastHandshakeAt,
            };

            dbContext.MqttUserHandshakes.Add(userHandshake);
            dbContext.SaveChanges();

            return(new HandshakeResponseModel
            {
                IsSuccessful = true,
            });
        }
        public RegisterResponseModel Post(RegisterRequestModel model)
        {
            // Validate onboarding token if required
            if (IsOnboardingTokenEnabled && OnboardingToken != model.OnboardingToken)
            {
                // Onboarding token enabled, no match found, reject registration
                return(new RegisterResponseModel
                {
                    IsSuccessful = false,
                });
            }

            // Register new user, token either matches or is not needed
            var password = GenerateRandomString(32); // Generate password, length 32 chars
            var user     = new MqttUser
            {
                Identity        = "id-" + GenerateRandomString(61),         // Generate identity, length 64 chars
                Username        = "******" + GenerateRandomString(29),         // Generate username, length 32 chars
                Password        = BCrypt.Net.BCrypt.HashPassword(password), // Hash password
                LastHandshakeAt = DateTime.Now,
            };

            dbContext.MqttUsers.Add(user);
            dbContext.SaveChanges();

            // Add ACL
            var userAclPub = new MqttUserAccessControlListItem
            {
                MqttUserId   = user.Id,
                Type         = MqttUserAccessControlListItem.TypePublish,
                TopicPattern = "#",
            };
            var userAclSub = new MqttUserAccessControlListItem
            {
                MqttUserId   = user.Id,
                Type         = MqttUserAccessControlListItem.TypeSubscibe,
                TopicPattern = "#",
            };

            dbContext.MqttUserAccessControlListItems.Add(userAclPub);
            dbContext.MqttUserAccessControlListItems.Add(userAclSub);

            // Add handshake
            var userHandshake = new MqttUserHandshake
            {
                MqttUserId  = user.Id,
                HandshakeAt = user.LastHandshakeAt,
            };

            dbContext.MqttUserHandshakes.Add(userHandshake);

            dbContext.SaveChanges();

            // Return credentials
            return(new RegisterResponseModel
            {
                IsSuccessful = true,
                Identity = user.Identity,
                Username = user.Username,
                Password = password,
            });
        }