diff --git a/Duplicati/Server/WebServer/AuthenticationHandler.cs b/Duplicati/Server/WebServer/AuthenticationHandler.cs index 34ede70a0..0df43719a 100644 --- a/Duplicati/Server/WebServer/AuthenticationHandler.cs +++ b/Duplicati/Server/WebServer/AuthenticationHandler.cs @@ -82,8 +82,7 @@ namespace Duplicati.Server.WebServer response.Cookies.Add(new HttpServer.ResponseCookie(NONCE_COOKIE_NAME, nonce, expires)); using(var bw = new BodyWriter(response)) { - bw.SetOK(); - bw.WriteJsonObject(new { + bw.OutputOK(new { Status = "OK", Nonce = nonce, Salt = Program.DataConnection.ApplicationSettings.WebserverPasswordSalt @@ -131,12 +130,7 @@ namespace Duplicati.Server.WebServer response.Cookies.Add(new HttpServer.ResponseCookie(AUTH_COOKIE_NAME, token, expires)); using(var bw = new BodyWriter(response)) - { - bw.SetOK(); - bw.WriteJsonObject(new { - Status = "OK" - }); - } + bw.OutputOK(); return true; } diff --git a/Duplicati/Server/WebServer/BodyWriter.cs b/Duplicati/Server/WebServer/BodyWriter.cs index 20f2c02a8..cf5eb1268 100644 --- a/Duplicati/Server/WebServer/BodyWriter.cs +++ b/Duplicati/Server/WebServer/BodyWriter.cs @@ -23,6 +23,7 @@ namespace Duplicati.Server.WebServer internal class BodyWriter : System.IO.StreamWriter, IDisposable { private HttpServer.IHttpResponse m_resp; + private static object SUCCESS_RESPONSE = new { Status = "OK" }; // We override the format provider so all JSON output uses US format public override IFormatProvider FormatProvider @@ -53,6 +54,12 @@ namespace Duplicati.Server.WebServer m_resp.Status = System.Net.HttpStatusCode.OK; } + public void OutputOK(object result = null) + { + SetOK(); + WriteJsonObject(result ?? SUCCESS_RESPONSE); + } + public void WriteJsonObject(object o) { if (!m_resp.HeadersSent) diff --git a/Duplicati/Server/WebServer/ControlHandler.cs b/Duplicati/Server/WebServer/ControlHandler.cs index ef07dadc7..8bde05792 100644 --- a/Duplicati/Server/WebServer/ControlHandler.cs +++ b/Duplicati/Server/WebServer/ControlHandler.cs @@ -180,7 +180,7 @@ namespace Duplicati.Server.WebServer private void GetLicenseData(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session, BodyWriter bw) { - bw.WriteJsonObject(License.LicenseReader.ReadLicenses(System.IO.Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location), "licenses"))); + bw.OutputOK(License.LicenseReader.ReadLicenses(System.IO.Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location), "licenses"))); } private void RestoreFiles(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session, BodyWriter bw) @@ -200,7 +200,7 @@ namespace Duplicati.Server.WebServer var task = Runner.CreateRestoreTask(bk, filters, time, restoreTarget, overwrite); Program.WorkThread.AddTask(task); - bw.WriteJsonObject(new { TaskID = task.TaskID }); + bw.OutputOK(new { TaskID = task.TaskID }); } @@ -217,7 +217,7 @@ namespace Duplicati.Server.WebServer var r = Runner.Run(Runner.CreateTask(DuplicatiOperation.List, bk), false) as Duplicati.Library.Interface.IListResults; - bw.WriteJsonObject(r.Filesets); + bw.OutputOK(r.Filesets); } private void ListRemoteFolder(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session, BodyWriter bw) @@ -232,7 +232,7 @@ namespace Duplicati.Server.WebServer try { using(var b = Duplicati.Library.DynamicLoader.BackendLoader.GetBackend(input["url"].Value, new Dictionary())) - bw.WriteJsonObject(new { Status = "OK", Folders = b.List() }); + bw.OutputOK(new { Status = "OK", Folders = b.List() }); } catch (Exception ex) @@ -255,7 +255,7 @@ namespace Duplicati.Server.WebServer using(var b = Duplicati.Library.DynamicLoader.BackendLoader.GetBackend(input["url"].Value, new Dictionary())) b.Test(); - bw.WriteJsonObject(new { Status = "OK" }); + bw.OutputOK(); } catch (Exception ex) { @@ -265,7 +265,7 @@ namespace Duplicati.Server.WebServer private void ListSystemInfo(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session, BodyWriter bw) { - bw.WriteJsonObject(new + bw.OutputOK(new { APIVersion = 1, PasswordPlaceholder = Duplicati.Server.WebServer.Server.PASSWORD_PLACEHOLDER, @@ -299,7 +299,7 @@ namespace Duplicati.Server.WebServer private void ListSupportedActions(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session, BodyWriter bw) { - bw.WriteJsonObject(new { Version = 1, Methods = SUPPORTED_METHODS.Keys }); + bw.OutputOK(new { Version = 1, Methods = SUPPORTED_METHODS.Keys }); } private void ListBackups (HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session, BodyWriter bw) @@ -316,7 +316,7 @@ namespace Duplicati.Server.WebServer select (Database.Schedule)x).FirstOrDefault() }; - bw.WriteJsonObject(all.ToArray()); + bw.OutputOK(all.ToArray()); } private void ListTags(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session, BodyWriter bw) @@ -331,7 +331,7 @@ namespace Duplicati.Server.WebServer // Append all known tags r = r.Union(from n in Program.DataConnection.Backups select n.Tags into p from x in p select x.ToLower()); - bw.WriteJsonObject(r); + bw.OutputOK(r); } private void ValidatePath(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session, BodyWriter bw) @@ -348,7 +348,7 @@ namespace Duplicati.Server.WebServer string path = SpecialFolders.ExpandEnvironmentVariables(input["path"].Value); if (System.IO.Path.IsPathRooted(path) && System.IO.Directory.Exists(path)) { - bw.WriteJsonObject(new { Status = "OK" }); + bw.OutputOK(); return; } } @@ -407,7 +407,7 @@ namespace Duplicati.Server.WebServer else { var ev = Program.GenerateProgressState(); - bw.WriteJsonObject(ev); + bw.OutputOK(ev); } } @@ -420,22 +420,22 @@ namespace Duplicati.Server.WebServer //Make sure we do not report a higher number than the eventnotifyer says var st = new Serializable.ServerStatus(); st.LastEventID = id; - bw.WriteJsonObject(st); + bw.OutputOK(st); } else if (!isError) { - bw.WriteJsonObject(new Serializable.ServerStatus()); + bw.OutputOK(new Serializable.ServerStatus()); } } private void ListCoreOptions(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session, BodyWriter bw) { - bw.WriteJsonObject(new Duplicati.Library.Main.Options(new Dictionary()).SupportedCommands); + bw.OutputOK(new Duplicati.Library.Main.Options(new Dictionary()).SupportedCommands); } private void ListApplicationSettings(HttpServer.IHttpRequest request, HttpServer.IHttpResponse response, HttpServer.Sessions.IHttpSession session, BodyWriter bw) { - bw.WriteJsonObject(Program.DataConnection.ApplicationSettings); + bw.OutputOK(Program.DataConnection.ApplicationSettings); } private static void MergeJsonObjects(Newtonsoft.Json.Linq.JObject self, Newtonsoft.Json.Linq.JObject other) @@ -532,7 +532,7 @@ namespace Duplicati.Server.WebServer { } - bw.WriteJsonObject(new + bw.OutputOK(new { success = true, data = o @@ -549,12 +549,12 @@ namespace Duplicati.Server.WebServer { case "check-update": Program.UpdatePoller.CheckNow(); - bw.WriteJsonObject(new { Status = "OK" }); + bw.OutputOK(); return; case "install-update": Program.UpdatePoller.InstallUpdate(); - bw.WriteJsonObject(new { Status = "OK" }); + bw.OutputOK(); return; case "activate-update": @@ -585,11 +585,11 @@ namespace Duplicati.Server.WebServer Program.LiveControl.Pause(); } - bw.WriteJsonObject(new { Status = "OK" }); + bw.OutputOK(); return; case "resume": Program.LiveControl.Resume(); - bw.WriteJsonObject(new { Status = "OK" }); + bw.OutputOK(); return; case "stop": @@ -619,7 +619,7 @@ namespace Duplicati.Server.WebServer else task.Stop(); - bw.WriteJsonObject(new { Status = "OK" }); + bw.OutputOK(); return; } @@ -636,7 +636,7 @@ namespace Duplicati.Server.WebServer var bt = t == null ? null : t.Backup; if (bt != null && backup.ID == bt.ID) { - bw.WriteJsonObject(new { Status = "OK", Active = true }); + bw.OutputOK(new { Status = "OK", Active = true }); return; } else if (Program.WorkThread.CurrentTasks.Where(x => @@ -645,12 +645,12 @@ namespace Duplicati.Server.WebServer return bn == null || bn.ID == backup.ID; }).Any()) { - bw.WriteJsonObject(new { Status = "OK", Active = true }); + bw.OutputOK(new { Status = "OK", Active = true }); return; } else { - bw.WriteJsonObject(new { Status = "OK", Active = false }); + bw.OutputOK(new { Status = "OK", Active = false }); return; } } @@ -685,7 +685,7 @@ namespace Duplicati.Server.WebServer Program.StatusEventNotifyer.SignalNewEvent(); } } - bw.WriteJsonObject(new { Status = "OK" }); + bw.OutputOK(); return; case "run-verify": @@ -700,7 +700,7 @@ namespace Duplicati.Server.WebServer Program.WorkThread.AddTask(Runner.CreateTask(DuplicatiOperation.Verify, backup)); Program.StatusEventNotifyer.SignalNewEvent(); } - bw.WriteJsonObject(new { Status = "OK" }); + bw.OutputOK(); return; case "run-repair": @@ -715,7 +715,7 @@ namespace Duplicati.Server.WebServer Program.WorkThread.AddTask(Runner.CreateTask(DuplicatiOperation.Repair, backup)); Program.StatusEventNotifyer.SignalNewEvent(); } - bw.WriteJsonObject(new { Status = "OK" }); + bw.OutputOK(); return; case "create-report": { @@ -729,18 +729,18 @@ namespace Duplicati.Server.WebServer Program.WorkThread.AddTask(Runner.CreateTask(DuplicatiOperation.CreateReport, backup)); Program.StatusEventNotifyer.SignalNewEvent(); } - bw.WriteJsonObject(new { Status = "OK" }); + bw.OutputOK(); return; case "clear-warning": Program.HasWarning = false; Program.StatusEventNotifyer.SignalNewEvent(); - bw.WriteJsonObject(new { Status = "OK" }); + bw.OutputOK(); return; case "clear-error": Program.HasError = false; Program.StatusEventNotifyer.SignalNewEvent(); - bw.WriteJsonObject(new { Status = "OK" }); + bw.OutputOK(); return; default: @@ -752,7 +752,7 @@ namespace Duplicati.Server.WebServer return; } - bw.WriteJsonObject(new { + bw.OutputOK(new { Status = "OK", Result = m.Execute(input.Where(x => !x.Name.Equals("command", StringComparison.InvariantCultureIgnoreCase) diff --git a/Duplicati/Server/WebServer/ControlMethods/AddOrUpdateBackup.cs b/Duplicati/Server/WebServer/ControlMethods/AddOrUpdateBackup.cs index 35d683e60..07fbd8d0e 100644 --- a/Duplicati/Server/WebServer/ControlMethods/AddOrUpdateBackup.cs +++ b/Duplicati/Server/WebServer/ControlMethods/AddOrUpdateBackup.cs @@ -62,7 +62,7 @@ namespace Duplicati.Server.WebServer throw new InvalidDataException("External is temporary but internal is not?"); Program.DataConnection.UpdateTemporaryBackup(backup); - bw.WriteJsonObject(new { status = "OK" }); + bw.OutputOK(); } else { @@ -86,7 +86,7 @@ namespace Duplicati.Server.WebServer } - bw.WriteJsonObject(new { status = "OK" }); + bw.OutputOK(); } } catch (Exception ex) @@ -124,7 +124,7 @@ namespace Duplicati.Server.WebServer { Program.DataConnection.RegisterTemporaryBackup(data.Backup); - bw.WriteJsonObject(new { status = "OK", ID = data.Backup.ID }); + bw.OutputOK(new { status = "OK", ID = data.Backup.ID }); } else { @@ -139,7 +139,7 @@ namespace Duplicati.Server.WebServer Program.DataConnection.AddOrUpdateBackupAndSchedule(data.Backup, data.Schedule); } - bw.WriteJsonObject(new { status = "OK", ID = data.Backup.ID }); + bw.OutputOK(new { status = "OK", ID = data.Backup.ID }); } } catch (Exception ex) diff --git a/Duplicati/Server/WebServer/ControlMethods/DeleteBackup.cs b/Duplicati/Server/WebServer/ControlMethods/DeleteBackup.cs index d405304b9..309324e5c 100644 --- a/Duplicati/Server/WebServer/ControlMethods/DeleteBackup.cs +++ b/Duplicati/Server/WebServer/ControlMethods/DeleteBackup.cs @@ -99,7 +99,7 @@ namespace Duplicati.Server.WebServer //We have fiddled with the schedules Program.Scheduler.Reschedule(); - bw.WriteJsonObject(new { status = "OK" }); + bw.OutputOK(); } } } diff --git a/Duplicati/Server/WebServer/ControlMethods/GetBackup.cs b/Duplicati/Server/WebServer/ControlMethods/GetBackup.cs index ba5ae727c..3adc5f749 100644 --- a/Duplicati/Server/WebServer/ControlMethods/GetBackup.cs +++ b/Duplicati/Server/WebServer/ControlMethods/GetBackup.cs @@ -62,7 +62,7 @@ namespace Duplicati.Server.WebServer //TODO: Filter out the password in both settings and the target url - bw.WriteJsonObject(new + bw.OutputOK(new { success = true, data = new { diff --git a/Duplicati/Server/WebServer/ControlMethods/GetFolderContents.cs b/Duplicati/Server/WebServer/ControlMethods/GetFolderContents.cs index a771e139b..7e1498204 100644 --- a/Duplicati/Server/WebServer/ControlMethods/GetFolderContents.cs +++ b/Duplicati/Server/WebServer/ControlMethods/GetFolderContents.cs @@ -104,7 +104,7 @@ namespace Duplicati.Server.WebServer }; } - bw.WriteJsonObject(res); + bw.OutputOK(res); } catch (Exception ex) { diff --git a/Duplicati/Server/WebServer/ControlMethods/ReadLogData.cs b/Duplicati/Server/WebServer/ControlMethods/ReadLogData.cs index a9d9af1da..ca20c2692 100644 --- a/Duplicati/Server/WebServer/ControlMethods/ReadLogData.cs +++ b/Duplicati/Server/WebServer/ControlMethods/ReadLogData.cs @@ -35,7 +35,7 @@ namespace Duplicati.Server.WebServer res = DumpTable(x, "ErrorLog", "Timestamp", input["offset"].Value, input["pagesize"].Value); }); - bw.WriteJsonObject(res); + bw.OutputOK(res); } else { @@ -62,12 +62,12 @@ namespace Duplicati.Server.WebServer try { n["Data"] = System.Text.Encoding.UTF8.GetString((byte[])n["Data"]); } catch { } - bw.WriteJsonObject(dt); + bw.OutputOK(dt); } else { var dt = DumpTable(cmd, "LogData", "ID", input["offset"].Value, input["pagesize"].Value); - bw.WriteJsonObject(dt); + bw.OutputOK(dt); } } } diff --git a/Duplicati/Server/WebServer/ControlMethods/SearchBackupFiles.cs b/Duplicati/Server/WebServer/ControlMethods/SearchBackupFiles.cs index 797a09169..68d891302 100644 --- a/Duplicati/Server/WebServer/ControlMethods/SearchBackupFiles.cs +++ b/Duplicati/Server/WebServer/ControlMethods/SearchBackupFiles.cs @@ -58,7 +58,7 @@ namespace Duplicati.Server.WebServer result["Filesets"] = r.Filesets; result["Files"] = r.Files; - bw.WriteJsonObject(result); + bw.OutputOK(result); } } }