private void UpdateBackup(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session, BodyWriter bw) { string str = request.Form["data"].Value; if (string.IsNullOrWhiteSpace(str)) { ReportError(response, bw, "Missing backup object"); return; } AddOrUpdateBackupData data = null; try { data = Serializer.Deserialize <AddOrUpdateBackupData>(new StringReader(str)); if (data.Backup == null) { ReportError(response, bw, "Data object had no backup entry"); return; } if (data.Backup.ID == null) { ReportError(response, bw, "Invalid or missing backup id"); return; } if (data.Backup.IsTemporary) { var backup = Program.DataConnection.GetBackup(data.Backup.ID); if (backup.IsTemporary) { throw new InvalidDataException("External is temporary but internal is not?"); } Program.DataConnection.UpdateTemporaryBackup(backup); bw.OutputOK(); } else { lock (Program.DataConnection.m_lock) { var backup = Program.DataConnection.GetBackup(data.Backup.ID); if (backup == null) { ReportError(response, bw, "Invalid or missing backup id"); return; } if (Program.DataConnection.Backups.Where(x => x.Name.Equals(data.Backup.Name, StringComparison.InvariantCultureIgnoreCase) && x.ID != data.Backup.ID).Any()) { ReportError(response, bw, "There already exists a backup with the name: " + data.Backup.Name); return; } //TODO: Merge in real passwords where the placeholder is found Program.DataConnection.AddOrUpdateBackupAndSchedule(data.Backup, data.Schedule); } bw.OutputOK(); } } catch (Exception ex) { if (data == null) { ReportError(response, bw, string.Format("Unable to parse backup or schedule object: {0}", ex.Message)); } else { ReportError(response, bw, string.Format("Unable to save backup or schedule: {0}", ex.Message)); } } }
public void POST(string key, RequestInfo info) { if ("import".Equals(key, StringComparison.OrdinalIgnoreCase)) { ImportBackup(info); return; } AddOrUpdateBackupData data = null; try { var str = info.Request.Form["data"].Value; if (string.IsNullOrWhiteSpace(str)) { str = new StreamReader(info.Request.Body, System.Text.Encoding.UTF8).ReadToEnd(); } data = Serializer.Deserialize <AddOrUpdateBackupData>(new StringReader(str)); if (data.Backup == null) { info.ReportClientError("Data object had no backup entry", System.Net.HttpStatusCode.BadRequest); return; } data.Backup.ID = null; if (Duplicati.Library.Utility.Utility.ParseBool(info.Request.Form["temporary"].Value, false)) { using (var tf = new Duplicati.Library.Utility.TempFile()) data.Backup.DBPath = tf; data.Backup.Filters = data.Backup.Filters ?? new Duplicati.Server.Serialization.Interface.IFilter[0]; data.Backup.Settings = data.Backup.Settings ?? new Duplicati.Server.Serialization.Interface.ISetting[0]; Program.DataConnection.RegisterTemporaryBackup(data.Backup); info.OutputOK(new { status = "OK", ID = data.Backup.ID }); } else { if (Library.Utility.Utility.ParseBool(info.Request.Form["existing_db"].Value, false)) { data.Backup.DBPath = Library.Main.DatabaseLocator.GetDatabasePath(data.Backup.TargetURL, null, false, false); if (string.IsNullOrWhiteSpace(data.Backup.DBPath)) { throw new Exception("Unable to find remote db path?"); } } lock (Program.DataConnection.m_lock) { if (Program.DataConnection.Backups.Where(x => x.Name.Equals(data.Backup.Name, StringComparison.OrdinalIgnoreCase)).Any()) { info.ReportClientError("There already exists a backup with the name: " + data.Backup.Name, System.Net.HttpStatusCode.Conflict); return; } var err = Program.DataConnection.ValidateBackup(data.Backup, data.Schedule); if (!string.IsNullOrWhiteSpace(err)) { info.ReportClientError(err, System.Net.HttpStatusCode.BadRequest); return; } Program.DataConnection.AddOrUpdateBackupAndSchedule(data.Backup, data.Schedule); } info.OutputOK(new { status = "OK", ID = data.Backup.ID }); } } catch (Exception ex) { if (data == null) { info.ReportClientError(string.Format("Unable to parse backup or schedule object: {0}", ex.Message), System.Net.HttpStatusCode.BadRequest); } else { info.ReportClientError(string.Format("Unable to save schedule or backup object: {0}", ex.Message), System.Net.HttpStatusCode.InternalServerError); } } }
private void AddBackup(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session, BodyWriter bw) { var str = request.Form["data"].Value; if (string.IsNullOrWhiteSpace(str)) { ReportError(response, bw, "Missing backup object"); return; } AddOrUpdateBackupData data = null; try { data = Serializer.Deserialize <AddOrUpdateBackupData>(new StringReader(str)); if (data.Backup == null) { ReportError(response, bw, "Data object had no backup entry"); return; } data.Backup.ID = null; if (Duplicati.Library.Utility.Utility.ParseBool(request.Form["temporary"].Value, false)) { Program.DataConnection.RegisterTemporaryBackup(data.Backup); bw.OutputOK(new { status = "OK", ID = data.Backup.ID }); } else { if (Library.Utility.Utility.ParseBool(request.Form["existing_db"].Value, false)) { data.Backup.DBPath = Library.Main.DatabaseLocator.GetDatabasePath(data.Backup.TargetURL, null, false, false); if (string.IsNullOrWhiteSpace(data.Backup.DBPath)) { throw new Exception("Unable to find remote db path?"); } } lock (Program.DataConnection.m_lock) { if (Program.DataConnection.Backups.Where(x => x.Name.Equals(data.Backup.Name, StringComparison.InvariantCultureIgnoreCase)).Any()) { ReportError(response, bw, "There already exists a backup with the name: " + data.Backup.Name); return; } Program.DataConnection.AddOrUpdateBackupAndSchedule(data.Backup, data.Schedule); } bw.OutputOK(new { status = "OK", ID = data.Backup.ID }); } } catch (Exception ex) { if (data == null) { ReportError(response, bw, string.Format("Unable to parse backup or schedule object: {0}", ex.Message)); } else { ReportError(response, bw, string.Format("Unable to save schedule or backup object: {0}", ex.Message)); } } }