diff --git a/webservice/webservice.py b/webservice/webservice.py
index 63d577f356c420b25fb6c5a2d5bad2b262c293cf..f322c1e5278d687238f7e444e0b11844502721ef 100644
--- a/webservice/webservice.py
+++ b/webservice/webservice.py
@@ -171,6 +171,21 @@ async def upload_config(config, yaml, instrument, cycle, proposal) -> bytes:
     return Success.UPLOADED_CONFIG.format(cycle, proposal).encode()
 
 
+def git_author_from_munge(munge_cred: bytes) -> Optional[git.Actor]:
+    try:
+        uid = pymunge.decode(munge_cred)[1]
+        user_details = pwd.getpwuid(uid)
+        logging.debug("MUNGE credential from user %s", user_details.pw_name)
+        full_name = user_details.pw_gecos.split(',')[0]
+        email = full_name.lower().replace(' ', '.') + '@xfel.eu'  # Hopefully
+        return git.Actor(full_name, email)
+    except Exception:
+        logging.warning(
+            "Failed to recognise author from MUNGE credential", exc_info=True
+        )
+        return None
+
+
 def merge(source: Dict, destination: Dict) -> Dict:
     """Deep merge two dictionaries.
 
@@ -248,17 +263,7 @@ def change_config(config, updated_config, instrument,
 
     author = None
     if munge_cred is not None:
-        try:
-            uid = pymunge.decode(munge_cred.encode())[1]
-            user_details = pwd.getpwuid(uid)
-            logging.debug("MUNGE credential from user %s", user_details.pw_name)
-            full_name = user_details.pw_gecos.split(',')[0]
-            email = full_name.lower().replace(' ', '.') + '@xfel.eu'  # Hopefully
-            author = git.Actor(full_name, email)
-        except Exception:
-            logging.warning(
-                "Failed to recognise author from MUNGE credential", exc_info=True
-            )
+        author = git_author_from_munge(munge_cred.encode())
     else:
         logging.info("update_conf request without MUNGE credential")