optionally show a list of logged in admin users
authorzapata <zapata>
Thu, 4 Sep 2003 03:11:42 +0000 (03:11 +0000)
committerzapata <zapata>
Thu, 4 Sep 2003 03:11:42 +0000 (03:11 +0000)
etc/config.properties-dist
source/Mir.java
source/default.properties
source/mircoders/global/MirGlobal.java
source/mircoders/servlet/ServletHelper.java
templates/admin/head.template

index 4642346..958d98f 100755 (executable)
@@ -49,9 +49,7 @@ Mir.Public-email.name=mir-coders mailinglist
 DirectOpenposting=yes
 
 # Default timezone to display times in in admin, producers
-#
-# Leave empty to use the system's default
-Mir.DefaultTimezone=
+Mir.DefaultTimezone= UTC
 
 # Default date/time format
 Mir.DefaultDateTimeFormat = yyyy-MM-dd HH:mm
@@ -80,6 +78,9 @@ Mir.Login.Languages=en;de;fr;nl;es;pt;eu;sv;tr;zh;gz
 # For missing values, the FallbackLanguage is used as default
 Mir.Admin.FallbackLanguage=en
 
+# Show who's logged in?
+Mir.Admin.ShowLoggedinUsers=1
+
 # the templates
 Mir.Localizer.Producer.GeneratorLibrary= default=freemarker(etc/producer/)
 Mir.Localizer.Admin.GeneratorLibrary= default=freemarker(templates/admin/)
@@ -105,9 +106,9 @@ Mir.Localizer.Admin.AllowDeleteComment=1
 Mir.Localizer.Admin.AllowDeleteArticle=1
 
 
-# Article Preview Link URL (Link to produced articles from within admin) 
-ContentList.ArticleLink=http://production.indy.code-foo.org/en/${date.formatted.yyyy}/${date.formatted.MM}/${id}.shtml
-CommentList.ArticleLink=http://production.indy.code-foo.org/en/${co_content.date.formatted.yyyy}/${to_content.date.formatted.MM}/${to_content.id}.shtml
+# Article Preview Link URL (Link to produced articles from within admin)
+Comment.PublicUrl=http://production.indy.code-foo.org/en/${date.formatted.yyyy}/${date.formatted.MM}/${id}.shtml
+Article.PublicUrl=http://production.indy.code-foo.org/en/${co_content.date.formatted.yyyy}/${to_content.date.formatted.MM}/${to_content.id}.shtml
 
 
 # Which producers need to be called after an article (resp. a comment) is posted
@@ -251,9 +252,6 @@ PDF.Footer=Indymedia does blah.  Content is good, and free to use for non-commer
 
 PDF.PageSize=A4
 
-
-
-
 #
 # edit with caution below this line
 ######################################################################
@@ -275,21 +273,9 @@ Database.Username=postgres
 Database.Password=
 Database.Host=localhost
 Database.Name=Mir
+Database.Port=5432
+Database.Driver=org.postgresql.Driver
 
-#
-# this sets the adaptor to be used
-
-Database.Adaptor=mir.storage.DatabaseAdaptorPostgresql
-
-#
-# configuration for adaptor postgres
-# In this example, "Mir" is the dbname
-
-Adaptor.PostgreSQL.URL=jdbc:postgresql://localhost:5432/Mir
-Adaptor.PostgreSQL.Driver=org.postgresql.Driver
-
-# how many articles should be shown on a list-page
-Lists.Max.Items=10
 
 #
 # Servlet / Module configurations
index dbdc8b6..3c42ca6 100755 (executable)
@@ -37,10 +37,10 @@ import java.util.List;
 import java.util.Locale;\r
 import java.util.Map;\r
 import java.util.Vector;\r
-import javax.servlet.ServletConfig;\r
+import javax.servlet.*;\r
 import javax.servlet.ServletException;\r
 import javax.servlet.UnavailableException;\r
-import javax.servlet.http.HttpServletRequest;\r
+import javax.servlet.http.*;\r
 import javax.servlet.http.HttpServletResponse;\r
 import javax.servlet.http.HttpSession;\r
 \r
@@ -67,7 +67,7 @@ import mircoders.storage.DatabaseUsers;
  * Mir.java - main servlet, that dispatches to servletmodules\r
  *\r
  * @author $Author: zapata $\r
