public async Task <ActionResult> Index() { try { //*** Get the request signature & Verify var signatureHeader = Request.Headers.GetValues("X-Dropbox-Signature"); if (signatureHeader == null || !signatureHeader.Any()) //**** If there is no Signature header { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); //*** Reply back with Status code 400 (Bad request) } //*** Get the signature value string signature = signatureHeader.FirstOrDefault(); //*** Extract the raw body of the request string body = null; using (StreamReader reader = new StreamReader(Request.InputStream)) { body = await reader.ReadToEndAsync(); //*** Extract Request Body } //*** Check that the signature is good string appSecret = ConfigurationManager.AppSettings["dropBoxAppSecret"]; using (HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(appSecret))) { if (!Crypt.VerifySha256Hash(hmac, body, signature)) //**** Verify Hash of Header vs. secret key { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); //*** Reply back with Status code 400 (Bad request) } } //*** Store Body to queue to Process later, Add Entity to DB CloudStorageEntities objCloudStorageEntities = new CloudStorageEntities(); //*** add to DB DropboxWebhook objRecordNew = new DropboxWebhook(); objRecordNew.DW_Body = body; objRecordNew.DW_TimeStamp = DateTime.Now; objRecordNew.DW_Processed = 0; objCloudStorageEntities.DropboxWebhooks.Add(objRecordNew); objCloudStorageEntities.SaveChanges(); //**** Dispose Opbjects objCloudStorageEntities.Dispose(); //******************************************************* // Return A-OK :) return(new HttpStatusCodeResult(HttpStatusCode.OK)); } catch (Exception exBody) { //*** Handle Error //*** return back with Status code 400 (Bad request) return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } }
public async System.Threading.Tasks.Task <ActionResult> Index() { //*** Check Lock Variable First if (!(Boolean)HttpContext.Application["SyncInProgress"]) { HttpContext.Application["SyncInProgress"] = true; //*** Set Lock Flag ViewBag.Title = "Sync Dropbox Files"; //*** Initialization Session["lblDropBoxMsg"] = ""; Session["btnDropBoxbtnV"] = "hidden"; Session["btnExactOnlinebtnV"] = "hidden"; Session["SyncAllNumbers"] = ""; Session["ResultNumbers"] = ""; strSiteBaseURL = Request.Url.Scheme + "://" + Request.Url.Host; if (Request.Url.Port > 0) { strSiteBaseURL += ":" + Request.Url.Port.ToString(); } ; //*** Adjust Drop Box Call Back URL for if (Session["dropBoxReturnBackURL"] == null) { Session["dropBoxReturnBackURL"] = strSiteBaseURL; Session["dropBoxReturnBackURL"] += "/" + System.Configuration.ConfigurationManager.AppSettings["dropBoxAuthReturnPage"]; } //****************************************************** //********************************************* //*** Query on Files last Modified //********************************************* DateTime dtLastModifiedDate = new DateTime(2000, 1, 1); CloudStorageEntities objCloudStorageEntities = new CloudStorageEntities(); //*** Check First if File Already exisit into DB DropboxWebhook objRecord = objCloudStorageEntities.DropboxWebhooks.Where(i => i.DW_Processed == 0).FirstOrDefault(); if (objRecord != null) { dtLastModifiedDate = Convert.ToDateTime(objRecord.DW_TimeStamp); } if (dtLastModifiedDate > Convert.ToDateTime("1/1/2000")) { //****************************************************************************************************** //*** Dropbox Part //****************************************************************************************************** //*** Check dropBox Aurhentication Token if (Session["dropBoxAccessToken"] == null) { //*************************** //*** access token is empty //*************************** //*** 1. Check first for dropBox App Key & App secret if (String.IsNullOrEmpty(System.Configuration.ConfigurationManager.AppSettings["dropBoxAppKey"]) || String.IsNullOrEmpty(System.Configuration.ConfigurationManager.AppSettings["dropBoxAppSecret"])) { //*** Show Error Message Session["lblDropBoxMsg"] = "Please set app key and secret in this project's Web.config file and restart. " + "App key/secret can be found in the Dropbox App Console, here: " + "https://www.dropbox.com/developers/apps"; goto lnIndexEnd; } else //*** AppKey & secret exist { //*** Show Connect to DropBox button Session["btnDropBoxbtnV"] = "visible"; } } else { //*** Get DropBox Client Object Session["dropBoxClientObj"] = DropBoxConnector.getDropboxClient(Session["dropBoxAccessToken"].ToString()); if (DropBoxConnector.MsgError != "") //*** If error { Session["lblDropBoxMsg"] = "Dropbox Error: " + DropBoxConnector.MsgError; } else { //****************************************************************************************************** //*** Exact Online Part //****************************************************************************************************** //*** Adjust Drop Box Call Back URL for if (Session["exactOnlineReturnBackURL"] == null) { Session["exactOnlineReturnBackURL"] = Request.Url.Scheme + "://" + Request.Url.Host; if (Request.Url.Port > 0) { Session["exactOnlineReturnBackURL"] += ":" + Request.Url.Port.ToString(); } ; Session["exactOnlineReturnBackURL"] += "/" + System.Configuration.ConfigurationManager.AppSettings["exactOnlineReturnPage"]; } //*** Check If Code returned into Connection String if (Session["ExactOnlineAccessToken"] == null && Session["ExactOnlineReturnCode"] != null) { //**** Initialize Session Folder Path List <string> Dump = new List <string> { }; Session["ExactOnlineFolderPath"] = Dump; //**** Construct Exact Online Class ExactOnlineConnector objExactOnlineConnector = new ExactOnlineConnector(System.Configuration.ConfigurationManager.AppSettings["exactOnlineClientId"], System.Configuration.ConfigurationManager.AppSettings["exactOnlineClientSecret"], System.Configuration.ConfigurationManager.AppSettings["exactOnlineEndPoint"], new Uri(Session["exactOnlineReturnBackURL"].ToString()), Session["ExactOnlineReturnCode"].ToString()); Session["ExactOnlineAccessToken"] = objExactOnlineConnector.GetAccessToken(); if (objExactOnlineConnector.MsgError != "") { //*** If Error returned Session["lblDropBoxMsg"] = "Exact Online Error: " + objExactOnlineConnector.MsgError; goto lnIndexEnd; } } //*** Check ExactOnline Aurhentication Token if (Session["ExactOnlineAccessToken"] == null && Session["ExactOnlineReturnCode"] == null) { //*************************** //*** access token is empty //*************************** //*** 1. Check first for ExactOnline App Key & App secret if (String.IsNullOrEmpty(System.Configuration.ConfigurationManager.AppSettings["exactOnlineClientId"]) || String.IsNullOrEmpty(System.Configuration.ConfigurationManager.AppSettings["exactOnlineClientSecret"]) || String.IsNullOrEmpty(System.Configuration.ConfigurationManager.AppSettings["exactOnlineEndPoint"])) { //*** Show Error Message Session["lblDropBoxMsg"] = "Please set client id, client secret and end point URL into this project's Web.config file and restart. " + "client id/secret can be found in the ExactOnline App Console, here: " + "https://start.exactonline.co.uk"; goto lnIndexEnd; } else //*** AppKey & secret exist { //*** Show Connect to ExactOnline button Session["btnExactOnlinebtnV"] = "visible"; } } if (Session["ExactOnlineReturnCode"] != null) { //*** 1. List all Dropbox Files await getDropBoxFilesList((List <string>) Session["FolderPath"]); //*** 2. Call Sync Function which Sync all Modified files with Exact Online Store await SyncAllFilesFolders((List <DropBoxFile>) Session["lstDropBoxFile"]); if (objRecord != null) { //*** Update Flag of WebHook Table objRecord.DW_Processed = 1; objRecord.DW_ProcessTimeStamp = DateTime.Now; objCloudStorageEntities.SaveChanges(); } } } } } lnIndexEnd: //*** GC objCloudStorageEntities.Dispose(); } HttpContext.Application["SyncInProgress"] = false; //*** Release Lock Flag //*** Display Results if (Session["SyncAllNumbers"].ToString() != "") { string[] strAllResultNumbers = Session["SyncAllNumbers"].ToString().Split(','); Session["ResultNumbers"] = "Dropbox Files= " + strAllResultNumbers[0] + " ,Files Processed= " + strAllResultNumbers[1] + " ,Files Replaced Successfully= " + strAllResultNumbers[2] + " ,Failure= " + strAllResultNumbers[3]; } try { return(View()); } finally { } }