Example #1
0
        public HttpResponseMessage WriteLog(string ClientName, string LogData)
        {
            //log to database
            using (Models.SQL.tasktserverContext dbContext = new tasktserverContext())
            {
                try
                {
                    ApplicationLogs log = new ApplicationLogs();
                    log.LoggedBy = ClientName;
                    log.Message  = LogData;
                    log.Type     = "WORKER LOG";
                    log.LoggedOn = DateTime.Now;
                    dbContext.ApplicationLogs.Add(log);
                    dbContext.SaveChanges();
                }
                catch (Exception)
                {
                    return(new HttpResponseMessage(HttpStatusCode.InternalServerError));
                }
            }


            // Save Code will be here
            return(new HttpResponseMessage(HttpStatusCode.OK));
        }
Example #2
0
        public IActionResult UpdateRobot(string id, string approvalAction)
        {
#warning change to try parse!
            var intID = int.Parse(id);

            tasktserverContext dbContext = new tasktserverContext();
            var requiredWorker           = dbContext.Workers.Where(f => f.Id == intID).FirstOrDefault();
            //var client = Models.ApprovalStatus.WorkForceManagement.FindClientByID(id);
            switch (approvalAction)
            {
            case "approve":
                requiredWorker.AccountStatus = (int)Models.ApprovalStatus.Enabled;
                break;

            case "disable":
                requiredWorker.AccountStatus = (int)Models.ApprovalStatus.Disabled;
                break;

            case "enable":
                requiredWorker.AccountStatus = (int)Models.ApprovalStatus.Enabled;
                break;

            default:
                break;
            }

            //write back to database
            dbContext.SaveChanges();


            return(PartialView("~/Views/Bots/PartialViews/Workforce.cshtml", dbContext.Workers.ToList()));
        }
Example #3
0
        public IActionResult RetrieveWorkforce()
        {
            tasktserverContext dbContext = new tasktserverContext();
            var workers = dbContext.Workers.ToList();



            return(PartialView("~/Views/Bots/PartialViews/Workforce.cshtml", workers));
        }
Example #4
0
        public ActionResult GetLogs(string ClientName)
        {
            //var appData = AppDomain.CurrentDomain.GetData("AppData") as string;
            //var filePath = System.IO.Path.Combine(appData, "EngineLogs", ClientName + ".txt");
            //var logs = System.IO.File.ReadAllLines(filePath);
            Models.SQL.tasktserverContext dbContext = new tasktserverContext();
            var logs = dbContext.ApplicationLogs.Where(f => f.LoggedBy == ClientName).OrderBy(f => f.LoggedOn).ToList();

            return(new OkObjectResult(logs));
        }
        public IActionResult RetrieveWorkforce()
        {
            //database context
            tasktserverContext dbContext = new tasktserverContext();

            //get workers
            var workers = dbContext.Workers.ToList();

            //return view
            return(PartialView("~/Views/Bots/PartialViews/Workforce.cshtml", workers));
        }
Example #6
0
        public IActionResult DeleteWorkerEntry(string key)
        {
            tasktserverContext dbContext = new tasktserverContext();
            var workersDeleted           = dbContext.Workers.Where(f => f.PublicKey == key);

            dbContext.Workers.RemoveRange(workersDeleted);
            dbContext.SaveChanges();

            var workers = dbContext.Workers.ToList();

            return(PartialView("~/Views/Bots/PartialViews/Workforce.cshtml", workers));
        }
Example #7
0
 private void LogEvent(ApplicationLogs log)
 {
     using (Models.SQL.tasktserverContext dbContext = new tasktserverContext())
     {
         try
         {
             log.LoggedOn = DateTime.Now;
             dbContext.ApplicationLogs.Add(log);
             dbContext.SaveChanges();
         }
         catch (Exception ex)
         {
             throw;
         }
     }
 }
        public IActionResult DeleteWorkerEntry(string key)
        {
            //database context
            tasktserverContext dbContext = new tasktserverContext();

            //get selected worker
            var workersDeleted = dbContext.Workers.Where(f => f.PublicKey == key);

            //remove worker
            dbContext.Workers.RemoveRange(workersDeleted);

            //save
            dbContext.SaveChanges();

            //return view
            return(PartialView("~/Views/Bots/PartialViews/Workforce.cshtml", dbContext.Workers));
        }
