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")
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)

View File

@ -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()
}
}

View File

@ -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))
}
}
}

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_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;