From c7ae87c4d5241db953d01a59b48278bad334d79e Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sun, 14 Jul 2019 10:43:31 +0200
Subject: [PATCH] Fixed #457 - prevent editing of default charts

---
 .../budgetmaster/charts/ChartController.java  | 10 ++++++
 src/main/resources/languages/_de.properties   |  2 ++
 src/main/resources/languages/_en.properties   |  2 ++
 .../resources/templates/charts/newChart.ftl   | 18 +++++++++--
 src/main/resources/templates/error/400.ftl    | 32 +++++++++++++++++++
 src/main/resources/templates/index.ftl        |  1 +
 6 files changed, 63 insertions(+), 2 deletions(-)
 create mode 100644 src/main/resources/templates/error/400.ftl

diff --git a/src/main/java/de/deadlocker8/budgetmaster/charts/ChartController.java b/src/main/java/de/deadlocker8/budgetmaster/charts/ChartController.java
index 3d1445633..49db6e9e9 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/charts/ChartController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/charts/ChartController.java
@@ -74,10 +74,20 @@ public class ChartController extends BaseController
 		}
 		else
 		{
+			Chart existingChart = chartService.getRepository().getOne(chart.getID());
+			if(existingChart != null)
+			{
+				if(existingChart.getType() != ChartType.CUSTOM)
+				{
+					return "error/400";
+				}
+			}
+
 			if(chart.getType() == null)
 			{
 				chart.setType(ChartType.CUSTOM);
 			}
+
 			chartService.getRepository().save(chart);
 		}
 
diff --git a/src/main/resources/languages/_de.properties b/src/main/resources/languages/_de.properties
index a3c483b4a..8792d9715 100644
--- a/src/main/resources/languages/_de.properties
+++ b/src/main/resources/languages/_de.properties
@@ -6,6 +6,7 @@ github.url=https://github.com/deadlocker8/BudgetMaster
 
 # ERRORPAGES
 errorpages.home=Zur Startseite
+errorpages.400=Ung�ltige Anfrage.
 errorpages.403=Zugriff nicht gestattet.
 errorpages.404=Die angegebene Seite konnte nicht gefunden werden.
 errorpages.418=I'm a teapot.
@@ -330,5 +331,6 @@ charts.default.categoryBudget=Verbrauch nach Kategorien
 
 chart.new.label.name=Name
 chart.new.label.script=Script
+chart.new.info.default=Diese mitgeliefert Diagrammvorlage kann nicht �berschrieben werden, aber du kannst dir den Code ansehen.
 chart.type=Typ
 chart.actions=Aktionen
\ No newline at end of file
diff --git a/src/main/resources/languages/_en.properties b/src/main/resources/languages/_en.properties
index a0778df47..aeae2ece8 100644
--- a/src/main/resources/languages/_en.properties
+++ b/src/main/resources/languages/_en.properties
@@ -6,6 +6,7 @@ github.url=https://github.com/deadlocker8/BudgetMaster
 
 # ERRORPAGES
 errorpages.home=To Homepage
+errorpages.400=Bad request.
 errorpages.403=Access denied.
 errorpages.404=The requested page doesn't exist.
 errorpages.418=I'm a teapot.
@@ -330,5 +331,6 @@ charts.default.categoryBudget=Consumption by categories
 
 chart.new.label.name=Name
 chart.new.label.script=Script
+chart.new.info.default=This default chart can\'t be overwritten but you can have a look on how it's implemented.
 chart.type=Type
 chart.actions=Actions
\ No newline at end of file
diff --git a/src/main/resources/templates/charts/newChart.ftl b/src/main/resources/templates/charts/newChart.ftl
index 083366421..d2035fdce 100644
--- a/src/main/resources/templates/charts/newChart.ftl
+++ b/src/main/resources/templates/charts/newChart.ftl
@@ -39,6 +39,20 @@
 
                         <br>
 
