Age | Commit message (Collapse) | Author |
|
I wrote this program before I started using sysexits. Now, a different
exit code makes more sense.
|
|
|
|
* -V and --version now print the program version and exit
* Use the `exitcode` crate
* Rename `options` variable to `accepted_args`, which seems clearer
given its usage.
|
|
When investigating how to add a `--version` argument, I was confused by
this naming and thought that "options" referred to command line options.
Rename the variable to make its purpose clearer.
|
|
|
|
|
|
|
|
* Remove old in-progress code
* Remove `child.stdout.take()` call, which is suggested in
https://doc.rust-lang.org/std/process/struct.Child.html#structfield.stdout
but ended up not being necessary in this instance.
|
|
Previously, Passextract didn't work with GnuPG 2 because I was
immediately collecting the output of `pass`.
With GnuPG 1.4, the password prompt was like a conventional `read`-style
password prompt. However, in GnuPG 2, the prompt is replaced with
Pinentry. Pinentry interferes with capturing the output from Pass, such
that Passextract exits immediately, without even prompting for a
password.
Instead of using `Command.output`, use `Command.spawn`. This allows
GnuPG to work correctly and display a Pinentry prompt. We can then
capture the standard output from the child process and parse it for the
Passextract interface.
|
|
|
|
Previously, when the "invisible" flag was activated, we wouldn't print
anything except the "p: " prefix on a password line. This made it
difficult to verify the password, and if you for some reason had
multiple passwords, you wouldn't know which one to pick unless you knew
the order.
This at least gives you a visual cue about your password.
|
|
Instead of the convoluted hard-to-read `hide_password &&` nonsense, give
ourselves a way to express the condition in terms of the argument _not_
being one of our accepted options (only `-i`). This ensures that we
either capture the filename in the last argument or use STDIN.
|
|
Connect the `-i` argument flag to the renderer. If the arg was passed,
hide passwords, otherwise show them.
Change `args.first()` to `args.get(1)` because the actual first element
is the command executable.
Not happy with the condition I'm using here to grab the password file or
the STDIN `-`. It doesn't read well at all. It all does work, but this
part I want to rewrite to make it easier to read.
|
|
Turn on a `hide_password` boolean variable if an `-i` argument is passed
in (haven't tested this yet). This tells us whether the user wants us to
hide the password in the selection interface.
|
|
Instead of rendering the password string, hide it while allowing it to
be copied. It is identified by the "p: " prefix, but nothing follows
that.
This allows you to run `passextract` without having to worry about
others peering over your shoulder or about screen capture or recording
hacks.
I'll be adding a command line flag to force you to opt in to this
feature, while keeping the old functionality the same.
|
|
The last thing copied from Passextract will stick around in your
clipboard, potentially opening up your password to accidental pasting or
a clipboard exploit.
Pass deals with this in a nice way, by restoring your clipboard back to
what was copied before after a set time delay.
Here that same functionality is more difficult to achieve because the
Clipboard crate can only deal with strings. So if for example you've
copied a file, an image, a program's proprietary type, or some other
binary data, it can't be restored with the Clipboard crate. Pass is able
to do this because it uses the OS X `pbcopy`/`pbpaste` commands under
the hood, which do support binary data. We could do that here I suppose,
but it's easier and cross-platform to leverage a library.
My heavy-handed solution to the problem of clipboard insecurity is to
just overwrite the clipboard with an empty string when Passextract
quits. The solution is not ideal because it doesn't preserve your past
clipboard entry, and it forces you to keep the Passextract menu open
until you paste the copied entry, but it's better than nothing when it
comes to keeping the clipboard secure.
If there's an error writing to the clipboard, Passextract will refuse to
quit.
|
|
`g`: moves the selection to the first option
`G`: moves the selection to the last option
This allows for faster selection if there are more than 2–3 options.
Using `g` still allows `gg` to work since doubling the command doesn't
change its meaning.
|
|
Values that contained ": " would not be parsed correctly for copying to
the clipboard. If, for example, a password contained ": ", those
characters and any following them wouldn't be copied. This change allows
such passwords to be copied correctly.
|
|
Also include brief notices in the source files. Not a fan of the huge
blocks of text that the FSF recommends.
|
|
|
|
Get option extraction/parsing working both for STDIN and for calls to
`pass show`.
If no argument is passed to the executable or the first argument is "-",
options are read from STDIN. Otherwise, the first argument is passed to
`pass show`, the output of which is parsed as options.
|
|
Temporarily comment out code that deals with STDIN to get this feature
working. It complicated things to leave it in right now.
Given an argument that isn't "-" (STDIN), we pass that argument to `pass
show`. Users correctly get a password prompt from `pass`, and the output
from the command gets sent to the Passextract TUI for display in the
menu and copying.
|
|
|
|
Remove the duplication of these lines for the `j` and `k` commands by
extracting them to a function.
|
|
Make the title appear in white-on-black knockout text.
|
|
Use `_` for the default/general case. Do nothing in this case, just
continue looping.
|
|
Delete this line from the TUI display and adjust the real output lines
to be one line higher.
|
|
Don't move the cursor when the selection is changed. It was flickering,
which looked rather distracting. Removing the cursor makes the interface
look more fluid and snappy.
|
|
Read STDIN and get all lines that start with "e: ", "u: ", and "p: ". If
none are found, exit.
These lines get added to the `options` vector which then gets displayed
in the TUI. Since the contents of the vector are different from our
hard-coded one, use a borrow on the clipboard write call.
|
|
Change the colour of the selection arrow to red if there's an error and
green if the clipboard was written to successfully.
The colour only lasts for 100 milliseconds because that's the refresh
rate of the loop. This seems to be a nice way to briefly offer a visual
notification and automatically return the interface to normal right
afterward.
|
|
Better readability and it's the same. It looked a little darker than
white, that's why I changed it, but they're the same.
|
|
|
|
Lines are formatted like:
e: email@example.com
This function turns that into:
email@example.com
It will be used to strip the "key" so that we can copy only the "value"
part of the line to the system clipboard.
|
|
The selection arrow can now be moved. Not liking the code duplication.
We'll have to figure something out to sort that.
|
|
Decided to track the location of the selection in a struct and make a
function to move the current selection. But I can't mutably borrow the
terminal because it's already mutable.
Will need to rethink this.
|
|
Create a hard-coded list of options for testing and print them to the
terminal interface.
These will eventually be selectable with `j`,`k`.
|
|
Print a URLView-like arrow for choice selection.
|
|
Alo update the title text with information on how to quit.
|
|
Output a single string to the terminal in the alternate screen. This
allows us to test the base functionality of what we'll need for a dialog
a la URLView.
Used Rustty's examples as a big reference.
|
|
Initialise a new project with `cargo init --bin`.
|