public void Operations() { int chromePid = -1; try { WebSocketHelper.msgId = 0; // Open a Chrome dev instance in incognito mode UpdateStatus("Chrome startup... please wait"); chromePid = Helper.OpenChromeInstance(); // Wait for chrome opening and remote debugging service start-up UpdateStatus("Establish connection with Chrome... please wait"); if (WebSocketHelper.WaitForPortOpened() == false) { throw new NFAuthException(string.Format("Unable communicate with Chrome debug address {0}:{1}", Helper.localhostAddress, Helper.chromeDebugPort)); } // Get endpoint of our page WebSocketHelper.ExtractDebugEndpoint(); WebSocketHelper.OpenWebsocket(); WebSocketHelper.WSRequest("Network.enable"); WebSocketHelper.WSRequest("Page.enable"); // Load the login webpage UpdateStatus("Opening login webpage... please wait"); WebSocketHelper.WSRequest("Page.navigate", "{'url': '" + Helper.url + "'}"); //string frameId = WebSocketHelper.WSRequest("Page.navigate", "{'url': '" + Helper.url + "'}")["result"]["frameId"].ToString(); WebSocketHelper.WSWaitEvent("Page.domContentEventFired"); // Wait loading DOM (document.onDOMContentLoaded event) // Wait for the user to login UpdateStatus("Please login in to website now ...waiting for you to finish..."); if (Helper.WaitUserLoggedin() == false) { throw new NFAuthException("You have exceeded the time available for the login. Restart the operations."); } WebSocketHelper.WSWaitEvent("Page.domContentEventFired"); // Wait loading DOM (document.onDOMContentLoaded event) // Verify that falcorCache data exist, this data exist only when logged UpdateStatus("Verification of data in progress... please wait"); string htmlPage = WebSocketHelper.WSRequest("Runtime.evaluate", "{'expression': 'document.documentElement.outerHTML'}")["result"]["result"]["value"].ToString(); if (string.IsNullOrEmpty(htmlPage)) { throw new NFAuthException("An unexpected problem has occurred, please try again."); } JObject reactContext = Helper.ExtractJson(htmlPage, "reactContext"); if (reactContext == null) { // An error is happened in the reactContext extraction? try go on UpdateStatus("Error failed to check account membership status, try a simple check"); if (htmlPage.Contains("falcorCache") == false) { throw new NFAuthException("Error unable to find falcorCache data."); } } else { // Check the membership status string membershipStatus = reactContext["models"]["userInfo"]["data"]["membershipStatus"].ToString(); if (membershipStatus != "CURRENT_MEMBER") { UpdateStatus("The account membership status is: " + membershipStatus); throw new NFAuthException("Your login can not be used. The possible causes are account not confirmed/renewed/reactivacted."); } } WebSocketHelper.WSWaitEvent("Page.loadEventFired"); // Wait loading page (window.onload event) UpdateStatus("File creation in progress... please wait"); // Get all cookies JObject JOCookies = WebSocketHelper.WSRequest("Network.getAllCookies"); if (JOCookies == null) { throw new NFAuthException("WebSocket response for Cookies not received"); } JArray cookies = JOCookies["result"]["cookies"].ToObject <JArray>(); Helper.AssertCookies(cookies); // Generate a random PIN for access to "NFAuthentication.key" file string pin = new Random().Next(1000, 9999).ToString(); // Create file data structure JObject data_content = new JObject(); data_content["cookies"] = cookies; JObject data = new JObject(); data["app_name"] = Assembly.GetExecutingAssembly().GetName().Name; data["app_version"] = Assembly.GetExecutingAssembly().GetName().Version.ToString(); data["app_system"] = "Windows"; data["app_author"] = "CastagnaIT"; data["timestamp"] = (int)DateTime.UtcNow.AddDays(5).Subtract(new DateTime(1970, 1, 1)).TotalSeconds; data["data"] = data_content; // Save the "NFAuthentication.key" file Helper.SaveData(data, pin); // Close the browser WebSocketHelper.WSRequest("Browser.close"); string strMessage = "Operations completed!\r\nThe 'NFAuthentication.key' file has been saved in current folder.\r\nYour PIN protection is: " + pin; UpdateStatus(strMessage); Dispatcher.BeginInvoke(new Action(() => { BtnCancel.IsEnabled = false; BtnStart.IsEnabled = true; MessageBox.Show(this, strMessage, this.Title); }), DispatcherPriority.Background); } catch (ThreadAbortException) { Helper.TerminateChromeInstance(chromePid); } catch (NFAuthException exc) { UpdateStatus(exc.Message); Dispatcher.BeginInvoke(new Action(() => { BtnCancel.IsEnabled = false; BtnStart.IsEnabled = true; MessageBox.Show(this, exc.Message, this.Title); }), DispatcherPriority.Background); Helper.TerminateChromeInstance(chromePid); } catch (Exception exc) { // NOTE: the stacktrace info output the error line number only if the .pdb file is included UpdateStatus("Error: " + exc.Message + Environment.NewLine + Environment.NewLine + exc.ToString() + Environment.NewLine + exc.StackTrace); Dispatcher.BeginInvoke(new Action(() => { BtnCancel.IsEnabled = false; BtnStart.IsEnabled = true; MessageBox.Show(this, exc.Message, this.Title); }), DispatcherPriority.Background); Helper.TerminateChromeInstance(chromePid); } finally { WebSocketHelper.CloseWebsocket(); } }