File Source: ipaddresslistener.java
1 /*
2 * Copyright (c) 2003-2006, Simon Brown
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * - Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in
13 * the documentation and/or other materials provided with the
14 * distribution.
15 *
16 * - Neither the name of Pebble nor the names of its contributors may
17 * be used to endorse or promote products derived from this software
18 * without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
31 */
32 package net.sourceforge.pebble.event.response;
33
34 import net.sourceforge.pebble.PluginProperties;
35 import net.sourceforge.pebble.domain.Response;
36 import org.apache.commons.logging.Log;
37 import org.apache.commons.logging.LogFactory;
38
39 /**
40 * Checks comment and TrackBack IP address against a whitelist and a blacklist.
41 * If in the whitelist, the response is left as-is. If in the blacklist,
42 * the response is set to pending and the spam score incremented by 1 point.
43 * If in neither, the response is set to pending but the spam score isn't
44 * increased. This allows responses from new IP addresses to be manually
45 * verified before publication.
46 *
47 * @author Simon Brown
48 */
/*
P/P * Method: void net.sourceforge.pebble.event.response.IpAddressListener()
*/
49 public class IpAddressListener extends BlogEntryResponseListenerSupport {
50
51 /** the log used by this class */
/*
P/P * Method: net.sourceforge.pebble.event.response.IpAddressListener__static_init
*
* Postconditions:
* init'ed(log)
*/
52 private static final Log log = LogFactory.getLog(IpAddressListener.class);
53
54 /** the name of the whitelist property */
55 public static final String WHITELIST_KEY = "IpAddressListener.whitelist";
56
57 /** the name of the blacklist property */
58 public static final String BLACKLIST_KEY = "IpAddressListener.blacklist";
59
60 /**
61 * Called when a comment or TrackBack has been added.
62 *
63 * @param response a Response
64 */
65 protected void blogEntryResponseAdded(Response response) {
/*
P/P * Method: void blogEntryResponseAdded(Response)
*
* Preconditions:
* response != null
*
* Presumptions:
* org.apache.commons.logging.LogFactory:getLog(...)@52 != null
*
* Preconditions:
* response.blogEntry.blog.pluginProperties != null
* response.blogEntry != null
* response.blogEntry.blog != null
* init'ed(response.ipAddress)
* (soft) response.spamScore <= 232-2
* (soft) init'ed(response.title)
*
* Postconditions:
* response.spamScore == One-of{old response.spamScore + 1, old response.spamScore}
* (soft) init'ed(response.spamScore)
* response.state == One-of{&net.sourceforge.pebble.domain.State__static_init.new State(State__static_init#3), old response.state}
*/
66 PluginProperties props = response.getBlogEntry().getBlog().getPluginProperties();
67
68 if (isListed(response, props.getProperty(BLACKLIST_KEY))) {
69 log.info(response.getTitle() + " marked as pending : IP address " + response.getIpAddress() + " is on blacklist");
70 response.setPending();
71 response.incrementSpamScore();
72 } else if (isListed(response, props.getProperty(WHITELIST_KEY))) {
73 // do nothing
74 } else {
75 log.info(response.getTitle() + " marked as pending : IP address " + response.getIpAddress() + " not on blacklist or whitelist");
76 response.setPending();
77 }
78 }
79
80 /**
81 * Called when a comment or TrackBack has been approved.
82 *
83 * @param response a Response
84 */
85 protected void blogEntryResponseApproved(Response response) {
/*
P/P * Method: void blogEntryResponseApproved(Response)
*
* Preconditions:
* response != null
*
* Test Vectors:
* java.lang.String:length(...)@88: {1..232-1}, {0}
*
* Preconditions:
* (soft) response.blogEntry.blog.pluginProperties != null
* response.blogEntry != null
* response.blogEntry.blog != null
* init'ed(response.ipAddress)
*
* Test Vectors:
* response.ipAddress: Addr_Set{null}, Inverse{null}
*/
86 PluginProperties props = response.getBlogEntry().getBlog().getPluginProperties();
87
88 if (response.getIpAddress() == null || response.getIpAddress().trim().length() == 0) {
89 return;
90 }
91
92 synchronized (props) {
93 String whitelist = props.getProperty(WHITELIST_KEY);
94 String blacklist = props.getProperty(BLACKLIST_KEY);
95 whitelist = addIpAddress(response, whitelist);
96 blacklist = removeIpAddress(response, blacklist);
97 props.setProperty(WHITELIST_KEY, whitelist);
98 props.setProperty(BLACKLIST_KEY, blacklist);
99 props.store();
100 }
101 }
102
103 /**
104 * Called when a comment or TrackBack has been rejected.
105 *
106 * @param response a Response
107 */
108 protected void blogEntryResponseRejected(Response response) {
/*
P/P * Method: void blogEntryResponseRejected(Response)
*
* Preconditions:
* response != null
*
* Test Vectors:
* java.lang.String:length(...)@111: {1..232-1}, {0}
*
* Preconditions:
* (soft) response.blogEntry.blog.pluginProperties != null
* response.blogEntry != null
* response.blogEntry.blog != null
* init'ed(response.ipAddress)
*
* Test Vectors:
* response.ipAddress: Addr_Set{null}, Inverse{null}
*/
109 PluginProperties props = response.getBlogEntry().getBlog().getPluginProperties();
110
111 if (response.getIpAddress() == null || response.getIpAddress().trim().length() == 0) {
112 return;
113 }
114
115 synchronized (props) {
116 String blacklist = props.getProperty(BLACKLIST_KEY);
117 String whitelist = props.getProperty(WHITELIST_KEY);
118 blacklist = addIpAddress(response, blacklist);
119 whitelist = removeIpAddress(response, whitelist);
120 props.setProperty(BLACKLIST_KEY, blacklist);
121 props.setProperty(WHITELIST_KEY, whitelist);
122 props.store();
123 }
124 }
125
126 /**
127 * Determines whether the IP address of the specified response is contained
128 * within a given list of IP addresses.
129 *
130 * @param response a Response instance
131 * @param list a list of IP addresses, comma separated
132 * @return true if the IP address is contained within the list,
133 * false otherwise
134 */
135 private boolean isListed(Response response, String list) {
/*
P/P * Method: bool isListed(Response, String)
*
* Preconditions:
* response != null
*
* Presumptions:
* ipAddresses.length@142 <= 232-1
*
* Postconditions:
* init'ed(return_value)
*
* Test Vectors:
* list: Addr_Set{null}, Inverse{null}
* java.lang.String:equals(...)@148: {0}, {1}
*
* Preconditions:
* init'ed(response.ipAddress)
*
* Test Vectors:
* response.ipAddress: Inverse{null}, Addr_Set{null}
*/
136 if (response.getIpAddress() == null) {
137 return false;
138 }
139
140 String ipAddresses[] = null;
141 if (list != null) {
142 ipAddresses = list.split(",");
143 } else {
144 ipAddresses = new String[0];
145 }
146
147 for (int i = 0; i < ipAddresses.length; i++) {
148 if (response.getIpAddress().equals(ipAddresses[i])) {
149 return true;
150 }
151 }
152
153 return false;
154 }
155
156 /**
157 * Adds the IP address of the specified response to the given list.
158 *
159 * @param response a Response instance
160 * @param list a list of IP addresses, comma separated
161 * @return an updated list of IP addresses
162 */
163 private String addIpAddress(Response response, String list) {
/*
P/P * Method: String addIpAddress(Response, String)
*
* Postconditions:
* init'ed(return_value)
*
* Test Vectors:
* list: Addr_Set{null}, Inverse{null}
* java.lang.String:length(...)@164: {1..232-1}, {0}
*
* Preconditions:
* (soft) response != null
* (soft) init'ed(response.ipAddress)
*/
164 if (list == null || list.trim().length() == 0) {
165 return response.getIpAddress();
166 } else if (!isListed(response, list)) {
167 return list + "," + response.getIpAddress();
168 } else {
169 return list;
170 }
171 }
172
173 /**
174 * Removes the IP address of the specified response to the given list.
175 *
176 * @param response a Response instance
177 * @param list a list of IP addresses, comma separated
178 * @return an updated list of IP addresses
179 */
180 private String removeIpAddress(Response response, String list) {
/*
P/P * Method: String removeIpAddress(Response, String)
*
* Preconditions:
* response != null
*
* Presumptions:
* ipAddresses.length@187 <= 232-1
*
* Postconditions:
* init'ed(return_value)
*
* Test Vectors:
* list: Addr_Set{null}, Inverse{null}
* java.lang.String:equals(...)@194: {1}, {0}
* java.lang.StringBuffer:length(...)@195: {-231..0}, {1..232-1}
*
* Preconditions:
* init'ed(response.ipAddress)
*
* Test Vectors:
* response.ipAddress: Inverse{null}, Addr_Set{null}
*/
181 if (response.getIpAddress() == null) {
182 return list;
183 }
184
185 String ipAddresses[] = null;
186 if (list != null) {
187 ipAddresses = list.split(",");
188 } else {
189 ipAddresses = new String[0];
190 }
191
192 StringBuffer buf = new StringBuffer();
193 for (int i = 0; i < ipAddresses.length; i++) {
194 if (!response.getIpAddress().equals(ipAddresses[i])) {
195 if (buf.length() > 0) {
196 buf.append(",");
197 }
198 buf.append(ipAddresses[i]);
199 }
200 }
201 return buf.toString();
202 }
203
204 }
SofCheck Inspector Build Version : 2.22510
| ipaddresslistener.java |
2010-Jun-25 19:40:32 |
| ipaddresslistener.class |
2010-Jul-19 20:23:38 |