From e22cb62493da28955cc98e43fdf237c829eae407 Mon Sep 17 00:00:00 2001
From: jrandom <jrandom>
Date: Sun, 2 May 2004 04:46:52 +0000
Subject: [PATCH] handle /setTime?blah&now=yyyyMMdd_HH:mm:ss.SSSS (updating the
 router's clock) yes, we'll want to filter the access to the admin manager ;)

---
 .../src/net/i2p/router/admin/AdminRunner.java | 32 +++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/router/java/src/net/i2p/router/admin/AdminRunner.java b/router/java/src/net/i2p/router/admin/AdminRunner.java
index d9677e5c8e..f0db749140 100644
--- a/router/java/src/net/i2p/router/admin/AdminRunner.java
+++ b/router/java/src/net/i2p/router/admin/AdminRunner.java
@@ -8,6 +8,9 @@ import java.io.OutputStream;
 import java.net.Socket;
 import java.util.Iterator;
 import java.util.Set;
+import java.util.Locale;
+import java.text.SimpleDateFormat;
+import java.text.ParseException;
 
 import net.i2p.data.Hash;
 import net.i2p.router.Router;
@@ -48,6 +51,9 @@ class AdminRunner implements Runnable {
             reply(out, _generator.generateStatsPage());
         } else if (command.indexOf("/profile/") >= 0) {
             replyText(out, getProfile(command));
+        } else if (command.indexOf("setTime") >= 0) {
+            setTime(command);
+            reply(out, "<html><body>Time updated</body></html>");
         } else if (true || command.indexOf("routerConsole.html") > 0) {
             reply(out, _context.router().renderStatusHTML());
         }
@@ -105,4 +111,30 @@ class AdminRunner implements Runnable {
         
         return "No such peer is being profiled\n";
     }
+    
+    
+    private static final String FORMAT_STRING = "yyyyMMdd_HH:mm:ss.SSS";
+    private SimpleDateFormat _fmt = new SimpleDateFormat(FORMAT_STRING, Locale.UK);
+    
+    private long getTime(String now) throws ParseException { 
+        synchronized (_fmt) {
+            return _fmt.parse(now).getTime();
+        }
+    }
+    private void setTime(String cmd) {
+        int start = cmd.indexOf("now=");
+        String str = cmd.substring(start + 4, start+4+FORMAT_STRING.length());
+        try {
+            long now = getTime(str);
+            if (_log.shouldLog(Log.INFO))
+                _log.log(Log.INFO, "Admin time set to " + str);
+            setTime(now);
+        } catch (ParseException pe) {
+            _log.error("Invalid time specified [" + str + "]", pe);
+        }
+    }
+    
+    private void setTime(long now) {
+        _context.clock().setNow(now);
+    }
 }
-- 
GitLab