diff options
author | Juan J. Martinez <jjm@usebox.net> | 2021-02-28 08:15:55 +0000 |
---|---|---|
committer | Juan J. Martinez <jjm@usebox.net> | 2021-07-22 19:49:51 +0100 |
commit | fc60ea8c4d52c5015edce1e4c6086d80e7a7d830 (patch) | |
tree | 3df752bef15d3a6e3367c8155a4904571e20479b /server/src/net/usebox | |
parent | 71df19c2da98428f52242e274c1d11f1c4c1ecdf (diff) | |
download | spacebeans-fc60ea8c4d52c5015edce1e4c6086d80e7a7d830.tar.gz spacebeans-fc60ea8c4d52c5015edce1e4c6086d80e7a7d830.zip |
Flags per directory, override vhost settings
Diffstat (limited to 'server/src/net/usebox')
-rw-r--r-- | server/src/net/usebox/gemini/server/Server.scala | 2 | ||||
-rw-r--r-- | server/src/net/usebox/gemini/server/ServiceConf.scala | 46 |
2 files changed, 44 insertions, 4 deletions
diff --git a/server/src/net/usebox/gemini/server/Server.scala b/server/src/net/usebox/gemini/server/Server.scala index ed9252d..2e9bb6b 100644 --- a/server/src/net/usebox/gemini/server/Server.scala +++ b/server/src/net/usebox/gemini/server/Server.scala @@ -142,7 +142,7 @@ case class Server(conf: ServiceConf) { bodySize = dirFile.length(), bodyPath = Some(dirFilePath) ) - } else if (vhost.directoryListing) { + } else if (vhost.getDirectoryListing(resource)) { logger.debug("directory listing") DirListing( req, diff --git a/server/src/net/usebox/gemini/server/ServiceConf.scala b/server/src/net/usebox/gemini/server/ServiceConf.scala index 9c0f8e8..f0751d2 100644 --- a/server/src/net/usebox/gemini/server/ServiceConf.scala +++ b/server/src/net/usebox/gemini/server/ServiceConf.scala @@ -1,21 +1,39 @@ package net.usebox.gemini.server +import java.nio.file.{Path, FileSystems} + +import scala.concurrent.duration.FiniteDuration + import pureconfig._ import pureconfig.generic.semiauto._ -import scala.concurrent.duration.FiniteDuration +import org.log4s._ case class KeyStore(path: String, alias: String, password: String) +case class Directory(path: String, directoryListing: Option[Boolean]) + case class VirtualHost( host: String, root: String, keyStore: Option[KeyStore] = None, indexFile: String = "index.gmi", directoryListing: Boolean = true, - geminiParams: Option[String] = None + geminiParams: Option[String] = None, + directories: List[Directory] ) +object VirtualHost { + implicit class VirtualHostOps(vhost: VirtualHost) { + def getDirectoryListing(path: Path): Boolean = + vhost.directories + .find(_.path == path.toString()) + .fold(vhost.directoryListing)(loc => + loc.directoryListing.getOrElse(vhost.directoryListing) + ) + } +} + case class ServiceConf( address: String, port: Int, @@ -30,9 +48,31 @@ case class ServiceConf( object ServiceConf { + private[this] val logger = getLogger + implicit val keyStoreReader = deriveReader[KeyStore] + implicit val directoryHostReader = deriveReader[Directory] implicit val virtualHostReader = deriveReader[VirtualHost] implicit val serviceConfReader = deriveReader[ServiceConf] - def load(confFile: String) = ConfigSource.file(confFile).load[ServiceConf] + def load(confFile: String) = + ConfigSource.file(confFile).load[ServiceConf].map { conf => + conf.copy(virtualHosts = conf.virtualHosts.map { vhost => + vhost.copy(directories = vhost.directories.map { dir => + val path = + FileSystems + .getDefault() + .getPath(vhost.root, dir.path) + .normalize() + + if (!path.toFile().isDirectory()) + logger.warn( + s"In virtual host '${vhost.host}': directory entry '${dir.path}' is not a directory" + ) + + dir + .copy(path = path.toString()) + }) + }) + } } |