import Vapor import Foundation import Crypto import Leaf func routes(_ app: Application) throws { // Render home page when root domain is loaded app.get { req -> EventLoopFuture in let fileData = try String(contentsOfFile: "\(app.directory.resourcesDirectory)/config.json").data(using: .utf8) let config: Config = try! JSONDecoder().decode(Config.self, from: fileData!) let loginStatus = req.session.data["loggedIn"] ?? "false" let loginBool = loginStatus == "true" ? true : false return req.view.render("home", LContext(config: config, loggedIn: loginBool)) } app.get("status", ":url") { req -> EventLoopFuture<[String: String]> in let url = URL(string: req.parameters.get("url")!) return req.client.get("https://isitdown.site/api/v3/\(url!)").flatMapThrowing { res in try res.content.decode(isItUp.self) }.map { json in ["down": String(json.isitdown), "code": String(json.response_code)] } } app.get("login") { req -> EventLoopFuture in let fileData = try String(contentsOfFile: "\(app.directory.resourcesDirectory)/config.json").data(using: .utf8) let config: Config = try! JSONDecoder().decode(Config.self, from: fileData!) return req.view.render("login", LContext(config: config, loggedIn: false)) } app.post("login") { req -> Response in let data = try req.content.decode(Login.self) let fileData = try String(contentsOfFile: "\(app.directory.resourcesDirectory)/config.json").data(using: .utf8) let config: Config = try! JSONDecoder().decode(Config.self, from: fileData!) let loginPassData = data.password?.data(using: .utf8) let loginPassHash = SHA256.hash(data: loginPassData ?? "".data(using: .utf8)!) let stringHash = loginPassHash.map { String(format: "%02hhx", $0) }.joined() if stringHash == config.passwordHash { req.session.data["loggedIn"] = "true" return try req.redirect(to: "/") } else { throw Abort(.unauthorized) } } app.get("logout") { req -> Response in req.session.destroy() return try req.redirect(to: "/") } }