+                        <#-- info message if chart is not editable -->
+                        <#if (chart.getType().name() == "DEFAULT")>
+                            <div class="row no-margin-bottom">
+                                <div class="col s12 center-align">
+                                    <table class="text-color login-message no-border-table">
+                                        <tr>
+                                            <td><i class="material-icons">info</i></td>
+                                            <td id="loginMessage">${locale.getString("chart.new.info.default")}</td>
+                                        </tr>
+                                    </table>
+                                </div>
+                            </div>
+                        </#if>
+
                         <#-- buttons -->
                         <div class="row hide-on-small-only">
                             <div class="col s6 right-align">
@@ -46,7 +60,7 @@
                             </div>
 
                             <div class="col s6 left-align">
-                                <button class="btn waves-effect waves-light budgetmaster-blue" type="submit" name="action">
+                                <button class="btn waves-effect waves-light budgetmaster-blue" type="submit" name="action" <#if (chart.getType().name() == "DEFAULT")>disabled</#if>>
                                     <i class="material-icons left">save</i>${locale.getString("save")}
                                 </button>
                             </div>
@@ -59,7 +73,7 @@
                             </div>
                             <div class="row center-align">
                                 <div class="col s12">
-                                    <button class="btn waves-effect waves-light budgetmaster-blue" type="submit" name="buttonSave">
+                                    <button class="btn waves-effect waves-light budgetmaster-blue" type="submit" name="buttonSave" <#if (chart.getType().name() == "DEFAULT")>disabled</#if>>
                                         <i class="material-icons left">save</i>${locale.getString("save")}
                                     </button>
                                 </div>
diff --git a/src/main/resources/templates/error/400.ftl b/src/main/resources/templates/error/400.ftl
new file mode 100644
index 000000000..03219beb1
--- /dev/null
+++ b/src/main/resources/templates/error/400.ftl
@@ -0,0 +1,32 @@
+<html>
+    <head>
+        <#import "../helpers/header.ftl" as header>
+        <@header.header "BudgetMaster - 400"/>
+        <@header.style "login"/>
+        <#import "/spring.ftl" as s>
+    </head>
+    <body class="budgetmaster-blue-light">
+        <main>
+            <div class="row valign-wrapper full-height">
+                <div class="col l4 offset-l4 m6 offset-m3 s10 offset-s1">
+                    <div class="card background-color">
+                        <div class="card-content">
+                            <div class="card-title">
+                                <div id="logo-container" class="center-align"><@header.logo "logo" ""/></div>
+                            </div>
+                            <div class="row">
+                                <div class="col s12 center-align">
+                                    <h1>❌ 400</h1>
+                                    <h5>${locale.getString("errorpages.400")}</h5>
+                                </div>
+                            </div>
+                            <div class="center-align">
+                                <a href="<@s.url '/'/>" class="waves-effect waves-light btn budgetmaster-blue"><i class="material-icons left">home</i>${locale.getString("errorpages.home")}</a>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </main>
+    </body>
+</html>
\ No newline at end of file
diff --git a/src/main/resources/templates/index.ftl b/src/main/resources/templates/index.ftl
index 8a5849404..b8cf8a963 100644
--- a/src/main/resources/templates/index.ftl
+++ b/src/main/resources/templates/index.ftl
@@ -56,6 +56,7 @@
                             <p class="text-grey home-menu-text">${locale.getString("home.menu.charts")}</p>
                             <div class="left-align">
                                 <a href="<@s.url '/charts/manage'/>" class="waves-effect btn-flat home-menu-link-item"><i class="material-icons left">play_arrow</i>${locale.getString("home.menu.charts.action.manage")}</a>
+                                <br>
                                 <a href="<@s.url '/charts'/>" class="waves-effect btn-flat home-menu-link-item"><i class="material-icons left">play_arrow</i>${locale.getString("home.menu.charts.action.show")}</a>
                             </div>
 
-- 
GitLab