public WebAccessRequestResponse GetAccessRequestStatus(string token) { WebAccessRequestResponse response = new WebAccessRequestResponse(); if (accessRequestDialogs[token] != null) { response.UserHasResponded = accessRequestDialogs[token].UserHasResponded; response.Username = accessRequestDialogs[token].SelectedUser; response.IsAllowed = accessRequestDialogs[token].SelectedUser != null; } return response; }
public WebAccessRequestResponse CreateAccessRequest(string clientName) { // generate the request string ip = WCFUtil.GetClientIPAddress(); string token = RandomGenerator.GetRandomString(40); WebAccessRequestResponse request = new WebAccessRequestResponse() { ClientName = clientName, IsAllowed = false, UserHasResponded = false, Token = token }; if (!Configuration.Services.AccessRequestEnabled) { Log.Info("User access request from {0} (claims to be client {1}) denied because user access requests are disabled on this system (check configuration)", ip, clientName); request.UserHasResponded = true; request.Token = null; return request; } requests[token] = request; Log.Info("Received access request from {0} (claims to be client {1}), gave it token {2}", ip, clientName, token); CancellationTokenSource cancelToken = new CancellationTokenSource(); cancelTokens[token] = cancelToken; // ask the user askUserTasks[token] = Task.Factory.StartNew(delegate() { String result = null; if (Mediaportal.IsMediaPortalRunning() && WifiRemote.IsInstalled) { Log.Debug("Requesting user response through WifiRemote"); result = RequestAccessThroughWifiRemote(clientName, ip, cancelToken); } else { Log.Debug("Requesting user response through USS"); result = RequestAccessThroughPrivateUSS(token, clientName, ip, cancelToken); } Log.Debug("Finish asking user about access request with token {0}: {1}", token, result); // make sure that the request is still active (not cancelled) if (requests.ContainsKey(token)) { lock (requests[token]) { // set the necessary flags var matchingUsers = Configuration.Authentication.Users.Where(x => x.Username == result); requests[token].ErrorDuringProcessing = result == ERROR || !matchingUsers.Any(); requests[token].IsAllowed = !requests[token].ErrorDuringProcessing && result != null; requests[token].UserHasResponded = true; if (matchingUsers.Any()) { Log.Info("Sending account {0} in response to access request {1}", matchingUsers.First().Username, token); requests[token].Username = matchingUsers.First().Username; requests[token].Password = matchingUsers.First().GetPassword(); } else if (result == ERROR) { Log.Error("Failure during access request for token {0}", token); } else if (result != null) { Log.Warn("Didn't find a user named '{0}' - something strange is going on!", result); } } } return true; }, cancelToken.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default); askUserTasks[token].LogOnException(); // return the token to the client return request; }