Sesame-Server/Sources/App/configure.swift

44 lines
1.5 KiB
Swift
Raw Normal View History

2022-01-23 20:49:06 +01:00
import Vapor
2022-04-07 23:53:25 +02:00
var deviceManager: DeviceManager!
2022-01-24 17:17:06 +01:00
2022-05-01 13:12:16 +02:00
enum ServerError: Error {
case invalidAuthenticationFileContent
2022-05-01 13:28:06 +02:00
case invalidAuthenticationToken
2022-05-01 13:12:16 +02:00
}
2022-01-23 20:49:06 +01:00
// configures your application
public func configure(_ app: Application) throws {
2022-04-13 14:57:02 +02:00
app.http.server.configuration.port = Config.port
2022-01-24 17:17:06 +01:00
let storageFolder = URL(fileURLWithPath: app.directory.resourcesDirectory)
2022-04-13 14:57:02 +02:00
let keyFile = storageFolder.appendingPathComponent(Config.keyFileName)
2022-05-01 13:28:06 +02:00
let authContent: [Data] = try String(contentsOf: keyFile)
2022-01-24 17:17:06 +01:00
.trimmingCharacters(in: .whitespacesAndNewlines)
2022-05-01 13:12:16 +02:00
.components(separatedBy: "\n")
.map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
2022-05-01 13:28:06 +02:00
.map {
guard let key = Data(fromHexEncodedString: $0) else {
throw ServerError.invalidAuthenticationToken
}
guard key.count == SHA256.byteCount else {
throw ServerError.invalidAuthenticationToken
}
return key
}
2022-05-01 13:12:16 +02:00
guard authContent.count == 2 else {
throw ServerError.invalidAuthenticationFileContent
}
let deviceKey = authContent[0]
2022-05-01 13:28:06 +02:00
let remoteKey = authContent[1]
2022-05-01 13:12:16 +02:00
deviceManager = DeviceManager(deviceKey: deviceKey, remoteKey: remoteKey)
2022-01-23 20:49:06 +01:00
try routes(app)
2022-01-24 17:17:06 +01:00
// Gracefully shut down by closing potentially open socket
DispatchQueue.global(qos: .utility).asyncAfter(deadline: .now() + .seconds(5)) {
_ = app.server.onShutdown.always { _ in
2022-04-07 23:53:25 +02:00
deviceManager.removeDeviceConnection()
2022-01-24 17:17:06 +01:00
}
}
2022-01-23 20:49:06 +01:00
}