- * @version $Id: Mir.java,v 1.49.2.6 2003/09/03 17:49:38 zapata Exp $\r
+ * @version $Id: Mir.java,v 1.49.2.7 2003/09/04 03:11:42 zapata Exp $\r
  *\r
  */\r
 public class Mir extends AbstractServlet {\r
@@ -163,8 +163,10 @@ public class Mir extends AbstractServlet {
       if (username != null && password != null) {\r
         user = usersModule.getUserForLogin(username, password);\r
 \r
-\r
-        ServletHelper.setUser(aRequest, user);\r
+        if (user!=null) {\r
+          ServletHelper.setUser(aRequest, user);\r
+          aRequest.getSession().setAttribute("sessiontracker", new SessionTracker(username));\r
+        }\r
       }\r
 \r
       return user;\r
@@ -351,4 +353,20 @@ public class Mir extends AbstractServlet {
   public String getServletInfo() {\r
     return "Mir " + configuration.getString("Mir.Version");\r
   }\r
+\r
+  private class SessionTracker implements HttpSessionBindingListener {\r
+    private String name;\r
+\r
+    public SessionTracker(String aUserName) {\r
+      name = aUserName;\r
+    }\r
+\r
+    public void valueBound(HttpSessionBindingEvent anEvent) {\r
+      MirGlobal.registerLogin(name);\r
+    }\r
+\r
+    public void valueUnbound(HttpSessionBindingEvent anEvent) {\r
+      MirGlobal.registerLogout(name);\r
+    }\r
+  }\r
 }\r
index 66aea54..09ee4c8 100755 (executable)
@@ -85,6 +85,9 @@ Mir.Login.Languages=en;de;fr;nl;es;pt;eu;sv;tr;zh;gz
 # For missing values, the FallbackLanguage is used as default
 Mir.Admin.FallbackLanguage=en
 
+# Show who's logged in?
+Mir.Admin.ShowLoggedinUsers=1
+
 
 # Which usernames have admin priviliges (, seperated usernames)
 AccessControl.SuperUsers = admin
@@ -114,8 +117,8 @@ Mir.Localizer.Admin.AllowDeleteComment=1
 Mir.Localizer.Admin.AllowDeleteArticle=1
 
 # Article Preview Link URL (Link to produced articles from within admin)
-ContentList.ArticleLink=http://production.indy.code-foo.org/en/${date.formatted.yyyy}/${date.formatted.MM}/${id}.shtml
-CommentList.ArticleLink=http://production.indy.code-foo.org/en/${co_content.date.formatted.yyyy}/${to_content.date.formatted.MM}/${to_content.id}.shtml
+Comment.PublicUrl=/en/${date.formatted.yyyy}/${date.formatted.MM}/${id}.shtml
+Article.PublicUrl=/en/${co_content.date.formatted.yyyy}/${to_content.date.formatted.MM}/${to_content.id}.shtml
 
 # enable deletion of comments/articles?
 Mir.Localizer.Admin.AdministerOperations= \
@@ -352,9 +355,6 @@ Global.Cache.Items=15
 # DATABASE SETUP
 #
 
-#
-# specify your database
-
 Database.poolMin=1
 Database.poolMax=10
 Database.poolResetTime=1.0
index 59c61e1..81728c2 100755 (executable)
@@ -50,6 +50,7 @@ public class MirGlobal {
   static private AccessControl accessControl;\r
   static private Map articleOperations;\r
   static private Map commentOperations;\r
+  static private Map loggedInUsers = new HashMap();\r
 \r
   public synchronized static MirLocalizer localizer() {\r
     String localizerClassName;\r
@@ -188,6 +189,48 @@ public class MirGlobal {
     }\r
   }\r
 \r
+\r
+  public static List getLoggedInUsers() {\r
+    List result = new Vector();\r
+\r
+    synchronized (loggedInUsers) {\r
+      Iterator i = loggedInUsers.entrySet().iterator();\r
+\r
+      while (i.hasNext()) {\r
+        Map.Entry entry = (Map.Entry) i.next();\r
+\r
+        Map item = new HashMap();\r
+        item.put("name", entry.getKey());\r
+        item.put("count", entry.getValue());\r
+        result.add(item);\r
+      }\r
+    }\r
+\r
+    return result;\r
+  }\r
+\r
+  public static void registerLogin(String aName) {\r
+    modifyLoggedInCount(aName, 1);\r
+  }\r
+\r
+  public static void registerLogout(String aName) {\r
+    modifyLoggedInCount(aName, -1);\r
+  }\r
+\r
+  private static void modifyLoggedInCount(String aName, int aModifier) {\r
+    synchronized (loggedInUsers) {\r
+      Integer count = (Integer) loggedInUsers.get(aName);\r
+      if (count==null)\r
+        count = new Integer(0);\r
+\r
+      if (count.intValue()+aModifier<=0) {\r
+        loggedInUsers.remove(aName);\r
+      }\r
+      else {\r
+        loggedInUsers.put(aName, new Integer(count.intValue() + aModifier));\r
+      }\r
+    }\r
+  }\r
 }\r
 \r
 \r
index 5ed322c..2dc6842 100755 (executable)
@@ -51,8 +51,7 @@ import mircoders.global.MirGlobal;
 \r
 \r
 public class ServletHelper {\r
-  static LoggerWrapper logger = new LoggerWrapper("ServletModule.Helper");\r
-\r
+  private static LoggerWrapper logger = new LoggerWrapper("ServletModule.Helper");\r
 \r
   public static Map makeGenerationData(HttpServletRequest aRequest, HttpServletResponse aResponse, Locale[] aLocales) throws ServletModuleExc {\r
     return makeGenerationData(aRequest, aResponse, aLocales, "bundles.adminlocal", "bundles.admin");\r
@@ -63,8 +62,8 @@ public class ServletHelper {
   }\r
 \r
   public static Map makeGenerationData(HttpServletRequest aRequest, HttpServletResponse aResponse, Locale[] aLocales, String aBundle, String aDefaultBundle) throws ServletModuleExc {\r
-\r
     try {\r
+      MirPropertiesConfiguration configuration = MirPropertiesConfiguration.instance();\r
       Map result = new HashMap();\r
 \r
       MirGlobal.localizer().producerAssistant().initializeGenerationValueSet(result);\r
@@ -76,6 +75,12 @@ public class ServletHelper {
       result.put("returnurl", null);\r
       result.put("login_user", getUserAdapter(aRequest));\r
 \r
+      if (configuration.getString("Mir.Admin.ShowLoggedinUsers").equals("1")) {\r
+        result.put("loggedinusers", MirGlobal.getLoggedInUsers());\r
+      }\r
+      else\r
+        result.put("loggedinusers", null);\r
+\r
       Object languages =\r
           new CachingRewindableIterator(\r
             new EntityIteratorAdapter( "", "id", 30,\r
index 0c942f7..5def6d8 100755 (executable)
   </tr>
 </table>
 <hr>
+<if loggedinusers>
+  logged in: 
+  <list loggedinusers as u>
+    ${u.name} (${u.count})
+  </list>
+<hr>
+</if>