move the handling of V1 browse requests to BrowseManager

browse-v2
Zlatin Balevsky 2022-08-27 20:20:20 +01:00
parent 091a1c9a5b
commit 4aff5cb6c7
No known key found for this signature in database
GPG Key ID: A72832072D525E41
4 changed files with 70 additions and 36 deletions

View File

@ -490,22 +490,24 @@ public class Core {
log.info("initializing connection establisher") log.info("initializing connection establisher")
connectionEstablisher = new ConnectionEstablisher(eventBus, i2pConnector, props, connectionManager, hostCache) 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") log.info("initializing acceptor")
I2PAcceptor i2pAcceptor = new I2PAcceptor(i2pConnector::getSocketManager) I2PAcceptor i2pAcceptor = new I2PAcceptor(i2pConnector::getSocketManager)
eventBus.register(RouterConnectedEvent.class, i2pAcceptor) eventBus.register(RouterConnectedEvent.class, i2pAcceptor)
eventBus.register(RouterDisconnectedEvent.class, i2pAcceptor) eventBus.register(RouterDisconnectedEvent.class, i2pAcceptor)
connectionAcceptor = new ConnectionAcceptor(eventBus, me, profileSupplier, connectionManager, props, connectionAcceptor = new ConnectionAcceptor(eventBus, me, profileSupplier, connectionManager, props,
i2pAcceptor, hostCache, trustService, searchManager, uploadManager, fileManager, connectionEstablisher, i2pAcceptor, hostCache, trustService, searchManager, uploadManager, fileManager, connectionEstablisher,
certificateManager, chatServer, collectionManager, isVisible) certificateManager, chatServer, collectionManager, browseManager, isVisible)
log.info("initializing trust subscriber") log.info("initializing trust subscriber")
trustSubscriber = new TrustSubscriber(eventBus, i2pConnector, props) trustSubscriber = new TrustSubscriber(eventBus, i2pConnector, props)
eventBus.register(UILoadedEvent.class, trustSubscriber) eventBus.register(UILoadedEvent.class, trustSubscriber)
eventBus.register(TrustSubscriptionEvent.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") log.info("initializing profile fetcher")
MWProfileFetcher profileFetcher = new MWProfileFetcher(i2pConnector, eventBus, me, profileHeaderSupplier) MWProfileFetcher profileFetcher = new MWProfileFetcher(i2pConnector, eventBus, me, profileHeaderSupplier)

View File

@ -2,6 +2,7 @@ package com.muwire.core.connection
import com.muwire.core.profile.MWProfile import com.muwire.core.profile.MWProfile
import com.muwire.core.profile.MWProfileHeader import com.muwire.core.profile.MWProfileHeader
import com.muwire.core.search.BrowseManager
import net.i2p.I2PException import net.i2p.I2PException
import net.i2p.data.ByteArray import net.i2p.data.ByteArray
@ -69,6 +70,7 @@ class ConnectionAcceptor {
final CertificateManager certificateManager final CertificateManager certificateManager
final ChatServer chatServer final ChatServer chatServer
final CollectionManager collectionManager final CollectionManager collectionManager
private final BrowseManager browseManager
private final BiPredicate<File, Persona> isVisible private final BiPredicate<File, Persona> isVisible
final ExecutorService acceptorThread final ExecutorService acceptorThread
@ -79,10 +81,11 @@ class ConnectionAcceptor {
volatile int browsed volatile int browsed
ConnectionAcceptor(EventBus eventBus, Persona me, Supplier<MWProfile> myProfile, UltrapeerConnectionManager manager, ConnectionAcceptor(EventBus eventBus, Persona me, Supplier<MWProfile> myProfile, UltrapeerConnectionManager manager,
MuWireSettings settings, I2PAcceptor acceptor, HostCache hostCache, MuWireSettings settings, I2PAcceptor acceptor, HostCache hostCache,
TrustService trustService, SearchManager searchManager, UploadManager uploadManager, TrustService trustService, SearchManager searchManager, UploadManager uploadManager,
FileManager fileManager, ConnectionEstablisher establisher, CertificateManager certificateManager, FileManager fileManager, ConnectionEstablisher establisher, CertificateManager certificateManager,
ChatServer chatServer, CollectionManager collectionManager, BiPredicate<File,Persona> isVisible) { ChatServer chatServer, CollectionManager collectionManager, BrowseManager browseManager,
BiPredicate < File, Persona > isVisible) {
this.eventBus = eventBus this.eventBus = eventBus
this.me = me this.me = me
this.myProfile = myProfile this.myProfile = myProfile
@ -98,6 +101,7 @@ class ConnectionAcceptor {
this.certificateManager = certificateManager this.certificateManager = certificateManager
this.chatServer = chatServer this.chatServer = chatServer
this.collectionManager = collectionManager this.collectionManager = collectionManager
this.browseManager = browseManager
this.isVisible = isVisible this.isVisible = isVisible
acceptorThread = Executors.newSingleThreadExecutor { r -> acceptorThread = Executors.newSingleThreadExecutor { r ->
@ -407,7 +411,6 @@ class ConnectionAcceptor {
} }
private void processBROWSE(Endpoint e) { private void processBROWSE(Endpoint e) {
DataOutputStream dos = null
try { try {
byte [] rowse = new byte[7] byte [] rowse = new byte[7]
DataInputStream dis = new DataInputStream(e.getInputStream()) DataInputStream dis = new DataInputStream(e.getInputStream())
@ -431,18 +434,24 @@ class ConnectionAcceptor {
return return
} }
int version = 1
if (headers.containsKey("Version"))
version = Math.min(Constants.BROWSE_VERSION, Integer.parseInt(headers['Version']))
browsed++ browsed++
os.write("200 OK\r\n".getBytes(StandardCharsets.US_ASCII))
boolean showPaths = settings.showPaths && boolean showPaths = settings.showPaths &&
headers.containsKey('Path') && headers.containsKey('Path') &&
Boolean.parseBoolean(headers['Path']) Boolean.parseBoolean(headers['Path'])
os.write("200 OK\r\n".getBytes(StandardCharsets.US_ASCII)) int count = fileManager.getFileToSharedFile().values().count {
isVisible.test(it.file.getParentFile(), browser)
}
def sharedFiles = fileManager.getSharedFiles().values() os.write("Count: ${count}\r\n".getBytes(StandardCharsets.US_ASCII))
sharedFiles.retainAll {isVisible.test(it.file.getParentFile(), browser)}
os.write("Count: ${sharedFiles.size()}\r\n".getBytes(StandardCharsets.US_ASCII))
boolean chat = chatServer.isRunning() && settings.advertiseChat boolean chat = chatServer.isRunning() && settings.advertiseChat
os.write("Chat: ${chat}\r\n".getBytes(StandardCharsets.US_ASCII)) 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("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)) os.write("\r\n".getBytes(StandardCharsets.US_ASCII))
dos = new DataOutputStream(new GZIPOutputStream(os)) if (version == 1)
JsonOutput jsonOutput = new JsonOutput() browseManager.processV1Request(browser, e, showPaths)
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))
}
} finally { } finally {
try {
dos?.flush()
dos?.close()
} catch (Exception ignored) {}
e.close() e.close()
} }
} }

View File

@ -2,12 +2,16 @@ package com.muwire.core.search
import com.muwire.core.Constants import com.muwire.core.Constants
import com.muwire.core.EventBus import com.muwire.core.EventBus
import com.muwire.core.InfoHash
import com.muwire.core.Persona import com.muwire.core.Persona
import com.muwire.core.collections.CollectionManager
import com.muwire.core.connection.Endpoint import com.muwire.core.connection.Endpoint
import com.muwire.core.connection.I2PConnector 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.profile.MWProfileHeader
import com.muwire.core.util.DataUtil import com.muwire.core.util.DataUtil
import groovy.json.JsonOutput
import groovy.json.JsonSlurper import groovy.json.JsonSlurper
import groovy.util.logging.Log import groovy.util.logging.Log
import net.i2p.data.Base64 import net.i2p.data.Base64
@ -15,8 +19,10 @@ import net.i2p.data.Base64
import java.nio.charset.StandardCharsets import java.nio.charset.StandardCharsets
import java.util.concurrent.Executor import java.util.concurrent.Executor
import java.util.concurrent.Executors import java.util.concurrent.Executors
import java.util.function.BiPredicate
import java.util.logging.Level import java.util.logging.Level
import java.util.zip.GZIPInputStream import java.util.zip.GZIPInputStream
import java.util.zip.GZIPOutputStream
@Log @Log
class BrowseManager { class BrowseManager {
@ -24,16 +30,43 @@ class BrowseManager {
private final I2PConnector connector private final I2PConnector connector
private final EventBus eventBus private final EventBus eventBus
private final Persona me 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() 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.connector = connector
this.eventBus = eventBus this.eventBus = eventBus
this.me = me this.me = me
this.fileManager = fileManager
this.certificateManager = certificateManager
this.collectionManager = collectionManager
this.isVisible = isVisible
} }
void onUIBrowseEvent(UIBrowseEvent e) { void onUIBrowseEvent(UIBrowseEvent e) {
browserThread.execute(new BrowseSession(eventBus, connector, e, me)) 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))
}
}
} }

View File

@ -14,6 +14,8 @@ public class Constants {
public static final int MAX_PROFILE_IMAGE_LENGTH = 200 * 1024; public static final int MAX_PROFILE_IMAGE_LENGTH = 200 * 1024;
public static final int MAX_PROFILE_LENGTH = 0x1 << 18; 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 byte FILE_CERT_VERSION = (byte)2;
public static final int CHAT_VERSION = 2; public static final int CHAT_VERSION = 2;