From f7f11798a90187ab83d038f737368317a99e15b0 Mon Sep 17 00:00:00 2001
From: Christian Heller <c.heller@plomlompom.de>
Date: Tue, 27 Oct 2020 05:57:23 +0100
Subject: [PATCH] Introduce god mode to protect against destructive commands.

---
 new2/plomrogue/commands.py |  4 +---
 new2/plomrogue/game.py     |  2 +-
 new2/plomrogue/io.py       | 11 ++++++++---
 3 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/new2/plomrogue/commands.py b/new2/plomrogue/commands.py
index 9e67ce0..28b7600 100644
--- a/new2/plomrogue/commands.py
+++ b/new2/plomrogue/commands.py
@@ -49,8 +49,7 @@ def cmd_TURN(game, n):
     game.turn = n
 cmd_TURN.argtypes = 'int:nonneg'
 
-#def cmd_ANNOTATE(game, yx, connection_id):
-def cmd_ANNOTATE(game, yx, msg):
+def cmd_ANNOTATE(game, yx, msg, connection_id):
     if msg == ' ':
         if yx in game.annotations:
             del game.annotations[yx]
@@ -66,7 +65,6 @@ def cmd_GET_ANNOTATION(game, yx, connection_id):
     game.io.send('ANNOTATION %s %s' % (yx, quote(annotation)))
 cmd_GET_ANNOTATION.argtypes = 'yx_tuple:nonneg'
 
-# TODO: disallow these commands from clients? (maybe by failing on connection_id?)
 def cmd_MAP_LINE(game, y, line):
     game.map.set_line(y, line)
 cmd_MAP_LINE.argtypes = 'int:nonneg string'
diff --git a/new2/plomrogue/game.py b/new2/plomrogue/game.py
index 74c79d1..406d96d 100755
--- a/new2/plomrogue/game.py
+++ b/new2/plomrogue/game.py
@@ -67,7 +67,7 @@ class Game(GameBase):
                 for i in range(len(lines)):
                     line = lines[i]
                     print("FILE INPUT LINE %5s: %s" % (i, line), end='')
-                    self.io.handle_input(line)
+                    self.io.handle_input(line, god_mode=True)
 
     def get_string_options(self, string_option_type):
         import string
diff --git a/new2/plomrogue/io.py b/new2/plomrogue/io.py
index 2283a98..9f34b18 100644
--- a/new2/plomrogue/io.py
+++ b/new2/plomrogue/io.py
@@ -45,8 +45,13 @@ class GameIO():
             print('Killing server')
             self.server.server_close()
 
-    def handle_input(self, input_, connection_id=None):
-        """Process input_ to command grammar, call command handler if found."""
+    def handle_input(self, input_, connection_id=None, god_mode=False):
+        """Process input_ to command grammar, call command handler if found.
+
+        Command handlers that have no connectin_i argument in their
+        signature will only be called if god_mode is set.
+
+        """
         from inspect import signature
         from plomrogue.errors import GameError, ArgError
         from plomrogue.misc import quote
@@ -64,7 +69,7 @@ class GameIO():
             else:
                 if 'connection_id' in list(signature(command).parameters):
                     command(*args, connection_id=connection_id)
-                else:
+                elif god_mode:
                     command(*args)
                     #if store and not hasattr(command, 'dont_save'):
                     #    with open(self.game_file_name, 'a') as f:
-- 
2.30.2