소스 검색

Merge commit 'github/master'

Marcus McLaughlin 15 년 전
부모
커밋
f10d812bd0
3개의 변경된 파일70개의 추가작업 그리고 1개의 파일을 삭제
  1. 36 0
      desktop/core/src/desktop/tests.py
  2. 1 0
      desktop/core/src/desktop/urls.py
  3. 33 1
      desktop/core/src/desktop/views.py

+ 36 - 0
desktop/core/src/desktop/tests.py

@@ -25,6 +25,7 @@ from desktop.lib.paginator import Paginator
 import desktop
 import desktop.urls
 import desktop.conf
+import logging
 from desktop.lib.django_util import TruncatingModel
 import desktop.views as views
 
@@ -239,3 +240,38 @@ def test_404_handling():
   assert_equal(response.template.name, '404.html')
   assert_true('Page Not Found' in response.content)
   assert_true(view_name in response.content)
+
+class RecordingHandler(logging.Handler):
+  def __init__(self, *args, **kwargs):
+    logging.Handler.__init__(self, *args, **kwargs)
+    self.records = []
+
+  def emit(self, r):
+    self.records.append(r)
+
+def test_log_event():
+  c = make_logged_in_client()
+  root = logging.getLogger("desktop.views.log_frontend_event")
+  handler = RecordingHandler()
+  root.addHandler(handler)
+
+  c.get("/log_frontend_event?level=info&message=foo")
+  assert_equal("INFO", handler.records[-1].levelname)
+  assert_equal("Untrusted log event from user test: foo", handler.records[-1].message)
+  assert_equal("desktop.views.log_frontend_event", handler.records[-1].name)
+
+  c.get("/log_frontend_event?level=error&message=foo2")
+  assert_equal("ERROR", handler.records[-1].levelname)
+  assert_equal("Untrusted log event from user test: foo2", handler.records[-1].message)
+
+  c.get("/log_frontend_event?message=foo3")
+  assert_equal("INFO", handler.records[-1].levelname)
+  assert_equal("Untrusted log event from user test: foo3", handler.records[-1].message)
+
+  c.post("/log_frontend_event", {
+    "message": "01234567" * 1024})
+  assert_equal("INFO", handler.records[-1].levelname)
+  assert_equal("Untrusted log event from user test: " + "01234567"*(1024/8), 
+    handler.records[-1].message)
+
+  root.removeHandler(handler)

+ 1 - 0
desktop/core/src/desktop/urls.py

@@ -60,6 +60,7 @@ dynamic_patterns = patterns('',
   (r'^admin/', include(admin.site.urls)),
   (r'^depender/', include(depender.urls)),
   (r'^debug/threads$', 'desktop.views.threads'),
+  (r'^log_frontend_event$', 'desktop.views.log_frontend_event'),
   # Top level web page!
   (r'^$', 'desktop.views.index'),
 )

+ 33 - 1
desktop/core/src/desktop/views.py

@@ -183,7 +183,7 @@ def threads(request):
   """Dumps out server threads.  Useful for debugging."""
   if not request.user.is_superuser:
     return HttpResponse("You must be a superuser.")
-    
+
   out = []
   for thread_id, stack in _threads():
     out.append("Thread id: %s" % thread_id)
@@ -211,3 +211,35 @@ def serve_500_error(request, *args, **kwargs):
   if desktop.conf.HTTP_500_DEBUG_MODE.get():
     return django.views.debug.technical_500_response(request, *sys.exc_info())
   return render_to_response("500.html")
+
+_LOG_LEVELS = {
+  "critical": logging.CRITICAL,
+  "error": logging.ERROR,
+  "warning": logging.WARNING,
+  "info": logging.INFO,
+  "debug": logging.DEBUG
+}
+
+_MAX_LOG_FRONTEND_EVENT_LENGTH = 1024
+
+_LOG_FRONTEND_LOGGER = logging.getLogger("desktop.views.log_frontend_event")
+
+@login_notrequired
+def log_frontend_event(request):
+  """
+  Logs arguments to server's log.  Returns an
+  empty string.
+
+  Parameters (specified via either GET or POST) are
+  "logname", "level" (one of "debug", "info", "warning",
+  "error", or "critical"), and "message".
+  """
+  def get(param, default=None):
+    return request.REQUEST.get(param, default)
+
+  level = _LOG_LEVELS.get(get("level"), logging.INFO)
+  msg = "Untrusted log event from user %s: %s" % (
+    request.user, 
+    get("message", "")[:_MAX_LOG_FRONTEND_EVENT_LENGTH])
+  _LOG_FRONTEND_LOGGER.log(level, msg)
+  return HttpResponse("")