summaryrefslogtreecommitdiff
path: root/server/src/net/usebox/gemini
diff options
context:
space:
mode:
authorJuan J. Martinez <jjm@usebox.net>2021-02-28 08:15:55 +0000
committerJuan J. Martinez <jjm@usebox.net>2021-07-22 19:49:51 +0100
commitfc60ea8c4d52c5015edce1e4c6086d80e7a7d830 (patch)
tree3df752bef15d3a6e3367c8155a4904571e20479b /server/src/net/usebox/gemini
parent71df19c2da98428f52242e274c1d11f1c4c1ecdf (diff)
downloadspacebeans-fc60ea8c4d52c5015edce1e4c6086d80e7a7d830.tar.gz
spacebeans-fc60ea8c4d52c5015edce1e4c6086d80e7a7d830.zip
Flags per directory, override vhost settings
Diffstat (limited to 'server/src/net/usebox/gemini')
-rw-r--r--server/src/net/usebox/gemini/server/Server.scala2
-rw-r--r--server/src/net/usebox/gemini/server/ServiceConf.scala46
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())
+ })
+ })
+ }
}