diff --git a/api/http.go b/api/http.go index b6e8cf8..0a04dd7 100644 --- a/api/http.go +++ b/api/http.go @@ -37,7 +37,7 @@ func NewHTTPServer(cfg *gpaste.ServerConfig) *HTTPServer { // Create initial user // TODO: Do properly - user := &users.User{Username: "admin"} + user := &users.User{Username: "admin", Role: users.RoleAdmin} user.SetPassword("admin") srv.Users.Store(user) diff --git a/api/middleware.go b/api/middleware.go index 26e4822..193cbce 100644 --- a/api/middleware.go +++ b/api/middleware.go @@ -71,7 +71,7 @@ func (s *HTTPServer) MiddlewareAuthentication(next http.Handler) http.Handler { ctx = context.WithValue(ctx, authCtxAuthLevel, claims.Role) ctx = context.WithValue(ctx, authCtxClaims, claims) withCtx := r.WithContext(ctx) - s.Logger.Debugw("Request is authenticated.", "req_id", reqID, "username", claims.Subject) + s.Logger.Debugw("Request is authenticated.", "req_id", reqID, "username", claims.Subject, "role", claims.Role) next.ServeHTTP(w, withCtx) } diff --git a/cmd/client/actions/actions.go b/cmd/client/actions/actions.go index 9b856e2..d72f67c 100644 --- a/cmd/client/actions/actions.go +++ b/cmd/client/actions/actions.go @@ -1,17 +1,14 @@ package actions import ( - "bytes" + "bufio" "context" - "encoding/json" "fmt" - "net/http" "os" "strings" "syscall" "time" - "git.t-juice.club/torjus/gpaste/api" "git.t-juice.club/torjus/gpaste/client" "git.t-juice.club/torjus/gpaste/files" "github.com/urfave/cli/v2" @@ -67,43 +64,34 @@ func ActionLogin(c *cli.Context) error { func ActionUserCreate(c *cli.Context) error { // TODO: Needs to supply auth token to actually work - username := c.Args().First() - if username == "" { - return cli.Exit("USERNAME not supplied.", 1) - } + fmt.Println("Need to be logged in to create user") + username := readString("Enter username: ") password, err := readPassword() if err != nil { return fmt.Errorf("error reading password: %w", err) } - url := fmt.Sprintf("%s/api/user", c.String("url")) - client := &http.Client{} - // TODO: Change timeout + clnt := client.Client{ + BaseURL: c.String("url"), + } ctx, cancel := context.WithTimeout(c.Context, 10*time.Second) defer cancel() - body := new(bytes.Buffer) - requestData := &api.RequestAPIUserCreate{ - Username: username, - Password: password, - } - encoder := json.NewEncoder(body) - if err := encoder.Encode(requestData); err != nil { - return fmt.Errorf("error encoding response: %w", err) - } - req, err := http.NewRequestWithContext(ctx, http.MethodPost, url, body) - if err != nil { - return fmt.Errorf("error creating request: %w", err) + if err := clnt.Login(ctx, username, password); err != nil { + errmsg := fmt.Sprintf("Error logging in: %s", err) + return cli.Exit(errmsg, 1) } - resp, err := client.Do(req) + fmt.Println("User to create:") + username = readString("Enter username: ") + password, err = readPassword() if err != nil { - return fmt.Errorf("unable to perform request: %s", err) + return fmt.Errorf("error reading password: %w", err) } - defer resp.Body.Close() - if resp.StatusCode != http.StatusAccepted { - return cli.Exit("got non-ok response from server", 0) + if err := clnt.UserCreate(ctx, username, password); err != nil { + errmsg := fmt.Sprintf("Error creating user: %s", err) + return cli.Exit(errmsg, 1) } fmt.Printf("Created user %s\n", username) @@ -121,3 +109,12 @@ func readPassword() (string, error) { password := string(bytePassword) return strings.TrimSpace(password), nil } + +func readString(prompt string) string { + fmt.Print(prompt) + scanner := bufio.NewScanner(os.Stdin) + for scanner.Scan() { + return scanner.Text() + } + return "" +}