mirror of https://github.com/zlatinb/muwire
move the handling of V1 browse requests to BrowseManager
parent
091a1c9a5b
commit
4aff5cb6c7
|
@ -490,22 +490,24 @@ public class Core {
|
|||
log.info("initializing connection establisher")
|
||||
connectionEstablisher = new ConnectionEstablisher(eventBus, i2pConnector, props, connectionManager, hostCache)
|
||||
|
||||
log.info("initializing browse manager")
|
||||
BrowseManager browseManager = new BrowseManager(i2pConnector, eventBus, me, fileManager,
|
||||
certificateManager, collectionManager, isVisible)
|
||||
eventBus.register(UIBrowseEvent.class, browseManager)
|
||||
|
||||
log.info("initializing acceptor")
|
||||
I2PAcceptor i2pAcceptor = new I2PAcceptor(i2pConnector::getSocketManager)
|
||||
eventBus.register(RouterConnectedEvent.class, i2pAcceptor)
|
||||
eventBus.register(RouterDisconnectedEvent.class, i2pAcceptor)
|
||||
connectionAcceptor = new ConnectionAcceptor(eventBus, me, profileSupplier, connectionManager, props,
|
||||
i2pAcceptor, hostCache, trustService, searchManager, uploadManager, fileManager, connectionEstablisher,
|
||||
certificateManager, chatServer, collectionManager, isVisible)
|
||||
certificateManager, chatServer, collectionManager, browseManager, isVisible)
|
||||
|
||||
log.info("initializing trust subscriber")
|
||||
trustSubscriber = new TrustSubscriber(eventBus, i2pConnector, props)
|
||||
eventBus.register(UILoadedEvent.class, trustSubscriber)
|
||||
eventBus.register(TrustSubscriptionEvent.class, trustSubscriber)
|
||||
|
||||
log.info("initializing browse manager")
|
||||
BrowseManager browseManager = new BrowseManager(i2pConnector, eventBus, me)
|
||||
eventBus.register(UIBrowseEvent.class, browseManager)
|
||||
|
||||
log.info("initializing profile fetcher")
|
||||
MWProfileFetcher profileFetcher = new MWProfileFetcher(i2pConnector, eventBus, me, profileHeaderSupplier)
|
||||
|
|
|
@ -2,6 +2,7 @@ package com.muwire.core.connection
|
|||
|
||||
import com.muwire.core.profile.MWProfile
|
||||
import com.muwire.core.profile.MWProfileHeader
|
||||
import com.muwire.core.search.BrowseManager
|
||||
import net.i2p.I2PException
|
||||
import net.i2p.data.ByteArray
|
||||
|
||||
|
@ -69,6 +70,7 @@ class ConnectionAcceptor {
|
|||
final CertificateManager certificateManager
|
||||
final ChatServer chatServer
|
||||
final CollectionManager collectionManager
|
||||
private final BrowseManager browseManager
|
||||
private final BiPredicate<File, Persona> isVisible
|
||||
|
||||
final ExecutorService acceptorThread
|
||||
|
@ -79,10 +81,11 @@ class ConnectionAcceptor {
|
|||
volatile int browsed
|
||||
|
||||
ConnectionAcceptor(EventBus eventBus, Persona me, Supplier<MWProfile> myProfile, UltrapeerConnectionManager manager,
|
||||
MuWireSettings settings, I2PAcceptor acceptor, HostCache hostCache,
|
||||
TrustService trustService, SearchManager searchManager, UploadManager uploadManager,
|
||||
FileManager fileManager, ConnectionEstablisher establisher, CertificateManager certificateManager,
|
||||
ChatServer chatServer, CollectionManager collectionManager, BiPredicate<File,Persona> isVisible) {
|
||||
MuWireSettings settings, I2PAcceptor acceptor, HostCache hostCache,
|
||||
TrustService trustService, SearchManager searchManager, UploadManager uploadManager,
|
||||
FileManager fileManager, ConnectionEstablisher establisher, CertificateManager certificateManager,
|
||||
ChatServer chatServer, CollectionManager collectionManager, BrowseManager browseManager,
|
||||
BiPredicate < File, Persona > isVisible) {
|
||||
this.eventBus = eventBus
|
||||
this.me = me
|
||||
this.myProfile = myProfile
|
||||
|
@ -98,6 +101,7 @@ class ConnectionAcceptor {
|
|||
this.certificateManager = certificateManager
|
||||
this.chatServer = chatServer
|
||||
this.collectionManager = collectionManager
|
||||
this.browseManager = browseManager
|
||||
this.isVisible = isVisible
|
||||
|
||||
acceptorThread = Executors.newSingleThreadExecutor { r ->
|
||||
|
@ -407,7 +411,6 @@ class ConnectionAcceptor {
|
|||
}
|
||||
|
||||
private void processBROWSE(Endpoint e) {
|
||||
DataOutputStream dos = null
|
||||
try {
|
||||
byte [] rowse = new byte[7]
|
||||
DataInputStream dis = new DataInputStream(e.getInputStream())
|
||||
|
@ -430,19 +433,25 @@ class ConnectionAcceptor {
|
|||
e.close()
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
int version = 1
|
||||
if (headers.containsKey("Version"))
|
||||
version = Math.min(Constants.BROWSE_VERSION, Integer.parseInt(headers['Version']))
|
||||
|
||||
browsed++
|
||||
|
||||
boolean showPaths = settings.showPaths &&
|
||||
headers.containsKey('Path') &&
|
||||
Boolean.parseBoolean(headers['Path'])
|
||||
|
||||
|
||||
|
||||
os.write("200 OK\r\n".getBytes(StandardCharsets.US_ASCII))
|
||||
|
||||
boolean showPaths = settings.showPaths &&
|
||||
headers.containsKey('Path') &&
|
||||
Boolean.parseBoolean(headers['Path'])
|
||||
|
||||
def sharedFiles = fileManager.getSharedFiles().values()
|
||||
sharedFiles.retainAll {isVisible.test(it.file.getParentFile(), browser)}
|
||||
int count = fileManager.getFileToSharedFile().values().count {
|
||||
isVisible.test(it.file.getParentFile(), browser)
|
||||
}
|
||||
|
||||
os.write("Count: ${sharedFiles.size()}\r\n".getBytes(StandardCharsets.US_ASCII))
|
||||
os.write("Count: ${count}\r\n".getBytes(StandardCharsets.US_ASCII))
|
||||
|
||||
boolean chat = chatServer.isRunning() && settings.advertiseChat
|
||||
os.write("Chat: ${chat}\r\n".getBytes(StandardCharsets.US_ASCII))
|
||||
|
@ -455,25 +464,13 @@ class ConnectionAcceptor {
|
|||
os.write("ProfileHeader: ${profile.getHeader().toBase64()}\r\n".getBytes(StandardCharsets.US_ASCII))
|
||||
}
|
||||
|
||||
os.write("Version:$version\r\n".getBytes(StandardCharsets.US_ASCII))
|
||||
|
||||
os.write("\r\n".getBytes(StandardCharsets.US_ASCII))
|
||||
|
||||
dos = new DataOutputStream(new GZIPOutputStream(os))
|
||||
JsonOutput jsonOutput = new JsonOutput()
|
||||
sharedFiles.each {
|
||||
it.hit(browser, System.currentTimeMillis(), "Browse Host");
|
||||
InfoHash ih = new InfoHash(it.getRoot())
|
||||
int certificates = certificateManager.getByInfoHash(ih).size()
|
||||
Set<InfoHash> collections = collectionManager.collectionsForFile(ih)
|
||||
def obj = ResultsSender.sharedFileToObj(it, false, certificates, collections, showPaths)
|
||||
def json = jsonOutput.toJson(obj)
|
||||
dos.writeShort((short)json.length())
|
||||
dos.write(json.getBytes(StandardCharsets.US_ASCII))
|
||||
}
|
||||
if (version == 1)
|
||||
browseManager.processV1Request(browser, e, showPaths)
|
||||
} finally {
|
||||
try {
|
||||
dos?.flush()
|
||||
dos?.close()
|
||||
} catch (Exception ignored) {}
|
||||
e.close()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,12 +2,16 @@ package com.muwire.core.search
|
|||
|
||||
import com.muwire.core.Constants
|
||||
import com.muwire.core.EventBus
|
||||
import com.muwire.core.InfoHash
|
||||
import com.muwire.core.Persona
|
||||
import com.muwire.core.collections.CollectionManager
|
||||
import com.muwire.core.connection.Endpoint
|
||||
import com.muwire.core.connection.I2PConnector
|
||||
import com.muwire.core.filecert.CertificateManager
|
||||
import com.muwire.core.files.FileManager
|
||||
import com.muwire.core.profile.MWProfileHeader
|
||||
import com.muwire.core.util.DataUtil
|
||||
|
||||
import groovy.json.JsonOutput
|
||||
import groovy.json.JsonSlurper
|
||||
import groovy.util.logging.Log
|
||||
import net.i2p.data.Base64
|
||||
|
@ -15,8 +19,10 @@ import net.i2p.data.Base64
|
|||
import java.nio.charset.StandardCharsets
|
||||
import java.util.concurrent.Executor
|
||||
import java.util.concurrent.Executors
|
||||
import java.util.function.BiPredicate
|
||||
import java.util.logging.Level
|
||||
import java.util.zip.GZIPInputStream
|
||||
import java.util.zip.GZIPOutputStream
|
||||
|
||||
@Log
|
||||
class BrowseManager {
|
||||
|
@ -24,16 +30,43 @@ class BrowseManager {
|
|||
private final I2PConnector connector
|
||||
private final EventBus eventBus
|
||||
private final Persona me
|
||||
private final FileManager fileManager
|
||||
private final CertificateManager certificateManager
|
||||
private final CollectionManager collectionManager
|
||||
private final BiPredicate<File, Persona> isVisible
|
||||
|
||||
private final Executor browserThread = Executors.newCachedThreadPool()
|
||||
|
||||
BrowseManager(I2PConnector connector, EventBus eventBus, Persona me) {
|
||||
BrowseManager(I2PConnector connector, EventBus eventBus, Persona me, FileManager fileManager,
|
||||
CertificateManager certificateManager, CollectionManager collectionManager,
|
||||
BiPredicate<File, Persona> isVisible) {
|
||||
this.connector = connector
|
||||
this.eventBus = eventBus
|
||||
this.me = me
|
||||
this.fileManager = fileManager
|
||||
this.certificateManager = certificateManager
|
||||
this.collectionManager = collectionManager
|
||||
this.isVisible = isVisible
|
||||
}
|
||||
|
||||
void onUIBrowseEvent(UIBrowseEvent e) {
|
||||
browserThread.execute(new BrowseSession(eventBus, connector, e, me))
|
||||
}
|
||||
|
||||
void processV1Request(Persona browser, Endpoint endpoint, boolean showPaths) {
|
||||
def sharedFiles = fileManager.getSharedFiles().values()
|
||||
sharedFiles.retainAll {isVisible.test(it.file.getParentFile(), browser)}
|
||||
def dos = new DataOutputStream(new GZIPOutputStream(endpoint.getOutputStream()))
|
||||
JsonOutput jsonOutput = new JsonOutput()
|
||||
sharedFiles.each {
|
||||
it.hit(browser, System.currentTimeMillis(), "Browse Host");
|
||||
InfoHash ih = new InfoHash(it.getRoot())
|
||||
int certificates = certificateManager.getByInfoHash(ih).size()
|
||||
Set<InfoHash> collections = collectionManager.collectionsForFile(ih)
|
||||
def obj = ResultsSender.sharedFileToObj(it, false, certificates, collections, showPaths)
|
||||
def json = jsonOutput.toJson(obj)
|
||||
dos.writeShort((short)json.length())
|
||||
dos.write(json.getBytes(StandardCharsets.US_ASCII))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,6 +14,8 @@ public class Constants {
|
|||
public static final int MAX_PROFILE_IMAGE_LENGTH = 200 * 1024;
|
||||
public static final int MAX_PROFILE_LENGTH = 0x1 << 18;
|
||||
|
||||
public static final int BROWSE_VERSION = 2;
|
||||
|
||||
public static final byte FILE_CERT_VERSION = (byte)2;
|
||||
public static final int CHAT_VERSION = 2;
|
||||
|
||||
|
|
Loading…
Reference in New Issue