import Vapor import Foundation import FoundationNetworking 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 -> [String: String] in let url = URL(string: "http://\(req.parameters.get("url")!)") let config = URLSessionConfiguration.default config.timeoutIntervalForRequest = 5 config.timeoutIntervalForResource = 5 var statusDict: [String:String] = [:] var headReq = URLRequest(url: url!) headReq.httpMethod = "HEAD" headReq.timeoutInterval = 5 let semaphore = DispatchSemaphore(value: 0) URLSession.shared.dataTask(with: headReq, completionHandler: { (_, response, error) in if let httpURLResponse = response as? HTTPURLResponse { statusDict["code"] = String(httpURLResponse.statusCode) statusDict["down"] = "false" } semaphore.signal() }).resume() semaphore.wait() return statusDict.count > 0 ? statusDict : ["code": "0", "down": "true"] } 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: "/") } }