package uc.protocols.hub; import helpers.GH; import java.io.IOException; import java.net.InetSocketAddress; import java.net.ProtocolException; import java.util.HashSet; import java.util.Map; import java.util.Set; import uc.Identity; import uc.crypto.BASE32Encoder; import uc.crypto.HashValue; import uc.crypto.TigerHashValue; import uc.crypto.UDPEncryption; import uc.files.filelist.OwnFileList.SearchParameter; import uc.files.search.FileSearch; import uc.files.search.SearchType; import uc.user.User; public class SCH extends AbstractADCHubCommand { //BSCH 4I3EXFV5JCIHE ++bementem ++a ++patikába invalid command.. /*BSCH 4I3EXFV5JCIHE TR6SG5KS63UDJFMFUCLJAI6FDHNDGVNHMMXHDIGAI * * DEBUG ConnectionProtocol.java Line:160 Malformed Command received: BSCH 4I3EXFV5JCIHE TRNSUDFZ3BPWD6YBMTKE5IXVR34CZKTZG5XNTZHDQ TRACE Hub.java Line:463 */ public SCH() { setPattern(getHeader()+" (.*)",true); } public void handle(Hub hub,String command) throws ProtocolException, IOException { if (hub.getFavHub().isChatOnly()) { return; } User usr = getOther(hub); if (usr == null || usr.equals(hub.getSelf())) { return; } String flagstr = matcher.group(HeaderCapt+1); Map<Flag,String> flags = getFlagMap(flagstr); Set<String> includes = new HashSet<String>(); Set<String> excludes = new HashSet<String>(); Set<String> endings = new HashSet<String>(); for (String s:flagstr.split(" ")) { //AN,NO,EX String val = s.length() > 2? revReplaces( s.substring(2)):""; if (s.startsWith("AN")) { includes.add(val); } else if(s.startsWith("NO")) { excludes.add(val); } else if (s.startsWith("EX")) { endings.add(val); } } long minsize = 0,maxsize = Long.MAX_VALUE,equalssize = -1; if (flags.containsKey(Flag.LE)) { minsize = Long.valueOf(flags.get(Flag.LE)); } if (flags.containsKey(Flag.GE)) { maxsize = Long.valueOf(flags.get(Flag.GE)); } if (flags.containsKey(Flag.EQ)) { equalssize = Long.valueOf(flags.get(Flag.EQ)); } boolean onlyDirectories = false; if (flags.containsKey(Flag.TY)) { onlyDirectories = flags.get(Flag.TY).equals("2"); //only files is currently ignored.. } boolean active = usr.isUDPActive(); InetSocketAddress ias = null; if (active) { if (hub.isIPv6() && usr.getSupports().contains(User.UDP6)) { ias = new InetSocketAddress(usr.getI6(),usr.getUDP6Port()); } else if (hub.isIPv4() && usr.getSupports().contains(User.UDP4)) { ias = new InetSocketAddress(usr.getIp(),usr.getUdpPort()); } else { throw new IllegalStateException(); } } byte[] encryptionKey = null; if (flags.containsKey(Flag.KY)) { encryptionKey = BASE32Encoder.decode(flags.get(Flag.KY)); } if (flags.containsKey(Flag.TR)) { HashValue hash = HashValue.createHash(flags.get(Flag.TR)); hub.searchReceived(hash, !active, usr, ias, flags.get(Flag.TO),encryptionKey); } else { SearchParameter sp = new SearchParameter( includes,excludes,minsize,maxsize,equalssize,endings, onlyDirectories); hub.searchReceived(sp,!active, usr , ias, flags.get(Flag.TO),encryptionKey); } } public static void sendSearch(Hub hub,FileSearch search) { //BSCH KAZ4 TRTFMBXT6AFYHJJOGE4OPLFSEWTYJEFFYY6RDWNIA TOauto StringBuilder sch= new StringBuilder(); Identity id = hub.getIdentity(); if (id.isActive() || id.isIPv6Used()) { sch.append("BSCH ").append(SIDToStr(hub.getSelf().getSid())); if (hub.isEncrypted() && UDPEncryption.isUDPEncryptionSupported()) { appendToSB(sch,Flag.KY,BASE32Encoder.encode(search.getEncryptionKey())); } } else { sch.append("FSCH ").append(SIDToStr(hub.getSelf().getSid())) .append(" +").append(User.TCP4); } String[] splits = space.split(search.getSearchString()); for (String s: splits) { if (s.matches(TigerHashValue.TTHREGEX) && splits.length == 1) { appendToSB(sch,Flag.TR,s); break; } else if (!GH.isEmpty(s)) { if (s.startsWith("-") && s.length() > 1) { appendToSB(sch,Flag.NO,s.substring(1)); } else { appendToSB(sch,Flag.AN,s); } } } for (String s:search.getSearchType().getEndings()) { //add allowed endings appendToSB(sch,Flag.EX,s); } if (search.getSize() >= 0) { sch.append(' ').append(search.getComparisonEnum().getAdcCC()); sch.append(Long.toString(search.getSize())); } if (search.getSearchType() == SearchType.FOLDER) { appendToSB(sch,Flag.TY,"2"); } if (search.getToken() != null) { appendToSB(sch,Flag.TO,search.getToken()); } sch.append('\n'); hub.sendUnmodifiedRaw(sch.toString()); } private static void appendToSB(StringBuilder sb,Flag f,String s) { sb.append(' ').append(f.name()).append(doReplaces(s)); } }