view src/main/kotlin/name/blackcap/passman/Entry.kt @ 9:72619175004e

Fix issues found in testing.
author David Barts <n5jrn@me.com>
date Sat, 01 Oct 2022 09:57:23 -0700
parents 698c4a3d758d
children c69665ff37d0
line wrap: on
line source

package name.blackcap.passman

import java.util.*
import kotlin.reflect.KProperty
import kotlin.reflect.full.declaredMemberProperties

class Entry(val name: String, val username: String, val password: CharArray, val notes: String?,
            val created: Date? = null, val modified: Date? = null, val accessed: Date? = null) {

    companion object {
        private val FIELD_MAP = mutableMapOf<String, KProperty.Getter<*>>().apply {
            Entry::class.declaredMemberProperties.forEach{
                this[it.name] = it.getter
            }
        }

        fun withPromptedPassword() = Entry(
                name = _getName(),
                username = _getUsername(),
                password = _getPassword(),
                notes = _getNotes()
            )

        fun withGeneratedPassword(length: Int, allowSymbols: Boolean, verbose: Boolean): Entry {
            return Entry(
                name = _getName(),
                username = _getUsername(),
                password = _genPassword(length, allowSymbols, verbose),
                notes = _getNotes()
            )
        }

        private fun _genPassword(length: Int, allowSymbols: Boolean, verbose: Boolean): CharArray {
            val generated = generate(length, allowSymbols)
            if (verbose) {
                printPassword(generated)
            }
            return generated
        }

        private fun _getName() = mustReadLine("Name of site: ")

        private fun _getUsername() = mustReadLine("Username: ")

        private fun _getPassword() = mustGetPassword("Password: ", verify = true)

        private fun _getNotes() = readLine("Notes: ")
    }

    fun print(redactPassword: String? = null) {
        println("Name of site: $name")
        println("Username: $username")
        if (redactPassword == null) {
            printPassword(password)
        } else {
            println("Password: $redactPassword")
        }
    }

    fun printLong(redactPassword: String? = null) {
        this.print(redactPassword)
        println("Notes: ${notes ?: "(none)"}")
        printDate("Created", created)
        printDate("Modified", modified)
        printDate("Accessed", accessed)
    }

    fun getField(name: String): Any? {
        return FIELD_MAP[name]!!.call(this)
    }

    private fun printDate(tag: String, date: Date?) {
        kotlin.io.print("${tag}: ")
        if (date == null) {
            println("never")
        } else {
            println(ISO8601.format(date))
        }
    }
}