[Javanetsim-cvs] javaNetSim/core/protocolsuite/tcp_ip DNS.java, 1.2, 1.3 DNS_Message.java, 1.2, 1.3
Status: Beta
Brought to you by:
darkkey
Update of /cvsroot/javanetsim/javaNetSim/core/protocolsuite/tcp_ip In directory fdv4jf1.ch3.sourceforge.com:/tmp/cvs-serv9668/core/protocolsuite/tcp_ip Modified Files: DNS.java DNS_Message.java ProtocolStack.java Telnet_server.java socketLayer.java Log Message: DNS works! Index: ProtocolStack.java =================================================================== RCS file: /cvsroot/javanetsim/javaNetSim/core/protocolsuite/tcp_ip/ProtocolStack.java,v retrieving revision 1.72 retrieving revision 1.73 diff -C2 -d -r1.72 -r1.73 *** ProtocolStack.java 13 Oct 2008 21:20:21 -0000 1.72 --- ProtocolStack.java 18 Oct 2008 19:55:31 -0000 1.73 *************** *** 338,341 **** --- 338,342 ---- System.out.println("ProtocolStack.java: SendPacket 1 " + e.toString()); + e.printStackTrace(); } Index: DNS_Message.java =================================================================== RCS file: /cvsroot/javanetsim/javaNetSim/core/protocolsuite/tcp_ip/DNS_Message.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** DNS_Message.java 6 Sep 2008 20:27:27 -0000 1.2 --- DNS_Message.java 18 Oct 2008 19:55:31 -0000 1.3 *************** *** 7,10 **** --- 7,13 ---- import java.util.Hashtable; + import java.util.Vector; + + //import javax.swing.RowSorter.SortKey; import sun.misc.Compare; *************** *** 18,38 **** public class DNS_Message { ! private static int Count = 65045; //header ! private String id; private String flags; //length = 16 - private String countOfQuery; - private String countOfRequest; - private String countOfAccess; - private String countOfAddons; //content ! private String querys; ! private String answers; ! private String answerSim; ! private String access; ! private String additional; ! private int queryType; public static final int A_QUERY_TYPE = 1; public static final int PTR_QUERY_TYPE = 12; public static final int HINFO_QUERY_TYPE = 13; --- 21,38 ---- public class DNS_Message { ! private static int Counter = 1; //header ! private int id; private String flags; //length = 16 //content ! private Vector<Query> queries; ! private Vector<Answer> answers; ! private Vector<Object> accesses; //for future realizations ! private Vector<Object> additionals; //for future realizations ! public static final int TTL_DEFAULT = 86400; // 86400s = 24h ! public static final int CLASS_IN = 1; //class of request = 1 public static final int A_QUERY_TYPE = 1; + public static final int CNAME_QUERY_TYPE = 5; public static final int PTR_QUERY_TYPE = 12; public static final int HINFO_QUERY_TYPE = 13; *************** *** 40,81 **** ! public DNS_Message(int QR, int opcode, int AA, int TC, int RD, int RA, int rcode, String query, String answer, String access, String addit) { //create DNS-message whith known simple parametres ! if (Count == 65535) ! Count = 0; ! Count++; ! //id = Count; ! id = IntToString(Count); //convert flags to 2-bytes string ! flags=IntToString((QR << 15)+(opcode << 11) + (AA << 10) + (TC << 9) + (RD << 8) + (RA << 7) + (rcode)); ! //count of Query in ver. 1.0 equals 1 ! countOfQuery = IntToString(1); ! //count of Query equals 0 or 1 ! if (QR==1) ! countOfRequest=IntToString(1); ! else ! countOfRequest=IntToString(0); ! //access and addtitional informations does not containt in package ! countOfAccess = IntToString(0); ! countOfAddons = IntToString(0); ! ! querys = ParseQuery(query); if ((QR==1) && (rcode != 3)) { ! answers = ParseAnswer(answer); ! answerSim = answer; } else { ! answers = IntToString(0); ! answerSim = ""; } //May be parse access and form like answers ! this.access = IntToString(0); ! //May be parse addit and form like answers ! this.additional = IntToString(0); } --- 40,73 ---- ! public DNS_Message(int new_id, int QR, int opcode, int AA, int TC, int RD, int RA, int rcode, Vector<Query> query, Vector<Answer> answer, Vector<Object> access, Vector<Object> addit) { //create DNS-message whith known simple parametres ! if(new_id==0){ ! if (Counter == 16777216) ! Counter = 0; ! Counter++; ! id = Counter; ! } ! else{ ! id = new_id; ! } //convert flags to 2-bytes string ! flags=IntToStr2((QR << 15)+(opcode << 11) + (AA << 10) + (TC << 9) + (RD << 8) + (RA << 7) + (rcode)); ! ! queries = query; if ((QR==1) && (rcode != 3)) { ! answers = answer; } else { ! answers = new Vector<Answer>(0); } //May be parse access and form like answers ! this.accesses = new Vector<Object>(0); ! //May be parse additional and form like answers ! this.additionals = new Vector<Object>(0); } *************** *** 84,261 **** //create object DNS-message with known header and data in string //parse input string and set fields of object ! String subStr; ! id = mess.substring(0, 2); flags = mess.substring(2, 4); ! countOfQuery = mess.substring(4, 6); ! countOfRequest = mess.substring(6, 8); ! countOfAccess = mess.substring(8, 10); ! countOfAddons = mess.substring(10, 12); ! int begIndex = 12; ! querys = StrToField(mess, begIndex); ! begIndex += querys.length(); ! try ! { ! answers = StrToField(mess, begIndex); ! begIndex += querys.length(); ! answers = answers.concat(mess.substring(begIndex, begIndex+6)); ! ! int k = Integer.valueOf(mess.codePointAt(begIndex+4)); ! k = (k << 8)+ Integer.valueOf(mess.codePointAt(begIndex+5)); ! answerSim = mess.substring(begIndex+6); ! answers = answers.concat(answerSim); ! if (queryType == MX_QUERY_TYPE) ! answerSim = MakeSimMXAnswer(answerSim); ! begIndex = begIndex+6+k; } ! catch(Exception e) ! { ! answers = new String(querys)+"0000"; ! char[] ch = new char[2]; ! ch[0]=ch[1]=0; ! answers = answers.concat(String.valueOf(ch)); } ! //additional = StrToField(mess, begIndex); } ! public String ToString() { ! String resStr = id.concat(flags).concat(countOfQuery).concat(countOfRequest).concat(countOfAccess).concat(countOfAddons); ! resStr = resStr.concat(querys).concat(answers);//.concat(access).concat(additional); return resStr; } ! public int GetRCode() { return (flags.codePointAt(1) & 15); } ! public String GetQuery() { ! //return Query and QType in String ! String hostNm = new String(); ! int i=0; ! int lenDomainNm = Integer.valueOf(querys.codePointAt(i)).intValue(); ! while(lenDomainNm !=0) ! { ! hostNm = hostNm.concat(querys.substring(i+1, i+lenDomainNm+1)); ! i += lenDomainNm+1; ! if (queryType == A_QUERY_TYPE || ! queryType == HINFO_QUERY_TYPE || ! queryType == MX_QUERY_TYPE) ! hostNm += "."; ! lenDomainNm = Integer.valueOf(querys.substring(i,i+1)).intValue(); } ! char[] qType = new char[1]; ! qType[0] = (char)querys.codePointAt(i+2); ! return (new String(qType) + hostNm); } ! public String GetAnswer() { ! return answerSim; } ! public int GetQueryType() { ! return queryType; } ! private String ParseQuery(String query) ! {//only for 0ne domain ! String resQuery = new String(""); ! String[] fields = query.split(":"); //dot is separator ! if (Integer.toString(A_QUERY_TYPE).equals(fields[1]) || ! Integer.toString(HINFO_QUERY_TYPE).equals(fields[1]) || ! Integer.toString(MX_QUERY_TYPE).equals(fields[1])) //A-type of query ! { ! queryType = Integer.valueOf(fields[1]).intValue(); ! String[] domains = fields[0].split("\\u002E"); ! for (int i = 0; i < domains.length; i++) ! { ! char[] len = new char[1]; ! len[0] = (char)domains[i].length(); ! resQuery = resQuery.concat(new String(len)); ! //resQuery = resQuery.concat(String.valueOf((char)domains[i].length())); ! resQuery = resQuery.concat(domains[i]); } - resQuery = resQuery.concat("0"); } ! else if (Integer.toString(PTR_QUERY_TYPE).equals(fields[1])) { ! char[] len = new char[1]; ! len[0] = (char)fields[0].length(); ! resQuery = resQuery.concat(new String(len)+fields[0]+"0"); } ! // resQuery = StrToBinaryStr(resQuery, 8); ! //resQuery = AddZero(resQuery, resQuery.length() + (4-(resQuery.length()%4)%4), 1); ! resQuery = resQuery.concat(IntToString(Integer.decode(fields[1]))); ! resQuery = resQuery.concat(IntToString(1));//class of request = 1 ! return resQuery; } /** ! * This method return string like DNS-format with answer for query. ! * @param value to convert ! * @author Gek ! * @version v0.01 ! */ ! private String ParseAnswer(String answer) { ! String resAnswer = new String(querys); ! char[] TTL = new char[4]; ! TTL[0] = TTL[3] = 0; ! TTL[1]=2; ! TTL[2]=163; ! resAnswer += String.valueOf(TTL); ! if (queryType == MX_QUERY_TYPE) ! { ! String[] servs = answer.split(";"); ! answer= ""; ! for (int i = 0; i<servs.length; i++) ! { ! String[] parts = servs[i].split(":"); ! String priority; ! String server; ! if (parts.length == 2) ! { ! priority = IntToString(Integer.valueOf(parts[0].trim()).intValue()); ! server = parts[1]; ! } ! else ! { ! priority = IntToString(0); ! server = parts[0]; ! } ! String len = IntToString(server.length()); ! answer += priority + len + server; ! } ! } ! resAnswer += IntToString(answer.length()); ! resAnswer += answer; ! return resAnswer; } ! //pos: ! // 0 - to begin ! // else - to end ! /* ! private String AddZero(String str, int newLength, int pos) { ! //add to begin of str '0', while length(str) is not newLength ! //or cut the tail ! while(str.length()<newLength) ! { ! if (pos==0) ! str = "0".concat(str); ! else ! str = str.concat("0"); } ! if (str.length()>newLength) ! str = str.substring(0, newLength); ! return str; } - * */ /** --- 76,286 ---- //create object DNS-message with known header and data in string //parse input string and set fields of object ! id = Str2ToInt(mess.substring(0, 2)); flags = mess.substring(2, 4); ! int countOfQuery = Str2ToInt(mess.substring(4, 6)); ! int countOfAnswers = Str2ToInt(mess.substring(6, 8)); ! // int countOfAccesses = Str2ToInt(mess.substring(8, 10)); ! // int countOfAddons = Str2ToInt(mess.substring(10, 12)); ! ! queries = new Vector<Query>(1); ! answers = new Vector<Answer>(0); ! accesses = new Vector<Object>(0); ! additionals = new Vector<Object>(0); ! int begin = 12; ! for(int i=0; i<countOfQuery; i++){ ! Query qu = parseQuery(mess, begin); ! begin += qu.length; ! queries.add(qu); } ! for(int i=0; i<countOfAnswers; i++){ ! Answer ans = parseAnswer(mess, begin); ! begin += ans.length; ! answers.add(ans); } ! // for(int i=0; i<countOfAccesses; i++){ ! // Access acc = parseAccess(mess, begin); ! // begin += acc.length; ! // accesses.add(ans); ! // } ! // for(int i=0; i<countOfAddons; i++){ ! // Addon add = parseAddon(mess, begin); ! // begin += add.length; ! // additionals.add(add); ! // } } ! public String toString() { ! String resStr = IntToStr2(id) + flags + IntToStr2(queries.size()) + IntToStr2(answers.size()) + IntToStr2(accesses.size()) + IntToStr2(additionals.size()); ! resStr += createQueries() + createAnswers(); // + creareAccess() + createAdditional(); return resStr; } ! public int getID() ! { ! return id; ! } ! ! public int getRCode() { return (flags.codePointAt(1) & 15); } ! public Vector<Query> getQuery() { ! return queries; ! } ! ! public Vector<Answer> getAnswer() ! { ! return answers; ! } ! ! private String createQueries() ! { ! String resQuery = ""; ! for(int i=0; i<queries.size(); i++){ ! resQuery += createQuery(queries.get(i)); } ! return resQuery; } ! private String createAnswers() { ! String resAnswer = ""; ! for (int i = 0; i<answers.size(); i++){ ! resAnswer += createAnswer(answers.get(i)); ! } ! return resAnswer; } ! private String createQuery(Query qu) { ! String resQuery = createDomainName(qu.name); ! resQuery += IntToStr2(qu.type); ! resQuery += IntToStr2(CLASS_IN); ! return resQuery; } ! private String createAnswer(Answer ans) ! { ! String resAnswer = createQuery(ans); ! resAnswer += IntToStr4(TTL_DEFAULT); ! switch(ans.type){ ! case A_QUERY_TYPE: { ! String[] ip = ans.resource.split("\\."); ! resAnswer += IntToStr2(4) + (char)Integer.parseInt(ip[0]) ! + (char)Integer.parseInt(ip[1]) ! + (char)Integer.parseInt(ip[2]) ! + (char)Integer.parseInt(ip[3]); ! break; ! } ! case PTR_QUERY_TYPE: ! case CNAME_QUERY_TYPE: { ! String server = createDomainName(ans.resource); ! String len = IntToStr2(server.length()); ! resAnswer += len + server; ! break; ! } ! case HINFO_QUERY_TYPE: { ! String hinfo = ans.resource.substring(0,Math.min(ans.resource.length(), 255)); ! String server = (char)hinfo.length() + hinfo; ! String len = IntToStr2(server.length()); ! resAnswer += len + server; ! break; ! } ! case MX_QUERY_TYPE: { ! String priority = IntToStr2(ans.priority); ! String server = createDomainName(ans.resource); ! String len = IntToStr2(server.length()+2); ! resAnswer += len + priority + server; ! break; } } ! return resAnswer; ! } ! ! public String createDomainName(String in){ ! String out = ""; ! String[] domains = in.split("\\u002E"); // u002E aka .(dot) ! for (int i = 0; i < domains.length; i++) { ! String dname = domains[i].substring(0,Math.min(domains[i].length(),63)); // max length of domain is 63 symbols ! out += (char)dname.length() + dname; } ! out += '\u0000'; ! return out; ! } ! ! public DName parseDomainName(String str, int begin){ ! int saveBegin = begin; ! String qName = new String(); ! int k = str.codePointAt(begin); ! while(k!=0) ! { ! int oldBegin = begin+1; ! begin += k+1; ! k = str.codePointAt(begin); ! qName += str.substring(oldBegin, begin) + (k==0?"":"."); ! } ! return new DName(qName,begin+1-saveBegin); } /** ! * This method extract from input string the queries string ! */ ! private Query parseQuery(String str, int begin) { ! int saveBegin = begin; ! DName dname = parseDomainName(str, begin); ! begin += dname.length; ! Integer qType = new Integer(Str2ToInt(str.substring(begin,begin+2))); ! return new Query(dname.name,qType,begin+4-saveBegin); } ! /** ! * This method extract from input string the answers string ! */ ! private Answer parseAnswer(String str, int begin) { ! int saveBegin = begin; ! Query qu = parseQuery(str, begin); ! begin += qu.length; ! int ttl = Str4ToInt(str.substring(begin,begin+4)); ! begin += 4; ! int len = Str2ToInt(str.substring(begin,begin+2)); ! begin += 2; ! String aRes = ""; ! int priority = 0; ! switch(qu.type){ ! case A_QUERY_TYPE:{ ! if(len==4){ ! aRes = Integer.toString(str.codePointAt(begin))+"."+Integer.toString(str.codePointAt(begin+1))+"."+Integer.toString(str.codePointAt(begin+2))+"."+Integer.toString(str.codePointAt(begin+3)); ! } ! break; ! } ! case PTR_QUERY_TYPE: ! case CNAME_QUERY_TYPE:{ ! DName dname = parseDomainName(str, begin); ! aRes = dname.name; ! break; ! } ! case HINFO_QUERY_TYPE:{ ! int hilen = str.codePointAt(begin); ! aRes = str.substring(begin+1,begin+hilen+1); ! break; ! } ! case MX_QUERY_TYPE:{ ! priority = Str2ToInt(str.substring(begin,begin+2)); ! DName dname = parseDomainName(str, begin+2); ! aRes = dname.name; ! break; ! } } ! begin += len; ! return new Answer(qu.name,qu.type,ttl,aRes,priority,begin-saveBegin); } /** *************** *** 265,337 **** * @version v0.01 */ ! private String IntToString(int value) { char[] ch = new char[2]; ! ch[0] = (char)((value & 65280)>>8); ! ch[1] = (char)(value & 255); return String.copyValueOf(ch); } ! /* ! private String StrToBinaryStr(String str, int offset) { ! char[] strCh = str.toCharArray(); ! String resStr = new String(""); ! for (int i = 0; i < strCh.length; i++) ! { ! char c = strCh[i]; ! resStr = resStr.concat(AddZero(Integer.toBinaryString((int)c),offset,0)); ! } ! return resStr; } - */ ! /** ! * This method extract from input string the querys-, answers- or additional- string ! */ ! private String StrToField(String str, int begIndex) ! { ! int saveBeg = begIndex; ! int endIndex = begIndex + 1; ! String resStr = new String(); ! resStr = resStr.concat(str.substring(begIndex,endIndex)); ! int k = resStr.codePointAt(0); ! while(k!=0) ! { ! begIndex += k+1; ! resStr = resStr.concat(str.substring(endIndex, begIndex)); ! endIndex = begIndex +1; ! k = Integer.valueOf(str.substring(begIndex,endIndex)).intValue(); ! resStr = resStr.concat(Integer.toString(k)); ! } ! //resStr = AddZero(resStr, resStr.length() + (4-(resStr.length()%4)%4), 1); ! begIndex = saveBeg+resStr.length(); ! resStr = resStr.concat(str.substring(begIndex, begIndex+4)); ! queryType = Integer.valueOf(str.substring(begIndex,begIndex+2).codePointAt(1)); ! return resStr; } ! /* ! * This method make simple answer string for MX-query from string in byte-code ! * ! */ ! private String MakeSimMXAnswer(String str) ! { ! int k =0; ! String resStr = new String(""); ! Hashtable ht = new Hashtable(); ! while (k < str.length()) ! { ! int priority = (str.codePointAt(k) << 8) + str.codePointAt(k+1); ! k+=2; ! int len = (str.codePointAt(k) << 8) + str.codePointAt(k+1); ! k+=2; ! String serv = str.substring(k, k+len); ! ht.put(priority, serv); ! resStr += Integer.toString(priority)+":"+serv+";"; ! k+=len; ! } ! return resStr.substring(0, resStr.length()-2); } }; --- 290,386 ---- * @version v0.01 */ ! private String IntToStr2(int value) { char[] ch = new char[2]; ! ch[0] = (char)((value>>8) & 0xFF); ! ch[1] = (char)(value & 0xFF); return String.copyValueOf(ch); + } + + private int Str2ToInt(String value) + { + return (value.codePointAt(0)<<8)+value.codePointAt(1); } + + private String IntToStr4(int value) + { + char[] ch = new char[4]; + ch[0] = (char)((value>>24) & 0xFF); + ch[1] = (char)((value>>16) & 0xFF); + ch[2] = (char)((value>>8) & 0xFF); + ch[3] = (char)(value & 0xFF); + return String.copyValueOf(ch); + } ! private int Str4ToInt(String value) { ! return (((((value.codePointAt(0)<<8)+value.codePointAt(1))<<8)+value.codePointAt(2))<<8)+value.codePointAt(3); } + static public int getTypeInt(String t){ + if(t.equalsIgnoreCase("a")){ + return A_QUERY_TYPE; + } + else if(t.equalsIgnoreCase("ptr")){ + return PTR_QUERY_TYPE; + } + else if(t.equalsIgnoreCase("cname")){ + return CNAME_QUERY_TYPE; + } + else if(t.equalsIgnoreCase("hinfo")){ + return HINFO_QUERY_TYPE; + } + else if(t.equalsIgnoreCase("mx")){ + return MX_QUERY_TYPE; + } + return 0; + } + + static public String getTypeString(int t){ + if(t == A_QUERY_TYPE){ + return "A"; + } + else if(t == PTR_QUERY_TYPE){ + return "PTR"; + } + else if(t == CNAME_QUERY_TYPE){ + return "CNAME"; + } + else if(t == HINFO_QUERY_TYPE){ + return "HINFO"; + } + else if(t == MX_QUERY_TYPE){ + return "MX"; + } + return ""; + } ! static public class DName { ! public String name; ! public int length; ! public DName(String m_name, int m_length){ ! name = m_name; ! length = m_length; ! } } ! static public class Query extends DName{ ! public int type; ! public Query(String m_name, int m_type, int m_length){ ! super(m_name, m_length); ! type = m_type; ! } ! } ! ! static public class Answer extends Query { ! public int ttl; ! public String resource; ! public int priority; //MX only ! public Answer(String m_name, int m_type, int m_ttl, String m_resource, int m_priority, int m_length){ ! super(m_name, m_type, m_length); ! ttl = m_ttl; ! resource = m_resource; ! priority = m_priority; ! } } }; Index: socketLayer.java =================================================================== RCS file: /cvsroot/javanetsim/javaNetSim/core/protocolsuite/tcp_ip/socketLayer.java,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** socketLayer.java 13 Oct 2008 22:52:07 -0000 1.13 --- socketLayer.java 18 Oct 2008 19:55:31 -0000 1.14 *************** *** 17,21 **** public class socketLayer { ProtocolStack mParentStack; ! private Vector sockTable = new Vector(); int lastSock; --- 17,21 ---- public class socketLayer { ProtocolStack mParentStack; ! private Hashtable<Integer,jnSocket> sockTable = new Hashtable<Integer,jnSocket>(); int lastSock; *************** *** 28,32 **** public int socket(short type, Application app){ ! sockTable.add(new jnSocket(lastSock, app, type)); lastSock++; return (lastSock - 1); --- 28,32 ---- public int socket(short type, Application app){ ! sockTable.put(lastSock,new jnSocket(lastSock, app, type)); lastSock++; return (lastSock - 1); *************** *** 177,181 **** jnsock.src_port = 0; jnsock.src_IP = ""; ! //sockTable.remove(sock); } } --- 177,181 ---- jnsock.src_port = 0; jnsock.src_IP = ""; ! sockTable.remove(sock); } } Index: Telnet_server.java =================================================================== RCS file: /cvsroot/javanetsim/javaNetSim/core/protocolsuite/tcp_ip/Telnet_server.java,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -d -r1.23 -r1.24 *** Telnet_server.java 26 Sep 2008 17:53:49 -0000 1.23 --- Telnet_server.java 18 Oct 2008 19:55:31 -0000 1.24 *************** *** 24,27 **** --- 24,30 ---- public class Telnet_server extends Application{ + private String login = "root"; + private String def_pass = "javanetsim"; + public class TSession{ public String user; *************** *** 36,41 **** // private boolean isprompt=true; private boolean isnewpass=false; - private String password = "123"; - private String login = "root"; private String temp = ""; public Hashtable connections = new Hashtable(); --- 39,42 ---- *************** *** 48,51 **** --- 49,53 ---- ispass=false; appSock = mParentStack.SL().socket(jnSocket.TCP_socket, this); + mDevice.addUser(login,def_pass); } *************** *** 228,232 **** else { if(temp.compareTo(cmdline)==0) { ! password = temp; outData += "\r\n" + runcmd(""); } --- 230,234 ---- else { if(temp.compareTo(cmdline)==0) { ! mDevice.addUser(login,temp); outData += "\r\n" + runcmd(""); } *************** *** 443,456 **** public void setPassword(String s) { ! password = s; } public String getPassword() { ! return password; } private boolean isAuth(String user, String pass){ boolean auth = false; ! if((user.equals(login) && pass.equals(password)) || pass.equals(mDevice.getUserPassword(user))){ auth = true; } --- 445,458 ---- public void setPassword(String s) { ! mDevice.addUser(login, s); } public String getPassword() { ! return mDevice.getUserPassword(login); } private boolean isAuth(String user, String pass){ boolean auth = false; ! if(pass.equals(mDevice.getUserPassword(user))){ auth = true; } Index: DNS.java =================================================================== RCS file: /cvsroot/javanetsim/javaNetSim/core/protocolsuite/tcp_ip/DNS.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** DNS.java 26 Sep 2008 17:53:49 -0000 1.2 --- DNS.java 18 Oct 2008 19:55:31 -0000 1.3 *************** *** 8,11 **** --- 8,12 ---- package core.protocolsuite.tcp_ip; + import core.Pair; import core.TransportLayerException; import core.InvalidNetworkLayerDeviceException; *************** *** 16,19 **** --- 17,22 ---- //import java.util.Hashtable; import java.util.Hashtable; + import java.util.LinkedList; + import java.util.Vector; /** *************** *** 25,31 **** long utc1; ! public int recieved; ! private Hashtable hs; ! public Boolean listening; /** Creates a new instance of DNS */ --- 28,47 ---- long utc1; ! public int received; ! public Hashtable<String,Vector<String>> records_a = new Hashtable<String,Vector<String>>(); ! public Hashtable<String,Vector<String>> records_ptr = new Hashtable<String,Vector<String>>(); ! public Hashtable<String,Vector<String>> records_cname = new Hashtable<String,Vector<String>>(); ! public Hashtable<String,Vector<Pair>> records_mx = new Hashtable<String,Vector<Pair>>(); // pair(name,priority) ! public Hashtable<String,String> records_hinfo = new Hashtable<String,String>(); ! public String DomainName = ""; ! public String PrimaryNameServer = ""; ! public String MailboxResponsiblePerson = ""; ! public int RefreshTime = 86400; ! public int RefreshRetryTime = 3600; ! public int AuthorityExpireTime = 1209600; ! public int MinimumTTLZoneInfo = 86400; ! public boolean listening = false; ! public Hashtable<Integer,DNS_Message> receivedMessages = new Hashtable<Integer,DNS_Message>(); ! private int last_sent_id = 0; /** Creates a new instance of DNS */ *************** *** 35,39 **** appSock = mParentStack.SL().socket(jnSocket.UDP_socket, this); int fake = 0; - hs = new Hashtable(); } --- 51,54 ---- *************** *** 75,78 **** --- 90,94 ---- }else{ printLayerInfo("DNS application", "DNS server closed socket."); + listening = false; } mParentStack.SL().close(appSock); *************** *** 85,88 **** --- 101,105 ---- }else{ printLayerInfo("DNS application", "DNS server freed socket."); + listening = false; } mParentStack.SL().free(appSock); *************** *** 134,143 **** */ ! public void SendMessage(String host, int port, String mess, int qType) throws CommunicationException, LowLinkException, InvalidNetworkLayerDeviceException, TransportLayerException { if (Connect (host, port)) { SendData(mess+":"+Integer.toString(qType)); } } --- 151,162 ---- */ ! public int SendMessage(String host, int port, String mess, int qType) throws CommunicationException, LowLinkException, InvalidNetworkLayerDeviceException, TransportLayerException { if (Connect (host, port)) { SendData(mess+":"+Integer.toString(qType)); + return last_sent_id; } + return 0; } *************** *** 147,152 **** String sdHost = mParentStack.SL().get_socket(sock).dst_IP; int sdPort = mParentStack.SL().get_socket(sock).dst_port; ! DNS_Message dnsMes = new DNS_Message(0,0,1, 0, 1, 0, 0, mess, "", "", ""); ! mParentStack.SL().writeTo(sock, dnsMes.ToString(), sdHost, sdPort); //processing the protocol doings. --- 166,175 ---- String sdHost = mParentStack.SL().get_socket(sock).dst_IP; int sdPort = mParentStack.SL().get_socket(sock).dst_port; ! Vector<DNS_Message.Query> vmess = new Vector<DNS_Message.Query>(1); ! String smess[] = mess.split(":"); ! vmess.add(new DNS_Message.Query(smess[0],Integer.parseInt(smess[1]),0)); ! DNS_Message dnsMes = new DNS_Message(0, 0, 0, 1, 0, 1, 0, 0, vmess, null, null, null); ! last_sent_id = dnsMes.getID(); ! mParentStack.SL().writeTo(sock, dnsMes.toString(), sdHost, sdPort); //processing the protocol doings. *************** *** 158,166 **** String sdHost = mParentStack.SL().get_socket(sock).dst_IP; int sdPort = mParentStack.SL().get_socket(sock).dst_port; ! mParentStack.SL().writeTo(sock,dnsMes.ToString(),sdHost, sdPort); } /** ! * This method recieves DNS data from the other side. * @param data to recv * @author Gek --- 181,189 ---- String sdHost = mParentStack.SL().get_socket(sock).dst_IP; int sdPort = mParentStack.SL().get_socket(sock).dst_port; ! mParentStack.SL().writeTo(sock,dnsMes.toString(),sdHost, sdPort); } /** ! * This method receives DNS data from the other side. * @param data to recv * @author Gek *************** *** 168,175 **** */ public void RecvData(int sock, String Data) throws LowLinkException, TransportLayerException { ! recieved++; //processing the protocol doings. if(appType == 0){ ! //client processing recieve request // printing some ... LayerInfo protInfo = new LayerInfo(getClass().getName()); --- 191,198 ---- */ public void RecvData(int sock, String Data) throws LowLinkException, TransportLayerException { ! received++; //processing the protocol doings. if(appType == 0){ ! //client processing receive request // printing some ... LayerInfo protInfo = new LayerInfo(getClass().getName()); *************** *** 177,201 **** protInfo.setDataType("DNS Protocol Data"); protInfo.setLayer("Application "); ! //protInfo.setDescription("Recieving DNS message from server."); // Simulation.addLayerInfo(protInfo); DNS_Message dnsMsg = new DNS_Message(Data); ! if (dnsMsg.GetRCode()==3) { ! protInfo.setDescription("No answer records for hostname (ip-address) '"+dnsMsg.GetQuery().substring(1)+"'."); } ! else { ! String query = dnsMsg.GetQuery(); ! String answer = dnsMsg.GetAnswer(); ! int qType = dnsMsg.GetQueryType(); ! if (qType == DNS_Message.A_QUERY_TYPE) ! protInfo.setDescription("Host '"+query.substring(1, query.length()-1) + "' has IP-address '" + answer + "'."); ! else if (qType == DNS_Message.PTR_QUERY_TYPE) ! protInfo.setDescription("IP-address '"+query.substring(1) + "' conform to host '" + answer.substring(0, answer.length()-1) + "'."); ! else if (qType == DNS_Message.HINFO_QUERY_TYPE) ! protInfo.setDescription("HINFO section for host "+query.substring(1, query.length()-1)+": '"+ answer + "'."); ! else if (qType == DNS_Message.MX_QUERY_TYPE) ! protInfo.setDescription("For '"+query.substring(1, query.length()-1)+"' mail exchanger(s) = " + answer + "."); } Simulation.addLayerInfo(protInfo); //protInfo.setDescription(Data); --- 200,231 ---- protInfo.setDataType("DNS Protocol Data"); protInfo.setLayer("Application "); ! //protInfo.setDescription("Receiving DNS message from server."); // Simulation.addLayerInfo(protInfo); DNS_Message dnsMsg = new DNS_Message(Data); ! String desc = ""; ! if (dnsMsg.getRCode()==3) { ! desc = "No "+DNS_Message.getTypeString(dnsMsg.getQuery().get(0).type)+" record found for '"+dnsMsg.getQuery().get(0).name+"'."; } ! else if(dnsMsg.getRCode()==0) { ! receivedMessages.put(dnsMsg.getID(), dnsMsg); ! // Vector<DNS_Message.Query> query = dnsMsg.getQuery(); ! Vector<DNS_Message.Answer> answer = dnsMsg.getAnswer(); ! for(int i=0; i<answer.size(); i++){ ! DNS_Message.Answer ans = answer.get(i); ! desc += (i==0?"":"; ")+ans.name+" "+DNS_Message.getTypeString(ans.type)+" "+ans.resource; ! } ! // int qType = dnsMsg.getQueryType(); ! // if (qType == DNS_Message.A_QUERY_TYPE) ! // protInfo.setDescription("Host '"+query.substring(1, query.length()-1) + "' has IP-address '" + answer + "'."); ! // else if (qType == DNS_Message.PTR_QUERY_TYPE) ! // protInfo.setDescription("IP-address '"+query.substring(1) + "' conform to host '" + answer.substring(0, answer.length()-1) + "'."); ! // else if (qType == DNS_Message.HINFO_QUERY_TYPE) ! // protInfo.setDescription("HINFO section for host "+query.substring(1, query.length()-1)+": '"+ answer + "'."); ! // else if (qType == DNS_Message.MX_QUERY_TYPE) ! // protInfo.setDescription("For '"+query.substring(1, query.length()-1)+"' mail exchanger(s) = " + answer + "."); } + protInfo.setDescription(desc); Simulation.addLayerInfo(protInfo); //protInfo.setDescription(Data); *************** *** 203,207 **** }else{ ! //server processing recieve try{ String sdHost = mParentStack.SL().get_socket(sock).dst_IP; --- 233,237 ---- }else{ ! //server processing receive try{ String sdHost = mParentStack.SL().get_socket(sock).dst_IP; *************** *** 212,248 **** protInfo.setDataType("Echo Protocol Data"); protInfo.setLayer("Application "); ! protInfo.setDescription("Recieving DNS message '" + Data + "' from client " + sdHost + ":" + sdPort + "."); Simulation.addLayerInfo(protInfo); DNS_Message inputMes = new DNS_Message(Data); ! DNS_Message answerMes; //parse query and search in HashTable ! String query = inputMes.GetQuery(); ! String qType = Integer.toString(query.codePointAt(0)); ! query = query.substring(1); ! String[] answer = (String[])hs.get(query); ! String answerStr=null; ! if (answer!=null && !answer.equals("")) ! { ! if (qType.equals("1") || qType.equals("12")) ! answerStr = answer[0].trim(); ! else if (qType.equals("13")) ! answerStr = answer[1].trim(); ! else if (qType.equals("15")) ! answerStr = answer[2].trim(); ! else ! answerStr = ""; } ! if (answerStr!=null && !answerStr.equals("")) ! answerMes = new DNS_Message(1,0,1,0,1,0,0,query.concat(":"+qType),answerStr,"",""); else ! answerMes = new DNS_Message(1,0,1,0,1,0,3,query.concat(":"+qType),"","",""); LayerInfo protInfo2 = new LayerInfo(getClass().getName()); protInfo2.setObjectName(mParentStack.getParentNodeName()); protInfo2.setDataType("DNS Protocol Data"); protInfo2.setLayer("Application "); ! protInfo2.setDescription("Sending DNS message '" + answerMes.ToString() + "' to client."); Simulation.addLayerInfo(protInfo2); ! SendData(appSock,answerMes); /*LayerInfo protInfo3 = new LayerInfo(getClass().getName()); --- 242,341 ---- protInfo.setDataType("Echo Protocol Data"); protInfo.setLayer("Application "); ! protInfo.setDescription("Receiving DNS message '" + Data + "' from client " + sdHost + ":" + sdPort + "."); Simulation.addLayerInfo(protInfo); DNS_Message inputMes = new DNS_Message(Data); ! DNS_Message answerPack; //parse query and search in HashTable ! Vector<DNS_Message.Query> query = inputMes.getQuery(); ! LinkedList<DNS_Message.Query> qus = new LinkedList<DNS_Message.Query>(); ! for(int i=0; i<query.size(); i++){ ! qus.add(query.get(i)); } ! Vector<DNS_Message.Answer> answer = new Vector<DNS_Message.Answer>(0); ! while(qus.size()>0){ ! DNS_Message.Query qu = qus.getFirst(); ! qus.removeFirst(); ! switch(qu.type){ ! case DNS_Message.A_QUERY_TYPE: { ! if(records_a.containsKey(qu.name)){ ! Vector<String> ans = records_a.get(qu.name); ! for(int i=0; i<ans.size(); i++) ! answer.add(new DNS_Message.Answer(qu.name, qu.type, DNS_Message.TTL_DEFAULT, ans.get(i),0,0)); ! } ! if(records_cname.containsKey(qu.name)){ ! Vector<String> ans = records_cname.get(qu.name); ! for(int i=0; i<ans.size(); i++){ ! answer.add(new DNS_Message.Answer(qu.name, DNS_Message.CNAME_QUERY_TYPE, DNS_Message.TTL_DEFAULT, ans.get(i),0,0)); ! qus.add(0, new DNS_Message.Query(ans.get(i),DNS_Message.A_QUERY_TYPE,0)); ! } ! } ! break; ! } ! case DNS_Message.CNAME_QUERY_TYPE: { ! if(records_cname.containsKey(qu.name)){ ! Vector<String> ans = records_cname.get(qu.name); ! for(int i=0; i<ans.size(); i++){ ! answer.add(new DNS_Message.Answer(qu.name, qu.type, DNS_Message.TTL_DEFAULT, ans.get(i),0,0)); ! qus.add(0, new DNS_Message.Query(ans.get(i),DNS_Message.CNAME_QUERY_TYPE,0)); ! } ! } ! break; ! } ! case DNS_Message.PTR_QUERY_TYPE: { ! if(records_ptr.containsKey(qu.name)){ ! Vector<String> ans = records_ptr.get(qu.name); ! for(int i=0; i<ans.size(); i++) ! answer.add(new DNS_Message.Answer(qu.name, qu.type, DNS_Message.TTL_DEFAULT, ans.get(i),0,0)); ! } ! break; ! } ! case DNS_Message.HINFO_QUERY_TYPE: { ! if(records_hinfo.containsKey(qu.name)){ ! answer.add(new DNS_Message.Answer(qu.name, qu.type, DNS_Message.TTL_DEFAULT, records_hinfo.get(qu.name),0,0)); ! } ! if(records_cname.containsKey(qu.name)){ ! Vector<String> ans = records_cname.get(qu.name); ! for(int i=0; i<ans.size(); i++){ ! answer.add(new DNS_Message.Answer(qu.name, DNS_Message.CNAME_QUERY_TYPE, DNS_Message.TTL_DEFAULT, ans.get(i),0,0)); ! qus.add(0, new DNS_Message.Query(ans.get(i),DNS_Message.A_QUERY_TYPE,0)); ! } ! } ! break; ! } ! case DNS_Message.MX_QUERY_TYPE: { ! if(records_mx.containsKey(qu.name)){ ! Vector<Pair> ans = records_mx.get(qu.name); ! for(int i=0; i<ans.size(); i++) ! answer.add(new DNS_Message.Answer(qu.name, qu.type, DNS_Message.TTL_DEFAULT, (String)ans.get(i).getFirst(),((Integer)ans.get(i).getSecond()).intValue(),0)); ! } ! if(records_cname.containsKey(qu.name)){ ! Vector<String> ans = records_cname.get(qu.name); ! for(int i=0; i<ans.size(); i++){ ! answer.add(new DNS_Message.Answer(qu.name, DNS_Message.CNAME_QUERY_TYPE, DNS_Message.TTL_DEFAULT, ans.get(i),0,0)); ! qus.add(0, new DNS_Message.Query(ans.get(i),DNS_Message.A_QUERY_TYPE,0)); ! } ! } ! break; ! } ! } ! } ! if (answer.size()>0) ! answerPack = new DNS_Message(inputMes.getID(), 1,0,1,0,1,0,0,query,answer,null,null); else ! answerPack = new DNS_Message(inputMes.getID(), 1,0,1,0,1,0,3,query,answer,null,null); ! ! String answerMes = ""; ! for(int i=0; i<answer.size(); i++){ ! DNS_Message.Answer ans = answer.get(i); ! answerMes += (i==0?"":"; ")+ans.name+" "+DNS_Message.getTypeString(ans.type)+" "+ans.resource; ! } LayerInfo protInfo2 = new LayerInfo(getClass().getName()); protInfo2.setObjectName(mParentStack.getParentNodeName()); protInfo2.setDataType("DNS Protocol Data"); protInfo2.setLayer("Application "); ! protInfo2.setDescription("Sending DNS message '" + answerMes + "' to client."); Simulation.addLayerInfo(protInfo2); ! SendData(appSock,answerPack); /*LayerInfo protInfo3 = new LayerInfo(getClass().getName()); *************** *** 256,274 **** //Listen(); }catch(Exception e){ ! System.out.println(e.toString()); ! ///*TODO*: here to catch } } } ! public void SetRespondTable(Hashtable ht) ! { ! hs = ht; } ! public Hashtable GetRespondTable() ! { ! return hs; } } --- 349,552 ---- //Listen(); }catch(Exception e){ ! e.printStackTrace(); } } } ! public void addRecord(String dname, String value, int type){ ! switch(type){ ! case DNS_Message.A_QUERY_TYPE: { ! if(records_a.containsKey(dname)){ ! Vector<String> ans = records_a.get(dname); ! boolean found = false; ! for(int i=0; i<ans.size() && !found; i++){ ! found = ans.get(i).equalsIgnoreCase(value); ! } ! if(!found){ ! ans.add(value); ! } ! } ! else{ ! Vector<String> ans = new Vector<String>(1); ! ans.add(value); ! records_a.put(dname, ans); ! } ! break; ! } ! case DNS_Message.CNAME_QUERY_TYPE: { ! if(records_cname.containsKey(dname)){ ! Vector<String> ans = records_cname.get(dname); ! boolean found = false; ! for(int i=0; i<ans.size() && !found; i++){ ! found = ans.get(i).equalsIgnoreCase(value); ! } ! if(!found){ ! ans.add(value); ! } ! } ! else{ ! Vector<String> ans = new Vector<String>(1); ! ans.add(value); ! records_cname.put(dname, ans); ! } ! break; ! } ! case DNS_Message.PTR_QUERY_TYPE: { ! if(records_ptr.containsKey(dname)){ ! Vector<String> ans = records_ptr.get(dname); ! boolean found = false; ! for(int i=0; i<ans.size() && !found; i++){ ! found = ans.get(i).equalsIgnoreCase(value); ! } ! if(!found){ ! ans.add(value); ! } ! } ! else{ ! Vector<String> ans = new Vector<String>(1); ! ans.add(value); ! records_ptr.put(dname, ans); ! } ! break; ! } ! case DNS_Message.HINFO_QUERY_TYPE: { ! records_hinfo.put(dname, value); ! break; ! } ! case DNS_Message.MX_QUERY_TYPE: { ! String[] mxvalue = value.split(":"); ! if(records_mx.containsKey(dname)){ ! Vector<Pair> ans = records_mx.get(dname); ! boolean found = false; ! int i; ! for(i=0; i<ans.size() && !found; i++){ ! found = ((String)ans.get(i).getFirst()).equalsIgnoreCase(mxvalue[0]); ! } ! if(found){ ! ans.set(i, new Pair(mxvalue[0],Integer.valueOf(mxvalue[1]))); ! } ! else{ ! ans.add(new Pair(mxvalue[0],Integer.valueOf(mxvalue[1]))); ! } ! } ! else{ ! Vector<Pair> ans = new Vector<Pair>(1); ! ans.add(new Pair(mxvalue[0],Integer.valueOf(mxvalue[1]))); ! records_mx.put(dname, ans); ! } ! break; ! } ! } } ! public boolean removeRecord(String dname, String value, int type){ ! boolean result = false; ! switch(type){ ! case DNS_Message.A_QUERY_TYPE: { ! if(records_a.containsKey(dname)){ ! Vector<String> ans = records_a.get(dname); ! boolean found = false; ! for(int i=0; i<ans.size() && !found; i++){ ! found = ans.get(i).equalsIgnoreCase(value); ! if(found){ ! ans.remove(i); ! result = true; ! } ! } ! } ! break; ! } ! case DNS_Message.CNAME_QUERY_TYPE: { ! if(records_cname.containsKey(dname)){ ! Vector<String> ans = records_cname.get(dname); ! boolean found = false; ! for(int i=0; i<ans.size() && !found; i++){ ! found = ans.get(i).equalsIgnoreCase(value); ! if(found){ ! ans.remove(i); ! result = true; ! } ! } ! } ! break; ! } ! case DNS_Message.PTR_QUERY_TYPE: { ! if(records_ptr.containsKey(dname)){ ! Vector<String> ans = records_ptr.get(dname); ! boolean found = false; ! for(int i=0; i<ans.size() && !found; i++){ ! found = ans.get(i).equalsIgnoreCase(value); ! if(found){ ! ans.remove(i); ! result = true; ! } ! } ! } ! break; ! } ! case DNS_Message.HINFO_QUERY_TYPE: { ! if(records_hinfo.containsKey(dname)){ ! records_hinfo.remove(dname); ! result = true; ! } ! break; ! } ! case DNS_Message.MX_QUERY_TYPE: { ! String[] mxvalue = value.split(":"); ! if(records_mx.containsKey(dname)){ ! Vector<Pair> ans = records_mx.get(dname); ! boolean found = false; ! for(int i=0; i<ans.size() && !found; i++){ ! found = ((String)ans.get(i).getFirst()).equalsIgnoreCase(mxvalue[0]); ! if(found){ ! ans.remove(i); ! result = true; ! } ! } ! } ! break; ! } ! } ! return result; ! } ! ! public static String toInAddrArpa(String ip){ ! String[] ipn = ip.split("\\."); ! try{ ! if(ipn.length==4){ ! for(int i=0; i<4; i++){ ! int num = Integer.parseInt(ipn[i]); ! if(num<0 || num>255) throw new NumberFormatException(); ! } ! return ipn[3]+"."+ipn[2]+"."+ipn[1]+"."+ipn[0]+".in-addr.arpa"; ! } ! } ! catch(NumberFormatException e){}; ! return null; } + public static String fromInAddrArpa(String arpa){ + String[] ipn = arpa.split("\\."); + if(ipn.length==6 && ipn[4].equalsIgnoreCase("in-addr") && ipn[5].equalsIgnoreCase("arpa")) + return ipn[3]+"."+ipn[2]+"."+ipn[1]+"."+ipn[0]; + return null; + } + + public static boolean isValidName(String name){ + if(name.length()==0) return false; + for(int i=0; i<name.length(); i++){ + char c = name.charAt(i); + if(!((c>='0' && c<='9') || (c>='a' && c<='z') || (c>='A' && c<='Z') || c=='-' || c=='.')) return false; + } + return (toInAddrArpa(name)==null); // name is not valid IP-address + } + + public static boolean isValidMail(String name){ + if(name.length()==0) return false; + for(int i=0; i<name.length(); i++){ + char c = name.charAt(i); + if(!((c>='0' && c<='9') || (c>='a' && c<='z') || (c>='A' && c<='Z') || c=='-' || c=='.' || c=='@')) return false; + } + return true; + } } |