public async Task OnNavigate(WebView sender, WebNavigatedEventArgs args)
        {
            // Returns if not result URL
            string targetFqdn = _targetInstance.Replace("http://", "").Replace("http://", "");

            if (!args.Url.StartsWith($"http://{targetFqdn}") &&
                !args.Url.StartsWith($"https://{targetFqdn}"))
            {
                return;
            }

            // Retrieves token and sets it to a new client
            string pageHTML = await sender.EvaluateJavaScriptAsync("document.documentElement.outerHTML").ConfigureAwait(false);

            string response = pageHTML
                              .Replace("\\u003Chtml>\\u003Chead>\\u003C/head>\\u003Cbody>\\u003Cpre style=\\\"word-wrap: break-word; white-space: pre-wrap;\\\">", "")
                              .Replace("\\u003C/pre>\\u003C/body>\\u003C/html>", "");

            // Retrieves server URLs and adds instance
            Result <ServerURLs> serverUrLs = await SimpleForumClient.GetServerURLs(_targetInstance).ConfigureAwait(false);

            if (!this.HandleResult(serverUrLs))
            {
                return;
            }
            SimpleForumClient client = new SimpleForumClient(serverUrLs.Value.APIURL);

            client.TokenStorage.SetToken(response);
            Instance instance = new Instance(serverUrLs.Value, client);
            await _account.AddInstance(instance);

            // Closes webview
            MainThread.BeginInvokeOnMainThread(async() => await Application.Current.MainPage.Navigation.PopAsync());
        }
Beispiel #2
0
        public Account(string username, ServerURLs serverURLs, SimpleForumClient client)
        {
            Username       = username;
            ServerURLs     = serverURLs;
            Client         = client;
            UseUserCommand = new Command(UseUser);

            Instance instance = new Instance(serverURLs, client);

            CurrentInstance = instance;
            Instances.Add(instance);
        }
        // Registers an outgoing token on the given server
        public async Task <Result> RegisterToken(string address)
        {
            // Retrieves ServerURLs
            Result <ServerURLs> result = await SimpleForumClient.GetServerURLs(address);

            if (result.Failure)
            {
                return(result);
            }
            ServerURLs serverUrLs = result.Value;

            // Checks if the address has already been registered
            Result checkResult = await _client.CheckAddress(serverUrLs.CrossConnectionURL, _config.InstanceURL);

            if (checkResult.Failure)
            {
                return(checkResult);
            }


            // Adds token to repository and
            OutgoingServerToken token = new OutgoingServerToken()
            {
                Address                = address,
                ApiAddress             = serverUrLs.APIURL,
                CrossConnectionAddress = serverUrLs.CrossConnectionURL,
                Token = Guid.NewGuid().ToString()
            };

            await _repository.AddOutgoingServerTokenAsync(token);

            await _repository.SaveChangesAsync();

            Result registerResult = await _client.RegisterAddress(serverUrLs.CrossConnectionURL, _config.InstanceURL, token.Token);

            if (registerResult.Failure)
            {
                return(registerResult);
            }
            return(Result.Ok());
        }
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());
        }