mirror of https://github.com/zlatinb/muwire
parsing of events; check that the persona in the results matches the destination
parent
5df170f982
commit
ac889b7906
|
@ -188,6 +188,8 @@ class ConnectionAcceptor {
|
||||||
throw new IOException("invalid request header")
|
throw new IOException("invalid request header")
|
||||||
|
|
||||||
Persona sender = new Persona(dis)
|
Persona sender = new Persona(dis)
|
||||||
|
if (sender.destination != e.getDestination())
|
||||||
|
throw new IOException("Sender destination mismatch expected $e.getDestination(), got $sender.destination")
|
||||||
int nResults = dis.readUnsignedShort()
|
int nResults = dis.readUnsignedShort()
|
||||||
for (int i = 0; i < nResults; i++) {
|
for (int i = 0; i < nResults; i++) {
|
||||||
int jsonSize = dis.readUnsignedShort()
|
int jsonSize = dis.readUnsignedShort()
|
||||||
|
|
|
@ -1,9 +1,54 @@
|
||||||
package com.muwire.core.search
|
package com.muwire.core.search
|
||||||
|
|
||||||
|
import javax.naming.directory.InvalidSearchControlsException
|
||||||
|
|
||||||
|
import com.muwire.core.InfoHash
|
||||||
import com.muwire.core.Persona
|
import com.muwire.core.Persona
|
||||||
|
import com.muwire.core.util.DataUtil
|
||||||
|
|
||||||
|
import net.i2p.data.Base64
|
||||||
|
|
||||||
class ResultsParser {
|
class ResultsParser {
|
||||||
public static UIResultEvent parse(Persona p, def json) throws InvalidSearchResultException {
|
public static UIResultEvent parse(Persona p, def json) throws InvalidSearchResultException {
|
||||||
null
|
if (json.type != "Result")
|
||||||
|
throw new InvalidSearchResultException("not a result json")
|
||||||
|
if (json.version != 1)
|
||||||
|
throw new InvalidSearchResultException("unknown version $json.version")
|
||||||
|
if (json.name == null)
|
||||||
|
throw new InvalidSearchResultException("name missing")
|
||||||
|
if (json.size == null)
|
||||||
|
throw new InvalidSearchResultException("length missing")
|
||||||
|
if (json.infohash == null)
|
||||||
|
throw new InvalidSearchResultException("infohash missing")
|
||||||
|
if (json.pieceSize == null)
|
||||||
|
throw new InvalidSearchResultException("pieceSize missing")
|
||||||
|
if (!(json.hashList instanceof List))
|
||||||
|
throw new InvalidSearchResultException("hashlist not a list")
|
||||||
|
try {
|
||||||
|
String name = DataUtil.readi18nString(Base64.decode(json.name))
|
||||||
|
long size = Long.parseLong(json.size)
|
||||||
|
byte [] infoHash = Base64.decode(json.infohash)
|
||||||
|
if (infoHash.length != InfoHash.SIZE)
|
||||||
|
throw new InvalidSearchResultException("invalid infohash size $infoHash.length")
|
||||||
|
int pieceSize = Integer.parseInt(json.pieceSize)
|
||||||
|
byte [] hashList = new byte[json.hashList.size() * InfoHash.SIZE]
|
||||||
|
json.hashList.eachWithIndex { string, index ->
|
||||||
|
byte [] hashPiece = Base64.decode(string)
|
||||||
|
if (hashPiece.length != InfoHash.SIZE)
|
||||||
|
throw new InvalidSearchResultException("Invalid piece hash size $hashPiece.length at index $index")
|
||||||
|
System.arraycopy(hashPiece, 0, hashList, index * InfoHash.SIZE, InfoHash.SIZE)
|
||||||
|
}
|
||||||
|
InfoHash parsedIH = InfoHash.fromHashList(hashList)
|
||||||
|
if (parsedIH.getRoot() != infoHash)
|
||||||
|
throw new InvalidSearchControlsException("infohash root doesn't match")
|
||||||
|
|
||||||
|
return new UIResultEvent( sender : p,
|
||||||
|
name : name,
|
||||||
|
size : size,
|
||||||
|
infohash : parsedIH,
|
||||||
|
pieceSize : pieceSize)
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new InvalidSearchResultException("parsing search result failed",e)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,9 +48,16 @@ class ResultsSender {
|
||||||
void sendResults(UUID uuid, SharedFile[] results, Destination target) {
|
void sendResults(UUID uuid, SharedFile[] results, Destination target) {
|
||||||
log.info("Sending $results.length results for uuid $uuid to ${target.toBase32()}")
|
log.info("Sending $results.length results for uuid $uuid to ${target.toBase32()}")
|
||||||
if (target.equals(me.destination)) {
|
if (target.equals(me.destination)) {
|
||||||
def resultEvent = new ResultsEvent( uuid : uuid, results : results )
|
results.each {
|
||||||
def uiResultEvent = new UIResultEvent(sender: me, resultsEvent : resultEvent)
|
long length = it.getFile().length()
|
||||||
eventBus.publish(uiResultEvent)
|
def uiResultEvent = new UIResultEvent( sender : me,
|
||||||
|
name : it.getFile().getName(),
|
||||||
|
size : length,
|
||||||
|
infohash : it.getInfoHash(),
|
||||||
|
pieceSize : FileHasher.getPieceSize(length)
|
||||||
|
)
|
||||||
|
eventBus.publish(uiResultEvent)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
executor.execute(new ResultSendJob(uuid : uuid, results : results, target: target))
|
executor.execute(new ResultSendJob(uuid : uuid, results : results, target: target))
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,13 @@
|
||||||
package com.muwire.core.search
|
package com.muwire.core.search
|
||||||
|
|
||||||
import com.muwire.core.Event
|
import com.muwire.core.Event
|
||||||
|
import com.muwire.core.InfoHash
|
||||||
import com.muwire.core.Persona
|
import com.muwire.core.Persona
|
||||||
|
|
||||||
class UIResultEvent extends Event {
|
class UIResultEvent extends Event {
|
||||||
Persona sender
|
Persona sender
|
||||||
ResultsEvent resultsEvent
|
String name
|
||||||
|
long size
|
||||||
|
InfoHash infohash
|
||||||
|
int pieceSize
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
package com.muwire.core.util
|
package com.muwire.core.util
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets
|
||||||
|
|
||||||
class DataUtil {
|
class DataUtil {
|
||||||
|
|
||||||
private final static int MAX_SHORT = (0x1 << 16) - 1
|
private final static int MAX_SHORT = (0x1 << 16) - 1
|
||||||
|
@ -36,4 +38,15 @@ class DataUtil {
|
||||||
(((int)(header[1] & 0xFF) << 8)) |
|
(((int)(header[1] & 0xFF) << 8)) |
|
||||||
((int)header[2] & 0xFF)
|
((int)header[2] & 0xFF)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static String readi18nString(byte [] encoded) {
|
||||||
|
if (encoded.length < 2)
|
||||||
|
throw new IllegalArgumentException("encoding too short $encoded.length")
|
||||||
|
int length = ((encoded[0] & 0xFF) << 8) | (encoded[1] & 0xFF)
|
||||||
|
if (encoded.length != length + 2)
|
||||||
|
throw new IllegalArgumentException("encoding doesn't match length, expected $length found $encoded.length")
|
||||||
|
byte [] string = new byte[length]
|
||||||
|
System.arraycopy(encoded, 2, string, 0, length)
|
||||||
|
new String(string, StandardCharsets.UTF_8)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue