package com.limegroup.gnutella.downloader; import java.util.Arrays; import java.util.Date; import com.limegroup.gnutella.GUID; /** * A file that we requested via a push message. Used for "authenticating" * incoming push connections. This is similar to a RemoteFileDesc, but it has * a time stamp and some fields are removed, e.g., file length. */ class PushRequestedFile { byte[] clientGUID; String filename; long index; Date time; /** * Creates a new PushRequestedFile. The time stamp is equal to the current * time. * @param clientGUID the client GUID of the uploader. * @param filename the name of the requested file * @param index the index of the file on the uploader */ public PushRequestedFile(byte[] clientGUID, String filename, long index) { this.clientGUID=clientGUID; this.filename=filename; this.index=index; this.time=new Date(); } /** * Returns true if this request was made before the given time. */ public boolean before(Date time) { return this.time.before(time); } /** * True iff o is a PushRequestedFile with the same clientGUID, filename, and * index. Note that the time stamp is ignored! */ public boolean equals(Object o) { if (! (o instanceof PushRequestedFile)) return false; PushRequestedFile prf=(PushRequestedFile)o; return Arrays.equals(clientGUID, prf.clientGUID) && filename.equals(prf.filename) //If the following line is uncommented, //the IP address on the socket must match that //of the query reply. But this will almost //always fail if the remote host is behind a firewall-- //which is the whole reason to use pushes in the //first place! Yes, this is a potential security //flaw. TODO: We should really allow users to adjust //whether they want to take the risk. // && Arrays.equals(ip, prf.ip) && index==prf.index; } public int hashCode() { //This is good enough since we'll rarely request the //same file over and over. return filename.hashCode(); } public String toString() { return "<"+filename+", "+index+", " +(new GUID(clientGUID).toString())+">"; } }