Initial commit
This commit is contained in:
		
							
								
								
									
										219
									
								
								server/src/main/kotlin/Main.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										219
									
								
								server/src/main/kotlin/Main.kt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,219 @@
 | 
			
		||||
package xyz.maxwellj.chookpen
 | 
			
		||||
 | 
			
		||||
import com.sun.net.httpserver.HttpExchange
 | 
			
		||||
import com.sun.net.httpserver.HttpHandler
 | 
			
		||||
import com.sun.net.httpserver.HttpServer
 | 
			
		||||
import java.net.InetSocketAddress
 | 
			
		||||
 | 
			
		||||
import java.io.File
 | 
			
		||||
import java.io.BufferedReader
 | 
			
		||||
 | 
			
		||||
fun main(args: Array<String>) {
 | 
			
		||||
    // Crete a server and start listening for arguments
 | 
			
		||||
    val server = HttpServer.create(InetSocketAddress(8000), 0)
 | 
			
		||||
    server.createContext("/test", ServerTester())
 | 
			
		||||
    server.createContext("/api", ApiHandler())
 | 
			
		||||
    server.createContext("/api/createAccount", CreateAccount())
 | 
			
		||||
    server.executor = null
 | 
			
		||||
    server.start()
 | 
			
		||||
    println("Server has started on port 8000")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class ServerTester : HttpHandler {
 | 
			
		||||
    override fun handle(t: HttpExchange) {
 | 
			
		||||
        val response = "Testing, testing, 1, 2, 3... Somehow this is going to make it to production one day"
 | 
			
		||||
        t.sendResponseHeaders(200, response.length.toLong())
 | 
			
		||||
        val os = t.responseBody
 | 
			
		||||
        os.write(response.toByteArray())
 | 
			
		||||
	println("Test request recieved!")
 | 
			
		||||
        os.close()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class ApiHandler : HttpHandler {
 | 
			
		||||
    override fun handle(t: HttpExchange) {
 | 
			
		||||
        println("Request recieved...")
 | 
			
		||||
        // Get the data
 | 
			
		||||
        val path = t.requestURI.path
 | 
			
		||||
        val inputData = path.substringAfter("/api/")
 | 
			
		||||
        println("API request recieved: $inputData")
 | 
			
		||||
       
 | 
			
		||||
        // Parse data sent to the server by client
 | 
			
		||||
        var username = ""
 | 
			
		||||
        var token = ""
 | 
			
		||||
        var message = ""
 | 
			
		||||
        var dataType = ""
 | 
			
		||||
        var isParsingData = 0
 | 
			
		||||
        for (char in inputData) {
 | 
			
		||||
            val character = char
 | 
			
		||||
            if (character == ':') {
 | 
			
		||||
                isParsingData = 1
 | 
			
		||||
            } else if (isParsingData == 1) {
 | 
			
		||||
                if (character == '}') {
 | 
			
		||||
                    isParsingData = 0
 | 
			
		||||
                    dataType = ""
 | 
			
		||||
                } else if (character != '{') {
 | 
			
		||||
                    if (dataType == "username") {
 | 
			
		||||
                        username += character
 | 
			
		||||
                    } else if (dataType == "token") {
 | 
			
		||||
                        token += character
 | 
			
		||||
                    } else if (dataType == "message") {
 | 
			
		||||
                        message += character
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                dataType += character
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        val userDatabaseParser = BufferedReader(File("userDatabase").reader())
 | 
			
		||||
        var lineNumber = 1
 | 
			
		||||
        var userLine = ""
 | 
			
		||||
    
 | 
			
		||||
        // Search the user database to find required information about the user
 | 
			
		||||
        userDatabaseParser.forEachLine { line ->
 | 
			
		||||
            if (line.contains(username)) {
 | 
			
		||||
                userLine = line
 | 
			
		||||
            }
 | 
			
		||||
            lineNumber++
 | 
			
		||||
        }
 | 
			
		||||
        userDatabaseParser.close()
 | 
			
		||||
 | 
			
		||||
        if (userLine == "") {
 | 
			
		||||
            val response = "That account does not exist on this server."
 | 
			
		||||
            t.sendResponseHeaders(403, response.length.toLong())
 | 
			
		||||
            val os = t.responseBody
 | 
			
		||||
            os.write(response.toByteArray())
 | 
			
		||||
            os.close()
 | 
			
		||||
            return
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
        var usernameInDatabase = ""
 | 
			
		||||
        var tokenInDatabase = ""
 | 
			
		||||
        var currentStage = 0
 | 
			
		||||
        for (char in userLine) {
 | 
			
		||||
            if (char == ':') {
 | 
			
		||||
                currentStage ++
 | 
			
		||||
            }
 | 
			
		||||
            if (currentStage == 0) {
 | 
			
		||||
                usernameInDatabase += char
 | 
			
		||||
            } else if (currentStage == 1) {
 | 
			
		||||
                tokenInDatabase += char
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        tokenInDatabase = tokenInDatabase.replace(":", "")
 | 
			
		||||
        if (token != tokenInDatabase)  {
 | 
			
		||||
            val response = "Invalid token! Please try putting in your password right"
 | 
			
		||||
            t.sendResponseHeaders(403, response.length.toLong())
 | 
			
		||||
            val os = t.responseBody
 | 
			
		||||
            os.write(response.toByteArray())
 | 
			
		||||
            os.close()
 | 
			
		||||
            return
 | 
			
		||||
        }
 | 
			
		||||
        // Make the message to respond to the client
 | 
			
		||||
        val chatHistoryView = File("chatHistory")
 | 
			
		||||
        var fullMessage = ""
 | 
			
		||||
        if (message != "") {
 | 
			
		||||
            fullMessage = "${chatHistoryView.readText()}$username: $message"
 | 
			
		||||
            // Add the client's message to the chat history
 | 
			
		||||
            val chatHistory = File("chatHistory")
 | 
			
		||||
            chatHistory.appendText("$username: $message ${System.lineSeparator()}")
 | 
			
		||||
            message = ""
 | 
			
		||||
        } else {
 | 
			
		||||
            fullMessage = "${chatHistoryView.readText()}"
 | 
			
		||||
        }
 | 
			
		||||
        val response = if (inputData.isNotEmpty()) {
 | 
			
		||||
            fullMessage            
 | 
			
		||||
        } else {
 | 
			
		||||
            "No data provided"
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Send the message to the client
 | 
			
		||||
        t.sendResponseHeaders(200, response.length.toLong())
 | 
			
		||||
        val os = t.responseBody
 | 
			
		||||
        os.write(response.toByteArray())
 | 
			
		||||
        println("API request handled: $inputData")
 | 
			
		||||
        os.close()
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
class CreateAccount : HttpHandler {
 | 
			
		||||
    override fun handle(t: HttpExchange) {
 | 
			
		||||
        val path = t.requestURI.path
 | 
			
		||||
        val inputData = path.substringAfter("/api/createAccount/")
 | 
			
		||||
        println("Account creation request recieved: $inputData")
 | 
			
		||||
       
 | 
			
		||||
        // Parse data sent to the server by client
 | 
			
		||||
        var username = ""
 | 
			
		||||
        var token = ""
 | 
			
		||||
        var message = ""
 | 
			
		||||
        var dataType = ""
 | 
			
		||||
        var isParsingData = 0
 | 
			
		||||
        for (char in inputData) {
 | 
			
		||||
            val character = char
 | 
			
		||||
            if (character == ':') {
 | 
			
		||||
                isParsingData = 1
 | 
			
		||||
            } else if (isParsingData == 1) {
 | 
			
		||||
                if (character == '}') {
 | 
			
		||||
                    isParsingData = 0
 | 
			
		||||
                    dataType = ""
 | 
			
		||||
                } else if (character != '{') {
 | 
			
		||||
                    if (dataType == "username") {
 | 
			
		||||
                        username += character
 | 
			
		||||
                    } else if (dataType == "token") {
 | 
			
		||||
                        token += character
 | 
			
		||||
                    } else if (dataType == "message") {
 | 
			
		||||
                        message += character
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                dataType += character
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        val userDatabaseParser = BufferedReader(File("userDatabase").reader())
 | 
			
		||||
        var lineNumber = 1
 | 
			
		||||
        var userExists = 0
 | 
			
		||||
    
 | 
			
		||||
        // Search the user database to find required information about the user
 | 
			
		||||
        userDatabaseParser.forEachLine { line ->
 | 
			
		||||
            if (line.contains(username)) {
 | 
			
		||||
                val response = "That username already exists on the server! Please choose a different username"
 | 
			
		||||
                t.sendResponseHeaders(422, response.length.toLong())
 | 
			
		||||
                val os = t.responseBody
 | 
			
		||||
                os.write(response.toByteArray())
 | 
			
		||||
                os.close()
 | 
			
		||||
                userExists = 1
 | 
			
		||||
            }
 | 
			
		||||
            lineNumber++
 | 
			
		||||
        }
 | 
			
		||||
        userDatabaseParser.close()
 | 
			
		||||
        if (userExists == 1) {return}
 | 
			
		||||
        println("$username:$token")
 | 
			
		||||
 | 
			
		||||
        if (username == "") {
 | 
			
		||||
            val response = "Please input a username"
 | 
			
		||||
            t.sendResponseHeaders(422, response.length.toLong())
 | 
			
		||||
            val os = t.responseBody
 | 
			
		||||
            os.write(response.toByteArray())
 | 
			
		||||
            os.close()
 | 
			
		||||
            return
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (token == "") {
 | 
			
		||||
            val response = "Please input a password"
 | 
			
		||||
            t.sendResponseHeaders(422, response.length.toLong())
 | 
			
		||||
            val os = t.responseBody
 | 
			
		||||
            os.write(response.toByteArray())
 | 
			
		||||
            os.close()
 | 
			
		||||
            return
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        val userDatabaseFile = File("userDatabase")
 | 
			
		||||
        userDatabaseFile.appendText("${System.lineSeparator()}$username:$token")
 | 
			
		||||
        val response = "Creating account was successful!"
 | 
			
		||||
        t.sendResponseHeaders(200, response.length.toLong())
 | 
			
		||||
        val os = t.responseBody
 | 
			
		||||
        os.write(response.toByteArray())
 | 
			
		||||
	    println("")
 | 
			
		||||
        os.close()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user