private string GetXSRFToken() { var httpOptions = new Duplicati.Library.Modules.Builtin.HttpOptions(); httpOptions.Configure(m_options); using (httpOptions) { System.Net.HttpWebRequest req = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(m_baseUri + STATUS_WINDOW); req.Method = "GET"; req.UserAgent = "Duplicati TrayIcon Monitor, v" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; req.Headers.Add(TRAYICONPASSWORDSOURCE_HEADER, m_TrayIconHeaderValue); if (req.CookieContainer == null) { req.CookieContainer = new System.Net.CookieContainer(); } //Wrap it all in async stuff Duplicati.Library.Utility.AsyncHttpRequest areq = new Library.Utility.AsyncHttpRequest(req); using (var r = (System.Net.HttpWebResponse)areq.GetResponse()) if (r.StatusCode == System.Net.HttpStatusCode.OK) { return((r.Cookies[XSRF_COOKIE] ?? r.Cookies[Library.Utility.Uri.UrlEncode(XSRF_COOKIE)]).Value); } return(null); } }
private SaltAndNonce GetSaltAndNonce() { var httpOptions = new Duplicati.Library.Modules.Builtin.HttpOptions(); httpOptions.Configure(m_options); using (httpOptions) { var req = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(m_baseUri + LOGIN_SCRIPT); req.Method = "POST"; req.UserAgent = "Duplicati TrayIcon Monitor, v" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; req.Headers.Add(TRAYICONPASSWORDSOURCE_HEADER, m_TrayIconHeaderValue); req.ContentType = "application/x-www-form-urlencoded"; Duplicati.Library.Utility.AsyncHttpRequest areq = new Library.Utility.AsyncHttpRequest(req); var body = System.Text.Encoding.ASCII.GetBytes("get-nonce=1"); using (var f = areq.GetRequestStream(body.Length)) f.Write(body, 0, body.Length); using (var r = (System.Net.HttpWebResponse)areq.GetResponse()) using (var s = areq.GetResponseStream()) using (var sr = new System.IO.StreamReader(s, ENCODING, true)) return(Serializer.Deserialize <SaltAndNonce>(sr)); } }
private string PerformLogin(string password, string nonce) { var httpOptions = new Duplicati.Library.Modules.Builtin.HttpOptions(); httpOptions.Configure(m_options); using (httpOptions) { System.Net.HttpWebRequest req = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(m_baseUri + LOGIN_SCRIPT); req.Method = "POST"; req.UserAgent = "Duplicati TrayIcon Monitor, v" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; req.Headers.Add(TRAYICONPASSWORDSOURCE_HEADER, m_TrayIconHeaderValue); req.ContentType = "application/x-www-form-urlencoded"; if (req.CookieContainer == null) { req.CookieContainer = new System.Net.CookieContainer(); } req.CookieContainer.Add(new System.Net.Cookie("session-nonce", nonce, "/", req.RequestUri.Host)); //Wrap it all in async stuff Duplicati.Library.Utility.AsyncHttpRequest areq = new Library.Utility.AsyncHttpRequest(req); var body = System.Text.Encoding.ASCII.GetBytes("password=" + Duplicati.Library.Utility.Uri.UrlEncode(password)); using (var f = areq.GetRequestStream(body.Length)) f.Write(body, 0, body.Length); using (var r = (System.Net.HttpWebResponse)areq.GetResponse()) if (r.StatusCode == System.Net.HttpStatusCode.OK) { return((r.Cookies[AUTH_COOKIE] ?? r.Cookies[Library.Utility.Uri.UrlEncode(AUTH_COOKIE)]).Value); } return(null); } }
private T PerformRequestInternal <T>(string method, string endpoint, Dictionary <string, string> queryparams) { queryparams["format"] = "json"; string query = EncodeQueryString(queryparams); // TODO: This can interfere with running backups, // as the System.Net.ServicePointManager is shared with // all connections doing ftp/http requests using (var httpOptions = new Duplicati.Library.Modules.Builtin.HttpOptions()) { httpOptions.Configure(m_options); var req = (System.Net.HttpWebRequest)System.Net.WebRequest.Create( new Uri(m_apiUri + endpoint + '?' + query)); req.Method = method; req.Headers.Add("Accept-Charset", ENCODING.BodyName); if (m_xsrftoken != null) { req.Headers.Add(XSRF_HEADER, m_xsrftoken); } req.UserAgent = "Duplicati TrayIcon Monitor, v" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; req.Headers.Add(TRAYICONPASSWORDSOURCE_HEADER, m_TrayIconHeaderValue); if (req.CookieContainer == null) { req.CookieContainer = new System.Net.CookieContainer(); } if (m_authtoken != null) { req.CookieContainer.Add(new System.Net.Cookie(AUTH_COOKIE, m_authtoken, "/", req.RequestUri.Host)); } if (m_xsrftoken != null) { req.CookieContainer.Add(new System.Net.Cookie(XSRF_COOKIE, m_xsrftoken, "/", req.RequestUri.Host)); } //Wrap it all in async stuff var areq = new Library.Utility.AsyncHttpRequest(req); req.AllowWriteStreamBuffering = true; //Assign the timeout, and add a little processing time as well if (endpoint.Equals("/serverstate", StringComparison.OrdinalIgnoreCase) && queryparams.ContainsKey("duration")) { areq.Timeout = (int)(Duplicati.Library.Utility.Timeparser.ParseTimeSpan(queryparams["duration"]) + TimeSpan.FromSeconds(5)).TotalMilliseconds; } using (var r = (System.Net.HttpWebResponse)areq.GetResponse()) using (var s = areq.GetResponseStream()) if (typeof(T) == typeof(string)) { using (System.IO.MemoryStream ms = new System.IO.MemoryStream()) { s.CopyTo(ms); return((T)(object)ENCODING.GetString(ms.ToArray())); } } else { using (var sr = new System.IO.StreamReader(s, ENCODING, true)) return(Serializer.Deserialize <T>(sr)); } } }
private void TestConnection_Click(object sender, EventArgs e) { if (ValidateForm()) { bool retry = true; while (retry) { retry = false; Cursor c = this.Cursor; try { this.Cursor = Cursors.WaitCursor; SaveSettings(); bool existingBackup = false; Dictionary<string, string> options = new Dictionary<string, string>(); string hostname = GetConfiguration(m_options, options); using (Duplicati.Library.Modules.Builtin.HttpOptions httpconf = new Duplicati.Library.Modules.Builtin.HttpOptions()) { httpconf.Configure(options); using(FTP f = new FTP(hostname, options)) foreach (Interface.IFileEntry n in f.List()) if (n.Name.StartsWith("duplicati-")) { existingBackup = true; break; } } bool isUiAdd = string.IsNullOrEmpty(m_uiAction) || string.Equals(m_uiAction, "add", StringComparison.InvariantCultureIgnoreCase); if (existingBackup && isUiAdd) { if (MessageBox.Show(this, string.Format(Interface.CommonStrings.ExistingBackupDetectedQuestion), Application.ProductName, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button3) != DialogResult.Yes) return; } else { MessageBox.Show(this, Interface.CommonStrings.ConnectionSuccess, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information); } m_hasTested = true; } catch (Interface.FolderMissingException) { switch (MessageBox.Show(this, Strings.FTPUI.CreateMissingFolderQuestion, Application.ProductName, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question)) { case DialogResult.Yes: CreateFolderButton.PerformClick(); TestConnection.PerformClick(); return; default: return; } } catch (Utility.SslCertificateValidator.InvalidCertificateException cex) { if (string.IsNullOrEmpty(cex.Certificate)) MessageBox.Show(this, string.Format(Interface.CommonStrings.ConnectionFailure, cex.Message), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); else { if (MessageBox.Show(this, string.Format(Strings.FTPUI.ApproveCertificateHashQuestion, cex.SslError), Application.ProductName, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Yes) { retry = true; AcceptSpecifiedHash.Checked = true; SpecifiedHash.Text = cex.Certificate; } } } catch (Exception ex) { MessageBox.Show(this, string.Format(Interface.CommonStrings.ConnectionFailure, ex.Message), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { this.Cursor = c; } } } }
private void CreateFolderButton_Click(object sender, EventArgs e) { if (ValidateForm()) { bool retry = true; while (retry) { retry = false; Cursor c = this.Cursor; try { this.Cursor = Cursors.WaitCursor; SaveSettings(); Dictionary<string, string> options = new Dictionary<string, string>(); string hostname = GetConfiguration(m_options, options); using (Duplicati.Library.Modules.Builtin.HttpOptions httpconf = new Duplicati.Library.Modules.Builtin.HttpOptions()) { httpconf.Configure(options); FTP f = new FTP(hostname, options); f.CreateFolder(); } MessageBox.Show(this, Interface.CommonStrings.FolderCreated, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Utility.SslCertificateValidator.InvalidCertificateException cex) { if (string.IsNullOrEmpty(cex.Certificate)) MessageBox.Show(this, string.Format(Interface.CommonStrings.ConnectionFailure, cex.Message), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); else { if (MessageBox.Show(this, string.Format(Strings.FTPUI.ApproveCertificateHashQuestion, cex.SslError), Application.ProductName, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Yes) { retry = true; AcceptSpecifiedHash.Checked = true; SpecifiedHash.Text = cex.Certificate; } } } catch (Exception ex) { MessageBox.Show(this, string.Format(Interface.CommonStrings.ConnectionFailure, ex.Message), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { this.Cursor = c; } } } }