1 /*****************************************************************
2 * Licensed to the Apache Software Foundation (ASF) under one *
3 * or more contributor license agreements. See the NOTICE file *
4 * distributed with this work for additional information *
5 * regarding copyright ownership. The ASF licenses this file *
6 * to you under the Apache License, Version 2.0 (the *
7 * "License"); you may not use this file except in compliance *
8 * with the License. You may obtain a copy of the License at *
9 * *
10 * http://www.apache.org/licenses/LICENSE-2.0 *
11 * *
12 * Unless required by applicable law or agreed to in writing, *
13 * software distributed under the License is distributed on an *
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
15 * KIND, either express or implied. See the License for the *
16 * specific language governing permissions and limitations *
17 * under the License. *
18 ****************************************************************/
19
20 package org.apache.james.transport.matchers;
21
22 import org.apache.james.util.NetMatcher;
23 import javax.mail.MessagingException;
24 import java.util.StringTokenizer;
25 import java.util.Collection;
26
27 /***
28 * AbstractNetworkMatcher makes writing IP Address matchers easier.
29 *
30 * AbstractNetworkMatcher provides a means for checking to see whether
31 * a particular IP address or domain is within a set of subnets
32 * These subnets may be expressed in one of several formats:
33 *
34 * Format Example
35 * explicit address 127.0.0.1
36 * address with a wildcard 127.0.0.*
37 * domain name myHost.com
38 * domain name + prefix-length myHost.com/24
39 * domain name + mask myHost.com/255.255.255.0
40 * IP address + prefix-length 127.0.0.0/8
41 * IP + mask 127.0.0.0/255.0.0.0
42 *
43 * For more information, see also: RFC 1518 and RFC 1519.
44 *
45 * @version $ID$
46 */
47 public abstract class AbstractNetworkMatcher extends org.apache.mailet.GenericMatcher {
48
49 /***
50 * This is a Network Matcher that should be configured to contain
51 * authorized networks
52 */
53 private NetMatcher authorizedNetworks = null;
54
55 public void init() throws MessagingException {
56 Collection nets = allowedNetworks();
57 if (nets != null) {
58 authorizedNetworks = new NetMatcher() {
59 protected void log(String s) {
60 AbstractNetworkMatcher.this.log(s);
61 }
62 };
63 authorizedNetworks.initInetNetworks(allowedNetworks());
64 log("Authorized addresses: " + authorizedNetworks.toString());
65 }
66 }
67
68 protected Collection allowedNetworks() {
69 Collection networks = null;
70 if (getCondition() != null) {
71 StringTokenizer st = new StringTokenizer(getCondition(), ", ", false);
72 networks = new java.util.ArrayList();
73 while (st.hasMoreTokens()) networks.add(st.nextToken());
74 }
75 return networks;
76 }
77
78 protected boolean matchNetwork(java.net.InetAddress addr) {
79 return authorizedNetworks == null ? false : authorizedNetworks.matchInetNetwork(addr);
80 }
81
82 protected boolean matchNetwork(String addr) {
83 return authorizedNetworks == null ? false : authorizedNetworks.matchInetNetwork(addr);
84 }
85 }