Mercurial > cgi-bin > hgweb.cgi > PassMan
annotate src/main/kotlin/name/blackcap/passman/RenameSubcommand.kt @ 20:4391afcf6bd0
Fix more bugs, correct more bad tests.
author | David Barts <n5jrn@me.com> |
---|---|
date | Sun, 30 Jun 2024 22:28:52 -0700 |
parents | 0fc90892a3ae |
children | ea65ab890f66 |
rev | line source |
---|---|
11 | 1 package name.blackcap.passman |
2 | |
3 import org.apache.commons.cli.* | |
14
4dae7a15ee48
Fix bugs found in additional round of testing.
David Barts <n5jrn@me.com>
parents:
11
diff
changeset
|
4 import java.sql.PreparedStatement |
4dae7a15ee48
Fix bugs found in additional round of testing.
David Barts <n5jrn@me.com>
parents:
11
diff
changeset
|
5 import java.sql.Types |
11 | 6 import kotlin.system.exitProcess |
7 | |
8 class RenameSubcommand(): Subcommand() { | |
9 private companion object { | |
10 const val FORCE = "force" | |
11 const val HELP = "help" | |
12 } | |
13 private lateinit var commandLine: CommandLine | |
14 private lateinit var source: String | |
15 private lateinit var destination: String | |
16 private lateinit var db: Database | |
17 | |
18 override fun run(args: Array<String>) { | |
19 parseArguments(args) | |
20 db = Database.open() | |
21 renameIt() | |
22 } | |
23 | |
24 private fun parseArguments(args: Array<String>) { | |
25 val options = Options().apply { | |
26 addOption("f", FORCE, false, "If destination exists exists, force overwrite.") | |
27 addOption("h", HELP, false, "Print this help message.") | |
28 } | |
29 try { | |
30 commandLine = DefaultParser().parse(options, args) | |
31 } catch (e: ParseException) { | |
32 die(e.message ?: "syntax error", 2) | |
33 } | |
34 if (commandLine.hasOption(HELP)) { | |
35 HelpFormatter().printHelp("$SHORTNAME rename [options] source destination", options) | |
36 exitProcess(0) | |
37 } | |
38 if (commandLine.args.size < 2) { | |
39 die("expecting source and destination", 2) | |
40 } | |
41 if (commandLine.args.size > 2) { | |
42 die("unexpected trailing arguments", 2) | |
43 } | |
44 source = commandLine.args[0] | |
45 destination = commandLine.args[1] | |
46 } | |
47 | |
48 private fun renameIt(): Unit { | |
49 val sid = db.makeKey(source) | |
50 val did = db.makeKey(destination) | |
51 | |
52 if(!recordExists(sid)) { | |
53 die("no record matches ${see(source)}") | |
54 } | |
55 if (recordExists(did)) { | |
56 if (commandLine.hasOption(FORCE)) { | |
57 deleteRecord(did) | |
58 } else { | |
59 die("record matching ${see(destination)} already exists") | |
60 } | |
61 } | |
62 | |
63 db.connection.prepareStatement("select username, password, notes, created, modified, accessed from passwords where id = ?").use { sourceStmt -> | |
14
4dae7a15ee48
Fix bugs found in additional round of testing.
David Barts <n5jrn@me.com>
parents:
11
diff
changeset
|
64 sourceStmt.setLong(1, sid) |
11 | 65 val result = sourceStmt.executeQuery() |
66 result.next() | |
14
4dae7a15ee48
Fix bugs found in additional round of testing.
David Barts <n5jrn@me.com>
parents:
11
diff
changeset
|
67 db.connection.prepareStatement("insert into passwords (id, name, username, password, notes, created, modified, accessed) values (?, ?, ?, ?, ?, ?, ?, ?)").use { |
4dae7a15ee48
Fix bugs found in additional round of testing.
David Barts <n5jrn@me.com>
parents:
11
diff
changeset
|
68 it.setLong(1, did) |
4dae7a15ee48
Fix bugs found in additional round of testing.
David Barts <n5jrn@me.com>
parents:
11
diff
changeset
|
69 it.setEncryptedString(2, destination, db.encryption) |
4dae7a15ee48
Fix bugs found in additional round of testing.
David Barts <n5jrn@me.com>
parents:
11
diff
changeset
|
70 it.setBytes(3, result.getBytes(1)) |
4dae7a15ee48
Fix bugs found in additional round of testing.
David Barts <n5jrn@me.com>
parents:
11
diff
changeset
|
71 it.setBytes(4, result.getBytes(2)) |
4dae7a15ee48
Fix bugs found in additional round of testing.
David Barts <n5jrn@me.com>
parents:
11
diff
changeset
|
72 it.setBytesOrNull(5, result.getBytes(3)) |
4dae7a15ee48
Fix bugs found in additional round of testing.
David Barts <n5jrn@me.com>
parents:
11
diff
changeset
|
73 it.setLong(6, result.getLong(4)) |
4dae7a15ee48
Fix bugs found in additional round of testing.
David Barts <n5jrn@me.com>
parents:
11
diff
changeset
|
74 it.setLong(7, System.currentTimeMillis()) |
4dae7a15ee48
Fix bugs found in additional round of testing.
David Barts <n5jrn@me.com>
parents:
11
diff
changeset
|
75 it.setDateOrNull(8, result.getLong(6)) |
4dae7a15ee48
Fix bugs found in additional round of testing.
David Barts <n5jrn@me.com>
parents:
11
diff
changeset
|
76 it.executeUpdate() |
11 | 77 } |
78 } | |
79 | |
80 deleteRecord(sid) | |
81 } | |
82 | |
83 private fun recordExists(id: Long): Boolean { | |
84 db.connection.prepareStatement("select count(*) from passwords where id = ?").use { | |
85 it.setLong(1, id) | |
86 val result = it.executeQuery() | |
87 result.next() | |
88 return result.getInt(1) > 0 | |
89 } | |
90 } | |
91 | |
92 private fun deleteRecord(id: Long): Unit { | |
93 db.connection.prepareStatement("delete from passwords where id = ?").use { | |
94 it.setLong(1, id); | |
95 it.executeUpdate() | |
96 } | |
97 } | |
14
4dae7a15ee48
Fix bugs found in additional round of testing.
David Barts <n5jrn@me.com>
parents:
11
diff
changeset
|
98 } |