* anti-abuse upgrade: filters now stored in the database (experimental)
[mir.git] / source / mircoders / localizer / basic / MirBasicOpenPostingLocalizer.java
1 /*
2  * Copyright (C) 2001, 2002 The Mir-coders group
3  *
4  * This file is part of Mir.
5  *
6  * Mir is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * Mir is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with Mir; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  * In addition, as a special exception, The Mir-coders gives permission to link
21  * the code of this program with  any library licensed under the Apache Software License,
22  * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library
23  * (or with modified versions of the above that use the same license as the above),
24  * and distribute linked combinations including the two.  You must obey the
25  * GNU General Public License in all respects for all of the code used other than
26  * the above mentioned libraries.  If you modify this file, you may extend this
27  * exception to your version of the file, but you are not obligated to do so.
28  * If you do not wish to do so, delete this exception statement from your version.
29  */
30 package mircoders.localizer.basic;
31
32 import mir.config.MirPropertiesConfiguration;
33 import mir.log.LoggerWrapper;
34 import mir.session.Request;
35 import mir.session.Session;
36 import mir.session.SessionHandler;
37 import mircoders.abuse.FilterType;
38 import mircoders.abuse.ThrottleFilter;
39 import mircoders.abuse.IPFilterType;
40 import mircoders.abuse.RegularExpressionFilterType;
41 import mircoders.entity.EntityComment;
42 import mircoders.entity.EntityContent;
43 import mircoders.global.MirGlobal;
44 import mircoders.global.ProducerEngine;
45 import mircoders.localizer.MirLocalizerExc;
46 import mircoders.localizer.MirLocalizerFailure;
47 import mircoders.localizer.MirOpenPostingLocalizer;
48
49 import java.util.*;
50
51 public class MirBasicOpenPostingLocalizer implements MirOpenPostingLocalizer {
52   private List afterContentProducerTasks;
53   private List afterCommentProducerTasks;
54   private List filterTypes;
55   private Map filterTypesMap;
56   protected LoggerWrapper logger;
57   protected MirPropertiesConfiguration configuration;
58
59   public MirBasicOpenPostingLocalizer() throws MirLocalizerExc, MirLocalizerFailure {
60     logger = new LoggerWrapper("Localizer.Basic.OpenPosting");
61
62     try {
63       configuration = MirPropertiesConfiguration.instance();
64     }
65     catch (Throwable e) {
66       throw new MirLocalizerFailure("Can't get configuration: " + e.getMessage(), e);
67     }
68
69     try {
70       String contentProducers = MirGlobal.config().getString("Mir.Localizer.OpenPosting.ContentProducers");
71       String commentProducers = MirGlobal.config().getString("Mir.Localizer.OpenPosting.CommentProducers");
72
73       afterContentProducerTasks = ProducerEngine.ProducerTask.parseProducerTaskList(contentProducers);
74       afterCommentProducerTasks = ProducerEngine.ProducerTask.parseProducerTaskList(commentProducers);
75     }
76     catch (Throwable t) {
77       logger.error("Setting up MirBasicOpenPostingLocalizer failed: " + t.getMessage());
78
79       throw new MirLocalizerFailure(t);
80     }
81
82     filterTypes = new ArrayList();
83     filterTypesMap = new HashMap();
84
85     addSimpleAntiAbuseFilterType(new RegularExpressionFilterType("regexp"));
86     addSimpleAntiAbuseFilterType(new RegularExpressionFilterType("useragent", false, false,
87         RegularExpressionFilterType.REQUEST_HEADERS, new String[] {"User-Agent"}));
88     addSimpleAntiAbuseFilterType(new IPFilterType("ip"));
89     addSimpleAntiAbuseFilterType(new RegularExpressionFilterType("hostname", false, false,
90         RegularExpressionFilterType.REQUEST_HEADERS, new String[] {"hostname"}));
91     addSimpleAntiAbuseFilterType(new ThrottleFilter("throttle", 60*60*1000));
92   }
93
94   public SessionHandler getOpenSessionHandler(String aSessionType) throws MirLocalizerExc, MirLocalizerFailure  {
95     if ("email".equals(aSessionType))
96       return new MirBasicEmailArticleHandler();
97
98     if ("comment".equals(aSessionType))
99       return new MirBasicCommentPostingHandler(configuration.getBoolean("Localizer.OpenSession.PersistentUploadedFiles"));
100
101     if ("translation".equals(aSessionType))
102       return new MirBasicTranslationPostingHandler();
103
104     return new MirBasicArticlePostingHandler(configuration.getBoolean("Localizer.OpenSession.PersistentUploadedFiles"));
105   }
106
107   public SessionHandler getOpenSessionHandler(Request aRequest, Session aSession) throws MirLocalizerExc, MirLocalizerFailure {
108     if (aSession.getAttribute("handler")==null)
109     {
110       aSession.setAttribute("handler", getOpenSessionHandler(aRequest.getParameter("sessiontype")));
111     }
112
113     return (SessionHandler) aSession.getAttribute("handler");
114   }
115
116   public void afterContentPosting() {
117     Iterator i = afterContentProducerTasks.iterator();
118
119     while (i.hasNext()) {
120       ProducerEngine.ProducerTask task = (ProducerEngine.ProducerTask) i.next();
121
122       try {
123         MirGlobal.getProducerEngine().addTask(task);
124       }
125       catch (Throwable t) {
126         logger.error("Error adding content task "+task.getProducer()+"::"+task.getVerb()+": " + t.toString());
127       }
128     }
129   }
130
131   public void afterContentPosting(EntityContent aContent) {
132     afterContentPosting();
133   }
134
135   public void afterCommentPosting(EntityComment aComment) {
136     afterCommentPosting();
137   }
138
139   public void afterCommentPosting() {
140     Iterator i = afterCommentProducerTasks.iterator();
141
142     while (i.hasNext()) {
143       ProducerEngine.ProducerTask task = (ProducerEngine.ProducerTask) i.next();
144
145       try {
146         MirGlobal.getProducerEngine().addTask(task);
147       }
148       catch (Throwable t) {
149         logger.error("Error adding comment task "+task.getProducer()+"::"+task.getVerb()+": " + t.toString());
150       }
151     }
152   }
153
154   public String generateOnetimePassword() {
155     Random r = new Random();
156     int random = r.nextInt();
157
158     long l = System.currentTimeMillis();
159
160     l = (l*l*l*l)/random;
161     if (l<0)
162       l = l * -1;
163
164     String returnString = ""+l;
165
166     return returnString.substring(5);
167   }
168
169   public List getAntiAbuseFilterTypes() {
170     return filterTypes;
171   }
172
173   public void removeSimpleAntiAbuseFilterType(String aName) {
174     filterTypes.remove(filterTypesMap.get(aName));
175     filterTypesMap.remove(aName);
176   }
177
178   public void addSimpleAntiAbuseFilterType(FilterType aFilterType) {
179     removeSimpleAntiAbuseFilterType(aFilterType.getName());
180     filterTypesMap.put(aFilterType.getName(), aFilterType);
181     filterTypes.add(aFilterType);
182   }
183 }