Example #9
0
        /// <summary>
        /// Processes incoming socket messages from taskt clients
        /// </summary>
        /// <param name="context"></param>
        /// <param name="webSocket"></param>
        /// <returns></returns>
        public async Task ProcessIncomingSocketMessage(HttpContext context, WebSocket webSocket)
        {
            //create dbcontext
            Models.SQL.tasktserverContext dbContext = new tasktserverContext();

            //generate GUID for this connection
            Guid guid;

            guid = Guid.NewGuid();
            string connectionGUID = guid.ToString();


            var buffer = new byte[1024 * 4];
            WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None);

            while (!result.CloseStatus.HasValue)
            {
                //get connection information
                string connectionID = context.Connection.Id;
                string ipAddress    = context.Connection.RemoteIpAddress.ToString();


                //retrieve value
                var arraySegment    = new ArraySegment <byte>(buffer, 0, result.Count);
                var incomingMessage = System.Text.Encoding.Default.GetString(arraySegment.Array);
                incomingMessage = incomingMessage.Substring(0, result.Count);

                //convert client data
                var clientData = Newtonsoft.Json.JsonConvert.DeserializeObject <SocketPackage>(incomingMessage);
                var clientInfo = string.Join(", ", "MACHINE: " + clientData.MACHINE_NAME, "USER: "******"MESSAGE: " + clientData.MESSAGE, "IP: " + ipAddress);



                if (clientData.MESSAGE.StartsWith("CLIENT_STATUS="))
                {
                    var clientUpdate = clientData.MESSAGE.Replace("CLIENT_STATUS=", "");

                    var socketClient = ActiveSocketClients.GetClient(clientData.PUBLIC_KEY);
                    if (socketClient.PingRequest.AwaitingPingReply)
                    {
                        socketClient.PingRequest.AwaitingPingReply   = false;
                        socketClient.PingRequest.ClientStatus        = clientUpdate;
                        socketClient.PingRequest.ReadyForUIReporting = true;
                    }


                    LogEvent(new ApplicationLogs()
                    {
                        Type = "WORKER UPDATE", Guid = connectionGUID, Message = clientUpdate, LoggedBy = clientData.PUBLIC_KEY
                    });

                    var worker = dbContext.Workers.Where(f => f.PublicKey == clientData.PUBLIC_KEY).FirstOrDefault();
                    if (worker != null)
                    {
                        worker.LastCommunicationReceived = DateTime.Now;
                        worker.LastExecutionStatus       = clientUpdate;
                        dbContext.SaveChanges();
                    }

                    await SendMessageAsync(webSocket, "ACK", CancellationToken.None);
                }



                LogEvent(new ApplicationLogs()
                {
                    Guid = connectionGUID, Message = "ROBOT CONNECTED FROM '" + ipAddress + "'", LoggedBy = "SYSTEM", Type = "SOCKET REQUEST"
                });
                LogEvent(new ApplicationLogs()
                {
                    Guid = connectionGUID, Message = "CLIENT INFO: " + clientInfo + "", LoggedBy = "SYSTEM", Type = "SOCKET REQUEST"
                });



                //if public key is null or empty we automatically assign
                if ((string.IsNullOrEmpty(clientData.PUBLIC_KEY)) || (dbContext.Workers.Where(f => f.PublicKey == clientData.PUBLIC_KEY).FirstOrDefault() == null))
                {
                    LogEvent(new ApplicationLogs()
                    {
                        Guid = connectionGUID, Message = "ROBOT NOT REGISTERED", LoggedBy = "SYSTEM", Type = "SOCKET REQUEST"
                    });

                    var generatedKeys = tasktServer.Cryptography.CreateKeyPair();
                    var worker        = new Workers()
                    {
                        MachineName = clientData.MACHINE_NAME, UserName = clientData.USER_NAME, AccountStatus = (int)ApprovalStatus.RequiresApproval, LastCommunicationReceived = DateTime.Now, PublicKey = generatedKeys.Item2, PrivateKey = generatedKeys.Item1
                    };
                    dbContext.Workers.Add(worker);
                    dbContext.SaveChanges();


                    ActiveSocketClients.SetClient(clientData.PUBLIC_KEY, webSocket);

                    LogEvent(new ApplicationLogs()
                    {
                        Guid = connectionGUID, Message = "ROBOT GIVEN NEW PUBLIC KEY AND AWAITING AUTHORIZATION", LoggedBy = "SYSTEM", Type = "SOCKET REQUEST"
                    });

                    await SendMessageAsync(webSocket, "ACCEPT_KEY=" + worker.PublicKey, CancellationToken.None);
                }
                else
                {
                    var knownClient = dbContext.Workers.Where(f => f.PublicKey == clientData.PUBLIC_KEY).FirstOrDefault();
                    knownClient.LastCommunicationReceived = DateTime.Now;
                    dbContext.SaveChanges();


                    ActiveSocketClients.SetClient(clientData.PUBLIC_KEY, webSocket);



                    switch (knownClient.AccountStatus)
                    {
                    case (int)ApprovalStatus.RequiresApproval:
                        LogEvent(new ApplicationLogs()
                        {
                            Guid = connectionGUID, Message = "RESPONDED WORKER_AWAITING_APPROVAL", LoggedBy = "SYSTEM", Type = "SOCKET REQUEST"
                        });
                        await SendMessageAsync(webSocket, "WORKER_AWAITING_APPROVAL", CancellationToken.None);

                        break;

                    case (int)ApprovalStatus.Disabled:
                        LogEvent(new ApplicationLogs()
                        {
                            Guid = connectionGUID, Message = "RESPONDED WORKER_DISABLED", LoggedBy = "SYSTEM", Type = "SOCKET REQUEST"
                        });
                        await SendMessageAsync(webSocket, "WORKER_DISABLED", CancellationToken.None);

                        break;

                    case (int)ApprovalStatus.Enabled:
                        LogEvent(new ApplicationLogs()
                        {
                            Guid = connectionGUID, Message = "RESPONDED WORKER_ENABLED", LoggedBy = "SYSTEM", Type = "SOCKET REQUEST"
                        });
                        await SendMessageAsync(webSocket, "WORKER_ENABLED", CancellationToken.None);

                        break;

                    default:
                        break;
                    }
                }

                result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None);
            }

            await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
        }
        /// <summary>
        /// Processes incoming socket messages from taskt clients
        /// </summary>
        /// <param name="context"></param>
        /// <param name="webSocket"></param>
        /// <returns></returns>
        public async Task ProcessIncomingSocketMessage(HttpContext context, WebSocket webSocket)
        {
            //create dbcontext
            Models.SQL.tasktserverContext dbContext = new tasktserverContext();

            //generate GUID for this connection
            Guid guid;

            guid = Guid.NewGuid();
            string connectionGUID = guid.ToString();


            var buffer = new byte[1024 * 4];
            WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None);

            while (!result.CloseStatus.HasValue)
            {
                //get connection information
                string connectionID = context.Connection.Id;
                string ipAddress    = context.Connection.RemoteIpAddress.ToString();


                //retrieve value
                var arraySegment    = new ArraySegment <byte>(buffer, 0, result.Count);
                var incomingMessage = System.Text.Encoding.Default.GetString(arraySegment.Array);
                incomingMessage = incomingMessage.Substring(0, result.Count);
                System.Console.WriteLine(incomingMessage);

                //convert client data
                var clientData = Newtonsoft.Json.JsonConvert.DeserializeObject <SocketPackage>(incomingMessage);
                var clientInfo = string.Join(", ", "MACHINE: " + clientData.MACHINE_NAME, "USER: "******"MESSAGE: " + clientData.MESSAGE, "IP: " + ipAddress);


                //determine if we were pinging this client for availability
                if (clientData.MESSAGE.StartsWith("CLIENT_STATUS="))
                {
                    //get client update
                    var clientUpdate = clientData.MESSAGE.Replace("CLIENT_STATUS=", "");

                    //find client socket connection
                    var socketClient = ActiveSocketClients.GetClient(clientData.PUBLIC_KEY);

                    //check if we are awaiting a ping reply from this client
                    if (socketClient.PingRequest.AwaitingPingReply)
                    {
                        //update client object accordingly
                        socketClient.PingRequest.AwaitingPingReply   = false;
                        socketClient.PingRequest.ClientStatus        = clientUpdate;
                        socketClient.PingRequest.ReadyForUIReporting = true;
                    }

                    //log update from worker
                    LogEvent(new ApplicationLogs()
                    {
                        Type = "WORKER UPDATE", Guid = connectionGUID, Message = clientUpdate, LoggedBy = clientData.PUBLIC_KEY
                    });

                    //get reference to the client
                    var worker = dbContext.Workers.Where(f => f.PublicKey == clientData.PUBLIC_KEY).FirstOrDefault();

                    //update communication
                    worker.LastCommunicationReceived = DateTime.Now;
                    dbContext.SaveChanges();

                    //send acknowledge to client
                    await SendMessageAsync(webSocket, "ACK", CancellationToken.None);
                }


                //log client connection
                LogEvent(new ApplicationLogs()
                {
                    Guid = connectionGUID, Message = "ROBOT CONNECTED FROM '" + ipAddress + "'", LoggedBy = "SYSTEM", Type = "SOCKET REQUEST"
                });
                LogEvent(new ApplicationLogs()
                {
                    Guid = connectionGUID, Message = "CLIENT INFO: " + clientInfo + "", LoggedBy = "SYSTEM", Type = "SOCKET REQUEST"
                });


                //determine if this client is known
                if ((string.IsNullOrEmpty(clientData.PUBLIC_KEY)) || (dbContext.Workers.Where(f => f.PublicKey == clientData.PUBLIC_KEY).FirstOrDefault() == null))
                {
                    //client is new or not yet configured

                    //create log
                    LogEvent(new ApplicationLogs()
                    {
                        Guid = connectionGUID, Message = "ROBOT NOT REGISTERED", LoggedBy = "SYSTEM", Type = "SOCKET REQUEST"
                    });

                    //generate key pair - public key sent to client and private key stored locally
                    var generatedKeys = tasktServer.Cryptography.CreateKeyPair();

                    //add as a new worker to the database
                    var worker = new Workers()
                    {
                        MachineName = clientData.MACHINE_NAME, UserName = clientData.USER_NAME, AccountStatus = (int)ApprovalStatus.RequiresApproval, LastCommunicationReceived = DateTime.Now, PublicKey = generatedKeys.Item2, PrivateKey = generatedKeys.Item1
                    };
                    dbContext.Workers.Add(worker);

                    //save changes
                    dbContext.SaveChanges();

                    //set client as an active socket client which enables the ability to execute scripts
                    ActiveSocketClients.SetClient(clientData.PUBLIC_KEY, webSocket);

                    //create log
                    LogEvent(new ApplicationLogs()
                    {
                        Guid = connectionGUID, Message = "ROBOT GIVEN NEW PUBLIC KEY AND AUTHENTICATED AUTOMATICALLY (DANGEROUS!)", LoggedBy = "SYSTEM", Type = "SOCKET REQUEST"
                    });

                    //send key back to client
                    await SendMessageAsync(webSocket, "ACCEPT_KEY=" + worker.PublicKey, CancellationToken.None);
                }
                else
                {
                    //find client info
                    var knownClient = dbContext.Workers.Where(f => f.PublicKey == clientData.PUBLIC_KEY).FirstOrDefault();

                    //update last communication received
                    knownClient.LastCommunicationReceived = DateTime.Now;

                    //save changes
                    dbContext.SaveChanges();

                    //set client as active and available
                    ActiveSocketClients.SetClient(clientData.PUBLIC_KEY, webSocket);

                    //send message back to client
                    await SendMessageAsync(webSocket, "WORKER_ENABLED", CancellationToken.None);

                    //APPROVAL PROCESS, FUTURE ENHANCEMENT!
                    //switch (worker.ApprovalStatus)
                    //{
                    //    case ApprovalStatus.RequiresApproval:
                    //        LogEvent(new ApplicationLogs() { Guid = connectionGUID, Message = "RESPONDED WORKER_AWAITING_APPROVAL", LoggedBy = "SYSTEM", Type = "SOCKET REQUEST" });
                    //        await SendMessageAsync(webSocket, "WORKER_AWAITING_APPROVAL", CancellationToken.None);
                    //        break;
                    //    case ApprovalStatus.Disabled:
                    //        LogEvent(new ApplicationLogs() { Guid = connectionGUID, Message = "RESPONDED WORKER_DISABLED", LoggedBy = "SYSTEM", Type = "SOCKET REQUEST" });
                    //        await SendMessageAsync(webSocket, "WORKER_DISABLED", CancellationToken.None);
                    //        break;
                    //    case ApprovalStatus.Enabled:
                    //        LogEvent(new ApplicationLogs() { Guid = connectionGUID, Message = "RESPONDED WORKER_ENABLED", LoggedBy = "SYSTEM", Type = "SOCKET REQUEST" });
                    //        await SendMessageAsync(webSocket, "WORKER_ENABLED", CancellationToken.None);
                    //        break;
                    //    default:
                    //        break;
                    //}
                }

                result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None);
            }

            await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
        }