Beispiel #1
0
        public async Task <IActionResult> CheckAddress(string address)
        {
            IncomingServerToken serverToken = await _repository.GetIncomingServerTokenByNameAsync(address);

            if (serverToken == null)
            {
                return(Ok());
            }
            return(Conflict());
        }
        // Retrieves the token and adds the user to the database
        public async Task <Result <User> > AuthenticateUser(string address, string token)
        {
            // Finds server ID, and returns failure if none found
            IncomingServerToken server = await _repository.GetIncomingServerTokenByNameAsync(address);

            if (server == null)
            {
                return(Result.Fail <User>("Invalid address", 400));
            }

            // Checks tokens, and returns failure if invalid
            Result <CrossConnectionUser> result = await _client.AuthenticateToken(server.CrossConnectionAddress, token);

            if (result.Failure)
            {
                return(Result.Fail <User>(result.Error, result.Code));
            }

            // Finds user and returns if no null, otherwise creates new user
            User user = await _repository.GetRemoteUserAsync(server.IncomingServerTokenID, result.Value.Username);

            if (user != null)
            {
                return(Result.Ok(user));
            }

            // Creates new user and adds to database
            User newUser = new User()
            {
                Username   = result.Value.Username,
                Email      = result.Value.Email,
                ServerID   = server.IncomingServerTokenID,
                SignupDate = DateTime.Now
            };
            Result signUpResult = await _repository.SignupAsync(newUser);

            await _repository.SaveChangesAsync();

            if (signUpResult.Failure)
            {
                return(Result.Fail <User>(signUpResult.Error, signUpResult.Code));
            }
            return(Result.Ok(newUser));
        }
Beispiel #3
0
        // Returns true if the token is valid, else false
        private async Task <AuthenticateResult> verifyToken(string token)
        {
            IncomingServerToken serverToken = await _repository.GetIncomingServerTokenByValueAsync(token);

            if (serverToken == null)
            {
                return(AuthenticateResult.Fail("Unauthorized"));
            }

            List <Claim> claims = new List <Claim>()
            {
                new Claim(ClaimTypes.NameIdentifier, serverToken.Address),
            };
            ClaimsIdentity       identity  = new ClaimsIdentity(claims, Scheme.Name);
            ClaimsPrincipal      principal = new ClaimsPrincipal(identity);
            AuthenticationTicket ticket    = new AuthenticationTicket(principal, Scheme.Name);

            return(AuthenticateResult.Success(ticket));
        }
Beispiel #4
0
        public async Task <IActionResult> RegisterIncomingToken(RegisterTokenRequest request)
        {
            // Retrieves the urls of the services of the instance, and returns error if unsuccessful
            Result <ServerURLs> urlResult = await SimpleForumClient.GetServerURLs(request.Address);

            if (urlResult.Failure)
            {
                return(StatusCode(urlResult.Code, urlResult.Error));
            }

            // Adds the token to checks it is valid
            IncomingServerToken token = new IncomingServerToken()
            {
                Address                = request.Address,
                ApiAddress             = urlResult.Value.APIURL,
                CrossConnectionAddress = urlResult.Value.CrossConnectionURL,
                Token = request.Token
            };

            Result addResult = await _repository.AddIncomingServerToken(token);

            if (addResult.Failure)
            {
                return(StatusCode(addResult.Code, addResult.Error));
            }
            Result checkResult = await _crossConnectionClient.CheckToken(token.CrossConnectionAddress, request.Token);

            // Returns error if token is invalid, otherwise saves changes
            if (checkResult.Failure)
            {
                return(StatusCode(checkResult.Code, checkResult.Error));
            }
            await _repository.SaveChangesAsync();

            return(Ok());
        }