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")
|
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)
|
||||||
|
|
|
@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue