diff --git a/cmd/invitectl/README.md b/cmd/invitectl/README.md index f9999859e9b0fbf5d67b5088c54a0125c63f8115..d92acb0605b102c1db297586639e18eb73c4427c 100644 --- a/cmd/invitectl/README.md +++ b/cmd/invitectl/README.md @@ -15,6 +15,7 @@ Usage: invitectl [command] Available Commands: + check Show bucket(s) for a supplied invite token completion Generate the autocompletion script for the specified shell delete Delete Invite Tokens in db by bucket(s) or by key delete-all Delete all invite tokens in database @@ -119,3 +120,13 @@ pea@peabox: ./invitectl --db invites.db delete-all • Successfully deleted all invite tokens in database ``` +## Check if invite token exists in database +``` +pea@peabox:invitectl go run ./main.go check --db invites.db -t solitech_U2Zjyzx4SokbP2u+YP2gKw== +INF Checking invite token solitech_U2Zjyzx4SokbP2u+YP2gKw== +DBG SHA265 hashed and base64 encoded invite token (saved in db): ZqL2zZj0EcRf2XzNB4XwnMYzB5z5DVzp926UHoeNtJY= +DBG Looking in the database for hashed invite token ZqL2zZj0EcRf2XzNB4XwnMYzB5z5DVzp926UHoeNtJY= +INF invite token (hashed) buckets +INF ZqL2zZj0EcRf2XzNB4XwnMYzB5z5DVzp926UHoeNtJY= bucket1 + +``` diff --git a/cmd/invitectl/cmd/check.go b/cmd/invitectl/cmd/check.go new file mode 100644 index 0000000000000000000000000000000000000000..ac093935328ef729f33f0f4562fe82d38d253481 --- /dev/null +++ b/cmd/invitectl/cmd/check.go @@ -0,0 +1,57 @@ +package cmd + +import ( + "bufio" + "fmt" + "os" + "strings" + + "0xacab.org/leap/menshen/storage" + "github.com/rs/zerolog/log" + "github.com/spf13/cobra" +) + +var checkCmd = &cobra.Command{ + Use: "check", + Short: "Show bucket(s) for a supplied invite token", + Run: func(cmd *cobra.Command, args []string) { + doCheckInviteToken(cmd) + }, +} + +var token string + +func init() { + rootCmd.AddCommand(checkCmd) + checkCmd.Flags().StringVarP(&token, "token", "t", "", "Invite token you want to check. Use - to enter invite code interactively") +} + +func doCheckInviteToken(cmd *cobra.Command) { + + if len(token) == 0 { + log.Error().Msg("Invite token needs to be specified") + cmd.Help() // nolint: errcheck + os.Exit(1) + } + + if token == "-" { + reader := bufio.NewReader(os.Stdin) + fmt.Print("Enter invite token: ") + var err error + token, err = reader.ReadString('\n') + failOnError("Could not read string from command line", err) + token = strings.TrimSpace(token) + } + checkInviteToken() +} + +func checkInviteToken() { + log.Info().Msgf("Checking invite token %s", token) + hashedToken := hashInviteToken(token) + + db, err := storage.OpenDatabase(dbPath) + failOnError("Could not open database", err) + defer db.Close() + + printBucketsByInviteToken(db, hashedToken) +} diff --git a/cmd/invitectl/cmd/db.go b/cmd/invitectl/cmd/db.go index 94bb196e0662f83867c1489260033c8d5d2a2e2f..5085c609329bf7bd3b5d7c787927ad670edf716a 100644 --- a/cmd/invitectl/cmd/db.go +++ b/cmd/invitectl/cmd/db.go @@ -5,6 +5,7 @@ import ( "strings" "github.com/jmoiron/sqlx" + "github.com/rs/zerolog/log" ) func getInviteTokens(db *sqlx.DB) ([]InviteToken, error) { @@ -30,6 +31,22 @@ func getInviteTokens(db *sqlx.DB) ([]InviteToken, error) { return tokens, nil } +func printBucketsByInviteToken(db *sqlx.DB, hashedInviteToken string) { + log.Debug().Msgf("Looking in the database for hashed invite token %s", hashedInviteToken) + + stmt, err := db.Prepare(`SELECT buckets FROM tokens WHERE key = ?`) + failOnError("Could not create prepared statement", err) + defer stmt.Close() + + row := stmt.QueryRow(hashedInviteToken) + + var buckets string + err = row.Scan(&buckets) + failOnError("Could not read from database", err) + log.Info().Msgf("%45s %s", "invite token (hashed)", "buckets") + log.Info().Msgf("%45s %s", hashedInviteToken, buckets) +} + func insertInviteToken(db *sqlx.DB, token InviteToken) error { err := token.Validate() if err != nil { diff --git a/cmd/invitectl/cmd/delete.go b/cmd/invitectl/cmd/delete.go index 794be33a1a0b6dbe8d10dbe6c2b9b33aae5142df..40027f99d0b67b7ca2ff38624b87571b20ee6e1f 100644 --- a/cmd/invitectl/cmd/delete.go +++ b/cmd/invitectl/cmd/delete.go @@ -23,7 +23,7 @@ var deleteToken string func init() { rootCmd.AddCommand(deleteCmd) deleteCmd.Flags().StringVarP(&deleteBucket, "bucket", "b", "", "Delete all invite tokens in the db that belong to the given bucket") - deleteCmd.Flags().StringVarP(&deleteToken, "token", "t", "", "Delete invite token(s) with the specified invite token. Use - to enter invite code manually") + deleteCmd.Flags().StringVarP(&deleteToken, "token", "t", "", "Delete invite token(s) with the specified invite token. Use - to enter invite code interactively") } func doDeleteInviteToken(cmd *cobra.Command, args []string) {