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)); } }
//***************************************************************** //*** Major Sync Function with Exact online store //***************************************************************** /// <summary> /// *** Sync Function which Sync all Modified files with Exact Online Store /// </summary> /// <param name="lstDropBoxFile">Dropbox files in List Format</param> /// <returns></returns> private async Task SyncAllFilesFolders(List <DropBoxFile> lstDropBoxFile) { //System.Threading.Thread.Sleep(30000); try { //*** Set Variables int intCount = 0, intSuccess = 0, intFailed = 0; Session["SyncAllNumbers"] = ""; string strExactFileGUID = ""; string strFolderpath = ""; string strParentFolderpath = ""; CloudStorageEntities objCloudStorageEntities = new CloudStorageEntities(); //**** 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()); //*** First Reset All "FileStillAlive" Flag into DB (from p in objCloudStorageEntities.DropBoxExactOnlines where p.Id >= 0 select p).ToList().ForEach(x => x.FileStillAlive = 0); objCloudStorageEntities.SaveChanges(); //*** Loop on All Objects on DropBox Grid View foreach (var DropBoxFile in lstDropBoxFile) { strFolderpath = ""; //*** Refresh Counts intCount += 1; //**** Check If File item exist into DB with same Modified Date or not //*** 1. Exist with Same Modified Date, Do Nothing //*** 2. Not Exist, So Add File to Exact Online and DB //*** 3. Exist with Different Modified Date, So Update File into Exact Online and Modified Date into DB DropBoxExactOnline objRecord = objCloudStorageEntities.DropBoxExactOnlines.Where(i => i.DropBoxPath == DropBoxFile.FileName).FirstOrDefault(); if (objRecord == null || (objRecord != null && DropBoxFile.ModificationDate != objRecord.DropBoxFileModifiedDate)) //*** Not Exist Or File Exist with Different Modification Date { //******************************************************************** //*** Add File to Exact Online //******************************************************************** //**** Get File Stream then upload it to ExactOnline & Flush //*** Construct Parent Folder Path String strParentFolderpath = ""; if ((List <string>)Session["FolderPath"] != null) { foreach (var item in (List <string>)Session["FolderPath"]) { strParentFolderpath += "/" + item; } } string strPath = strParentFolderpath + "/" + DropBoxFile.FileName; strFolderpath = strPath; //*** Create Folder Function Stream fnStreamResult = await DropBoxConnector.Download(Session["dropBoxClientObj"], strPath); if (DropBoxConnector.MsgError != "") //*** If error { intFailed += 1; } else { //************************************************************* //*** Convert File to Byte Array and upload it to Exact Online //************************************************************* if (Session["ExactOnlineAccessToken"] != null) { objExactOnlineConnector.AccessToken = Session["ExactOnlineAccessToken"].ToString(); } //**** Get Document Folder GUID Session["CurrentExactFolderGUID"] = string.Empty; //*** Root Folder //*** If File already exisit then Delete it first if (objRecord != null && DropBoxFile.ModificationDate != objRecord.DropBoxFileModifiedDate) { objExactOnlineConnector.DeleteDocument(objRecord.ExactOnlineGUID); //**** Call Delete Document } strExactFileGUID = objExactOnlineConnector.CreateDocumentWithAttachment(DropBoxFile.FileName, Session["CurrentExactFolderGUID"].ToString(), Common.ConvertStreamtoByteArr(fnStreamResult)); if (strExactFileGUID == "") { intFailed += 1; } else { intSuccess += 1; } } //****************************************************************** if (objRecord == null) { //*** add to DB DropBoxExactOnline objRecordNew = new DropBoxExactOnline(); objRecordNew.DropBoxPath = DropBoxFile.FileName; objRecordNew.DropBoxFileModifiedDate = DropBoxFile.ModificationDate; objRecordNew.ExactOnlineGUID = strExactFileGUID; objRecordNew.isFile = 1; objRecordNew.FileStillAlive = 1; objCloudStorageEntities.DropBoxExactOnlines.Add(objRecordNew); objCloudStorageEntities.SaveChanges(); } else { //**** Update DB objRecord.DropBoxFileModifiedDate = DropBoxFile.ModificationDate; objRecord.ExactOnlineGUID = strExactFileGUID; objRecord.FileStillAlive = 1; objCloudStorageEntities.SaveChanges(); } } //*** If File still exit and not changed if (objRecord != null && DropBoxFile.ModificationDate == objRecord.DropBoxFileModifiedDate) { objRecord.FileStillAlive = 1; objCloudStorageEntities.SaveChanges(); } //*** set Session Variable (Shared Variable) Session["SyncAllNumbers"] = lstDropBoxFile.Count.ToString() + "," + intCount.ToString() + "," + intSuccess.ToString() + "," + intFailed.ToString(); } //*** For Loop //*************************************************************************************** //*** Then Check For Not Alive Files to Delete from DB and Exact Online //*************************************************************************************** List <DropBoxExactOnline> lstFiles = objCloudStorageEntities.DropBoxExactOnlines.Where(item => item.FileStillAlive == 0).ToList(); foreach (var file in lstFiles) { //**************************************************************** //**** Delete File from Exact Online //**************************************************************** if (file.ExactOnlineGUID != "") { //*** Delete File on Exact Online also if (Session["ExactOnlineAccessToken"] != null) { objExactOnlineConnector.AccessToken = Session["ExactOnlineAccessToken"].ToString(); } //**** Call Delete Document objExactOnlineConnector.DeleteDocument(file.ExactOnlineGUID); } //*************************************************************************** //*** Delete From DB objCloudStorageEntities.DropBoxExactOnlines.Remove(file); } //*** For Loop //*** Submit Delete from DB objCloudStorageEntities.SaveChanges(); //*************************************************************************************** } catch (Exception e) { Session["lblDropBoxMsg"] = "SyncAllFilesFolders Error: " + e.ToString(); } }
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 { } }