Mercurial > cgi-bin > hgweb.cgi > PassMan
view src/main/kotlin/name/blackcap/passman/ReadSubcommand.kt @ 6:711cc42e96d7
Got the list subcommand working, but needs efficiency improvements.
author | David Barts <n5jrn@me.com> |
---|---|
date | Tue, 20 Sep 2022 20:52:21 -0700 |
parents | eafa3779aef8 |
children | 698c4a3d758d |
line wrap: on
line source
package name.blackcap.passman import org.apache.commons.cli.* import kotlin.system.exitProcess class ReadSubcommand(): Subcommand() { private lateinit var commandLine: CommandLine override fun run(args: Array<String>) { val options = Options().apply { addOption("c", "clipboard", false, "Copy username and password into clipboard.") addOption("h", "help", false, "Print this help message.") addOption("l", "long", false, "Long format listing.") } try { commandLine = DefaultParser().parse(options, args) } catch (e: ParseException) { die(e.message ?: "syntax error", 2) } if (commandLine.hasOption("help")) { HelpFormatter().printHelp("$SHORTNAME read", options) exitProcess(0) } val clipboard = commandLine.hasOption("clipboard") val long = commandLine.hasOption("long") if (commandLine.args.isEmpty()) { error("expecting site name") } if (commandLine.args.size > 1) { error("unexpected trailing arguments") } val nameIn = commandLine.args[0]; val db = Database.open() val id = db.makeKey(nameIn) db.connection.prepareStatement("select name, username, password, notes, created, modified, accessed from passwords where id = ?").use { it.setLong(1, id) val result = it.executeQuery() if (!result.next()) { die("no record matches ${see(nameIn)}") } val entry = Entry( name = result.getDecryptedString(1, db.encryption), username = result.getDecryptedString(2, db.encryption), password = result.getDecrypted(3, db.encryption), notes = result.getDecryptedString(4, db.encryption), created = result.getDate(5), modified = result.getDate(6), accessed = result.getDate(7) ) try { val redaction = if (clipboard) { "(in clipboard)" } else { null } if (long) { entry.printLong(redaction) } else { entry.print(redaction) } if (clipboard) { writeToClipboard(entry.password) } } finally { entry.password.clear() } } db.connection.prepareStatement("update passwords set accessed = ? where id = ?").use { it.setLong(1, System.currentTimeMillis()) it.setLong(2, id) it.execute() } } }