package lol.frijole.ampfire.subsonic import java.math.BigInteger import java.security.MessageDigest import java.security.SecureRandom class SubsonicAuth private constructor( private val username: String, private val token: String, private val salt: String, ) { fun params(): Map = mapOf( "u" to username, "t" to token, "s" to salt, "v" to "1.16.1", "c" to "AmpFire", "f" to "json", ) fun queryString(): String = params().map { (k, v) -> "$k=${java.net.URLEncoder.encode(v, "UTF-8")}" }.joinToString("&") companion object { fun forPassword(username: String, password: String): SubsonicAuth { val salt = BigInteger(64, SecureRandom()).toString(16) val digest = MessageDigest.getInstance("MD5").digest((password + salt).toByteArray()) .joinToString("") { "%02x".format(it) } return SubsonicAuth(username, digest, salt) } } }