feat: add README.md (#17)
This commit is contained in:
parent
7632df40da
commit
0de280e634
|
@ -50,6 +50,6 @@ jobs:
|
||||||
- name: Run go vet
|
- name: Run go vet
|
||||||
run: go vet ./...
|
run: go vet ./...
|
||||||
- name: Run go build
|
- name: Run go build
|
||||||
run: go build ./...
|
run: go build
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: go test -race -coverprofile=coverage.txt -covermode=atomic ./...
|
run: go test -race -coverprofile=coverage.txt -covermode=atomic ./...
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
### gootp
|
||||||
|
|
||||||
|
gootp is a terminal-based 2FA (Two-Factor Authentication) app.
|
||||||
|
|
||||||
|
[![asciicast](https://asciinema.org/a/s9eF7EbqgnCkoLVwbv0TE0a8Y.svg)](https://asciinema.org/a/s9eF7EbqgnCkoLVwbv0TE0a8Y)
|
||||||
|
|
||||||
|
## Features
|
||||||
|
- Supported algorithms: TOTP
|
||||||
|
- Compatible with [andOTP](https://github.com/andOTP/andOTP) file format
|
||||||
|
- Allows to encrypt/decrypt andOTP files on your PC
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Requirements:
|
||||||
|
1. Go 1.18+
|
||||||
|
2. [Exported andOTP file](https://github.com/andOTP/andOTP#backups=)
|
||||||
|
|
||||||
|
```shell
|
||||||
|
go install github.com/Kichiyaki/gootp@latest
|
||||||
|
cp /path/to/andotp/file ~/.otp_accounts.json # !IMPORTANT! this file must be encrypted
|
||||||
|
```
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```shell
|
||||||
|
gootp # show OTP list
|
||||||
|
gootp -h # help for gootp
|
||||||
|
gootp -p /path/to/andotp/file/.otp_accounts.json # override default path
|
||||||
|
gootp --password xxx # specify encryption password via flag
|
||||||
|
gootp -p /path/to/andotp/file/.otp_accounts.json encrypt -o /output/.otp_accounts.json.aes # encrypt file
|
||||||
|
gootp -p /path/to/andotp/file/.otp_accounts.json decrypt -o /output/.otp_accounts.json.aes # decrypt file
|
||||||
|
```
|
13
main.go
13
main.go
|
@ -5,6 +5,7 @@ import (
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
|
"runtime/debug"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
tea "github.com/charmbracelet/bubbletea"
|
tea "github.com/charmbracelet/bubbletea"
|
||||||
|
@ -14,8 +15,6 @@ import (
|
||||||
"golang.org/x/term"
|
"golang.org/x/term"
|
||||||
)
|
)
|
||||||
|
|
||||||
var Version = "development"
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
app, err := newApp()
|
app, err := newApp()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -32,10 +31,12 @@ func newApp() (*cli.App, error) {
|
||||||
return nil, fmt.Errorf("couldn't get user home dir: %w", err)
|
return nil, fmt.Errorf("couldn't get user home dir: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
buildInfo, _ := debug.ReadBuildInfo()
|
||||||
|
|
||||||
return &cli.App{
|
return &cli.App{
|
||||||
Name: "gootp",
|
Name: "gootp",
|
||||||
Usage: "2FA App compatible with andOTP backup file format",
|
Usage: "Two-Factor Authentication (2FA) App compatible with andOTP file format",
|
||||||
Version: Version,
|
Version: buildInfo.Main.Version,
|
||||||
Action: func(c *cli.Context) error {
|
Action: func(c *cli.Context) error {
|
||||||
password, err := getPassword(c)
|
password, err := getPassword(c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -85,7 +86,7 @@ func newApp() (*cli.App, error) {
|
||||||
func newDecryptCommand() *cli.Command {
|
func newDecryptCommand() *cli.Command {
|
||||||
return &cli.Command{
|
return &cli.Command{
|
||||||
Name: "decrypt",
|
Name: "decrypt",
|
||||||
Usage: "Decrypts the specified backup file",
|
Usage: "Decrypts the specified file",
|
||||||
Action: newEncryptDecryptActionFunc(internal.Decrypt),
|
Action: newEncryptDecryptActionFunc(internal.Decrypt),
|
||||||
Flags: []cli.Flag{
|
Flags: []cli.Flag{
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
|
@ -101,7 +102,7 @@ func newDecryptCommand() *cli.Command {
|
||||||
func newEncryptCommand() *cli.Command {
|
func newEncryptCommand() *cli.Command {
|
||||||
return &cli.Command{
|
return &cli.Command{
|
||||||
Name: "encrypt",
|
Name: "encrypt",
|
||||||
Usage: "Encrypts the specified file file using AES-256",
|
Usage: "Encrypts the specified file",
|
||||||
Action: newEncryptDecryptActionFunc(internal.Encrypt),
|
Action: newEncryptDecryptActionFunc(internal.Encrypt),
|
||||||
Flags: []cli.Flag{
|
Flags: []cli.Flag{
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
|
|
Reference in New Issue