list users
This commit is contained in:
@@ -82,6 +82,32 @@ MIT
|
|||||||
|
|
||||||
## FAQ
|
## FAQ
|
||||||
|
|
||||||
|
Q: How do I list all users?
|
||||||
|
|
||||||
|
Docker:
|
||||||
|
```bash
|
||||||
|
docker exec -it <container_name> /app/sbv -list-users
|
||||||
|
```
|
||||||
|
|
||||||
|
Binary:
|
||||||
|
```bash
|
||||||
|
./sbv -list-users
|
||||||
|
```
|
||||||
|
|
||||||
|
Q: How do I reset a user's password?
|
||||||
|
|
||||||
|
Docker:
|
||||||
|
```bash
|
||||||
|
docker exec -it <container_name> /app/sbv -reset-password <username>
|
||||||
|
```
|
||||||
|
|
||||||
|
Binary:
|
||||||
|
```bash
|
||||||
|
./sbv -reset-password <username>
|
||||||
|
```
|
||||||
|
|
||||||
|
You will be prompted to enter and confirm the new password.
|
||||||
|
|
||||||
Q: What backups does this program support?
|
Q: What backups does this program support?
|
||||||
|
|
||||||
XML backups from the [SMS Backup & Restore app](https://play.google.com/store/apps/details?id=com.riteshsahu.SMSBackupRestore&hl=en_US). Android devices are supported. iPhone (iOS) devices are not supported by SMS Backup & Restore.
|
XML backups from the [SMS Backup & Restore app](https://play.google.com/store/apps/details?id=com.riteshsahu.SMSBackupRestore&hl=en_US). Android devices are supported. iPhone (iOS) devices are not supported by SMS Backup & Restore.
|
||||||
|
|||||||
@@ -223,3 +223,29 @@ func UpdatePassword(userID string, newPassword string) error {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ListUsers returns all users in the database
|
||||||
|
func ListUsers() ([]User, error) {
|
||||||
|
rows, err := authDB.Query("SELECT id, username, password_hash, created_at FROM users ORDER BY username")
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to query users: %w", err)
|
||||||
|
}
|
||||||
|
defer rows.Close()
|
||||||
|
|
||||||
|
var users []User
|
||||||
|
for rows.Next() {
|
||||||
|
var user User
|
||||||
|
var createdAt int64
|
||||||
|
if err := rows.Scan(&user.ID, &user.Username, &user.PasswordHash, &createdAt); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to scan user: %w", err)
|
||||||
|
}
|
||||||
|
user.CreatedAt = time.Unix(createdAt, 0)
|
||||||
|
users = append(users, user)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := rows.Err(); err != nil {
|
||||||
|
return nil, fmt.Errorf("error iterating users: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return users, nil
|
||||||
|
}
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
_ "net/http/pprof"
|
_ "net/http/pprof"
|
||||||
"os"
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"text/tabwriter"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/labstack/echo/v4"
|
"github.com/labstack/echo/v4"
|
||||||
@@ -20,6 +22,7 @@ var logger *slog.Logger
|
|||||||
func main() {
|
func main() {
|
||||||
// Parse CLI flags
|
// Parse CLI flags
|
||||||
resetPassword := flag.String("reset-password", "", "Reset password for the specified username")
|
resetPassword := flag.String("reset-password", "", "Reset password for the specified username")
|
||||||
|
listUsers := flag.Bool("list-users", false, "List all users")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
// Initialize slog logger
|
// Initialize slog logger
|
||||||
@@ -51,6 +54,15 @@ func main() {
|
|||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Handle list users if requested
|
||||||
|
if *listUsers {
|
||||||
|
if err := handleListUsers(dbPathPrefix); err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
os.Exit(0)
|
||||||
|
}
|
||||||
|
|
||||||
// Create Echo instance
|
// Create Echo instance
|
||||||
e := echo.New()
|
e := echo.New()
|
||||||
|
|
||||||
@@ -209,3 +221,28 @@ func handleResetPassword(username string) error {
|
|||||||
fmt.Printf("Password reset successfully for user '%s'\n", username)
|
fmt.Printf("Password reset successfully for user '%s'\n", username)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// handleListUsers lists all users with their usernames, UUIDs, and ingest directories
|
||||||
|
func handleListUsers(dbPathPrefix string) error {
|
||||||
|
users, err := internal.ListUsers()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to list users: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(users) == 0 {
|
||||||
|
fmt.Println("No users found.")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
|
||||||
|
fmt.Fprintln(w, "USERNAME\tUUID\tINGEST DIRECTORY")
|
||||||
|
fmt.Fprintln(w, "--------\t----\t----------------")
|
||||||
|
|
||||||
|
for _, user := range users {
|
||||||
|
ingestDir := filepath.Join(dbPathPrefix, "data", user.ID, "ingest")
|
||||||
|
fmt.Fprintf(w, "%s\t%s\t%s\n", user.Username, user.ID, ingestDir)
|
||||||
|
}
|
||||||
|
|
||||||
|
w.Flush()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user