001: /* ====================================================================
002: * The Jcorporate Apache Style Software License, Version 1.2 05-07-2002
003: *
004: * Copyright (c) 1995-2002 Jcorporate Ltd. All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions
008: * are met:
009: *
010: * 1. Redistributions of source code must retain the above copyright
011: * notice, this list of conditions and the following disclaimer.
012: *
013: * 2. Redistributions in binary form must reproduce the above copyright
014: * notice, this list of conditions and the following disclaimer in
015: * the documentation and/or other materials provided with the
016: * distribution.
017: *
018: * 3. The end-user documentation included with the redistribution,
019: * if any, must include the following acknowledgment:
020: * "This product includes software developed by Jcorporate Ltd.
021: * (http://www.jcorporate.com/)."
022: * Alternately, this acknowledgment may appear in the software itself,
023: * if and wherever such third-party acknowledgments normally appear.
024: *
025: * 4. "Jcorporate" and product names such as "Expresso" must
026: * not be used to endorse or promote products derived from this
027: * software without prior written permission. For written permission,
028: * please contact info@jcorporate.com.
029: *
030: * 5. Products derived from this software may not be called "Expresso",
031: * or other Jcorporate product names; nor may "Expresso" or other
032: * Jcorporate product names appear in their name, without prior
033: * written permission of Jcorporate Ltd.
034: *
035: * 6. No product derived from this software may compete in the same
036: * market space, i.e. framework, without prior written permission
037: * of Jcorporate Ltd. For written permission, please contact
038: * partners@jcorporate.com.
039: *
040: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
041: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
042: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
043: * DISCLAIMED. IN NO EVENT SHALL JCORPORATE LTD OR ITS CONTRIBUTORS
044: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
045: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
046: * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
047: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
048: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
049: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
050: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
051: * SUCH DAMAGE.
052: * ====================================================================
053: *
054: * This software consists of voluntary contributions made by many
055: * individuals on behalf of the Jcorporate Ltd. Contributions back
056: * to the project(s) are encouraged when you make modifications.
057: * Please send them to support@jcorporate.com. For more information
058: * on Jcorporate Ltd. and its products, please see
059: * <http://www.jcorporate.com/>.
060: *
061: * Portions of this software are based upon other open source
062: * products and are subject to their respective licenses.
063: */
064:
065: package com.jcorporate.expresso.ext.dbobj;
066:
067: import com.jcorporate.expresso.core.db.DBConnection;
068: import com.jcorporate.expresso.core.db.DBException;
069: import com.jcorporate.expresso.core.dbobj.DBObject;
070: import com.jcorporate.expresso.core.dbobj.RequestContext;
071:
072: import java.lang.ref.Reference;
073: import java.lang.ref.SoftReference;
074: import java.net.InetAddress;
075: import java.util.Vector;
076:
077: /**
078: * Class that maintains a database of all known top level domain codes. Useful
079: * for testing whether a particular domain should be denied or not.
080: * See {@link com.jcorporate.expresso.ext.dbobj.RestrictedCountries} for sample usage.<br />
081: * <p/>
082: * This class derives from ISOCountryCodes since most top level domain names are
083: * simply the ISO country codes. However, an additional table is necessary for
084: * all the additions such as .com, .biz, .uk, etc. <br />
085: * <p/>
086: * The domain information was from http://www.iana.org/
087: *
088: * @author Michael Rimov
089: * @since Expresso 5.0
090: */
091: public class ReverseLookupDomains extends ISOCountryCodes {
092: public static final String FLD_DOMAINCODE = "DomainCode";
093: public static final String FLD_DESCRIPTION = "DomainDescrip";
094: public static final String FLD_NOTES = "DomainNotes";
095:
096: /**
097: * Constructor
098: *
099: * @throws DBException if there's an initialization problem
100: */
101: public ReverseLookupDomains() throws DBException {
102: super ();
103: } /* User() */
104:
105: /**
106: * Constructor
107: *
108: * @param myConnection database connection for transactions
109: * @throws DBException if there's an initialization problem
110: */
111: public ReverseLookupDomains(DBConnection myConnection)
112: throws DBException {
113: super (myConnection);
114: } /* User(String) */
115:
116: /**
117: * Use over (String) constructor. Initializes the object in the context
118: * of the user who's uid belongs to the parameter.
119: *
120: * @param uid the Uid of the user context
121: * @throws DBException if there's an initialization problem
122: */
123: public ReverseLookupDomains(int uid) throws DBException {
124: super (uid);
125: }
126:
127: /**
128: * For using DBObjects within Controllers. Initializes based upon the current
129: * user and the requested db. [Of course this can be modified later]
130: *
131: * @param request - The controller request handed to you by the framework.
132: * @throws DBException if there's an initialization problem
133: */
134: public ReverseLookupDomains(RequestContext request)
135: throws DBException {
136: super (request);
137: }
138:
139: /**
140: * This function populates the table with the current listing of ISO country codes
141: *
142: * @throws DBException if an error occurs while populating the table.
143: * @see com.jcorporate.expresso.core.dbobj.DBObject#populateDefaultValues
144: */
145: public synchronized void populateDefaultValues() throws DBException {
146: int i;
147: String countryCodes[][] = super .getCountryCodes();
148: int len = countryCodes.length;
149:
150: for (i = 0; i < len; i++) {
151: this .clear();
152: this .setField(FLD_DOMAINCODE, countryCodes[i][1]
153: .toLowerCase());
154:
155: if (!this .find()) {
156: setField(FLD_DESCRIPTION, countryCodes[i][0]);
157: this .add();
158: }
159: }
160:
161: String internetCodes[][] = this .getInternetCodes();
162: len = internetCodes.length;
163:
164: for (i = 0; i < len; i++) {
165: this .clear();
166: this .setField(FLD_DOMAINCODE, internetCodes[i][1]
167: .toLowerCase());
168:
169: if (!this .find()) {
170: setField(FLD_DESCRIPTION, internetCodes[i][0]);
171: this .add();
172: }
173: }
174: } /* populateDefaultValues() */
175:
176: /**
177: * Useful method for unit testing to make sure that everything got added during
178: * setup as expected.
179: *
180: * @return the length o
181: */
182: public int getExpectedDefaultPopulation() {
183: String internetCodes[][] = this .getInternetCodes();
184: return internetCodes.length
185: + super .getExpectedDefaultPopulation();
186: }
187:
188: /**
189: * @return Vector of ValidValue Value/Description pairs for ISO Country Codes
190: * @throws DBException If the values cannot be retrieved
191: */
192: public Vector getValues() throws DBException {
193: return getValuesDefault(FLD_DOMAINCODE, FLD_DESCRIPTION);
194: } /* getValues() */
195:
196: /**
197: * @return instantiated DBObject
198: * @throws DBException if an error occurs while instantiating the object
199: * @see com.jcorporate.expresso.core.dbobj.SecuredDBObject#getThisDBObj
200: */
201: public synchronized DBObject getThisDBObj() throws DBException {
202: return new ReverseLookupDomains();
203: } /* getThisDBObj() */
204:
205: /**
206: * Sets up the fields for use in this database
207: *
208: * @throws DBException if an error occurs while instantiating the object
209: */
210: protected void setupFields() throws DBException {
211: setTargetTable("REVERSEDOMAINS");
212: setDescription("Reverse Domain Lookup Descriptions");
213: setCharset("ISO-8859-1");
214: addField(FLD_DOMAINCODE, "varchar", 20, false, "Domain Code");
215: addField(FLD_DESCRIPTION, "varchar", 128, false,
216: "Domain Description");
217: addField(FLD_NOTES, "varchar", 128, true, "Misc. Notes");
218: setStringFilter(FLD_DOMAINCODE, "stripFilter");
219: setStringFilter(FLD_DESCRIPTION, "rawFilter");
220: addKey(FLD_DOMAINCODE);
221: setReadOnly(FLD_DOMAINCODE);
222: } /* setupFields() */
223:
224: protected synchronized String[][] getInternetCodes() {
225: synchronized (internetCodesLock) {
226: if (internetCodesRef == null
227: || internetCodesRef.get() == null) {
228: internetCodesRef = new SoftReference(new String[][] {
229: { "Commercial Company", "com" },
230: { "Educational Institution", "edu" },
231: { "Non-profit Organization", "org" },
232: { "Networking Company", "net" },
233: { "Old Internet Backbone", "arpa" },
234: { "Air Transportation Industry", "aero" },
235: { "Commercial Business", "biz" },
236: { "Cooperative Association", "coop" },
237: { "Information", "info" },
238: { "Museum", "museum" },
239: { "Individual", "name" },
240: { "US Government", "gov" },
241: { "US Military", "mil" },
242: { "International Treaty Organization", "int" },
243: { "Commercial Company", "cc" },
244: { "United Kingdom", "uk" } });
245:
246: }
247:
248: return (String[][]) internetCodesRef.get();
249: }
250: }
251:
252: private static final Object internetCodesLock = new Object();
253: private static Reference internetCodesRef = null;
254:
255: /**
256: * Use this function to lookup any domain names given the InetAddress
257: *
258: * @param ipAddress the address to check
259: * @return String: ex 'uk' or 'gov' or 'com'
260: * @throws DBException if an error occurs
261: */
262: public String getDomainId(String ipAddress) throws DBException {
263: try {
264: InetAddress addr = InetAddress.getByName(ipAddress);
265: String hostName = addr.getHostName();
266: String domain = hostName.substring(hostName
267: .lastIndexOf(".") + 1);
268: ReverseLookupDomains rld = new ReverseLookupDomains(this
269: .getRequestingUid());
270: rld.setDataContext(this .getDataContext());
271: rld.setField(FLD_DOMAINCODE, domain);
272:
273: if (!rld.find()) {
274: throw new DBException(
275: "Unable to find domain entry for domain="
276: + domain + " ipaddress= " + ipAddress
277: + " hostname= " + hostName);
278: } else {
279: return rld.getField(FLD_DOMAINCODE);
280: }
281: } catch (java.net.UnknownHostException uhe) {
282: throw new DBException(
283: "Unable to lookup host: " + ipAddress, uhe);
284: } catch (SecurityException se) {
285: throw new DBException(
286: "Unable to lookup host: "
287: + ipAddress
288: + ". You need to have 'socket.checkConnect' permissions enabled"
289: + " in your security manager", se);
290: }
291: }
292: }
|