package xyz.maxwellj.mapm import fuel.Fuel import fuel.get import java.io.File import java.math.BigInteger import java.security.MessageDigest import kotlin.system.exitProcess import org.tukaani.xz.XZInputStream import java.io.* import org.apache.commons.compress.archivers.tar.TarArchiveInputStream import java.io.BufferedInputStream import java.io.FileInputStream import java.nio.file.Files import java.nio.file.Paths fun uncompressXZFile(inputFile: String, outputFile: String) { XZInputStream(FileInputStream(inputFile)).use { input -> FileOutputStream(outputFile).use { output -> input.copyTo(output) } } } fun unarchiveTarFile(tarFilePath: String, outputDirectoryPath: String) { val tarFile = File(tarFilePath) val outputDir = File(outputDirectoryPath) if (!outputDir.exists()) { outputDir.mkdirs() } TarArchiveInputStream(BufferedInputStream(FileInputStream(tarFile))).use { tarIn -> var entry = tarIn.nextTarEntry while (entry != null) { val outputFile = File(outputDir, entry.name) if (entry.isDirectory) { outputFile.mkdirs() } else { outputFile.parentFile.mkdirs() Files.copy(tarIn, Paths.get(outputFile.absolutePath)) } entry = tarIn.nextTarEntry } } } // hurrah for https://stackoverflow.com/questions/64171624/how-to-generate-an-md5-hash-in-kotlin! fun md5(input:String): String { val md = MessageDigest.getInstance("MD5") return BigInteger(1, md.digest(input.toByteArray())).toString(16).padStart(32, '0') } suspend fun main() { println("Welcome to Mapm! What would you like to do? Type help for some help.") val userInput = readln() if (userInput == "grab") { println("What would you like to grab?") val userInput = readln() val linkToUse = "https://git.maxwellj.xyz/mapm/stable/raw/branch/main/$userInput" val dingus = Fuel.get(linkToUse).body.string() println(dingus) val file = File("/usr/mapm/tmp/$userInput.tar.xz") // file.writeBytes((Fuel.get(dingus).body.string()).toByteArray()) val fileBytes = Fuel.get(dingus).body.bytes() file.writeBytes(fileBytes) val fileChecksum = Fuel.get("https://git.maxwellj.xyz/mapm/stable/raw/branch/main/$userInput.hash").body.string() if (fileChecksum == md5(file.readText())) { println("Checksum matches!") uncompressXZFile(inputFile = "/usr/mapm/tmp/${userInput}.tar.xz", outputFile = "/usr/mapm/tmp/${userInput}.tar") unarchiveTarFile(tarFilePath = "/usr/mapm/tmp/${userInput}.tar", outputDirectoryPath = "/usr/mapm/") Runtime.getRuntime().exec("chmod +x /usr/mapm/${userInput}") println("Finished!") exitProcess(0) } else { println("Checksum doesn't match! Aborting...") println("Please tell Max or your app's developer to use mapm to generate a new checksum. If the checksum is right, check your internet connection security.") exitProcess(1) } } else if (userInput == "delete") { println("What would you like to delete?") val userInput = readln() } else if (userInput == "checksum") { println("What file would you like to generate a checksum of? Type the whole path") val userInput = readln() val file = File(userInput) println("Checksum of that file is ${md5(file.readText())}") } }