Compare commits
	
		
			4 Commits
		
	
	
		
			8e88f09709
			...
			v0.3.5
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| d583db5450 | |||
| 88d9a76785 | |||
| 193b0d3926 | |||
| 733c0410fe | 
@@ -37,7 +37,7 @@ func NewHTTPServer(cfg *gpaste.ServerConfig) *HTTPServer {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// Create initial user
 | 
						// Create initial user
 | 
				
			||||||
	// TODO: Do properly
 | 
						// TODO: Do properly
 | 
				
			||||||
	user := &users.User{Username: "admin"}
 | 
						user := &users.User{Username: "admin", Role: users.RoleAdmin}
 | 
				
			||||||
	user.SetPassword("admin")
 | 
						user.SetPassword("admin")
 | 
				
			||||||
	srv.Users.Store(user)
 | 
						srv.Users.Store(user)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -71,7 +71,7 @@ func (s *HTTPServer) MiddlewareAuthentication(next http.Handler) http.Handler {
 | 
				
			|||||||
		ctx = context.WithValue(ctx, authCtxAuthLevel, claims.Role)
 | 
							ctx = context.WithValue(ctx, authCtxAuthLevel, claims.Role)
 | 
				
			||||||
		ctx = context.WithValue(ctx, authCtxClaims, claims)
 | 
							ctx = context.WithValue(ctx, authCtxClaims, claims)
 | 
				
			||||||
		withCtx := r.WithContext(ctx)
 | 
							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)
 | 
							next.ServeHTTP(w, withCtx)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -160,8 +160,5 @@ func (c *Client) Upload(ctx context.Context, files ...*files.File) ([]api.Respon
 | 
				
			|||||||
		return nil, fmt.Errorf("error decoding response: %w", err)
 | 
							return nil, fmt.Errorf("error decoding response: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, r := range expectedResp {
 | 
					 | 
				
			||||||
		fmt.Printf("Uploaded file %s\n", r.ID)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return expectedResp, nil
 | 
						return expectedResp, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,74 +1,40 @@
 | 
				
			|||||||
package actions
 | 
					package actions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"bytes"
 | 
						"bufio"
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"encoding/json"
 | 
					 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"io"
 | 
					 | 
				
			||||||
	"mime/multipart"
 | 
					 | 
				
			||||||
	"net/http"
 | 
					 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"syscall"
 | 
						"syscall"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"git.t-juice.club/torjus/gpaste/api"
 | 
						"git.t-juice.club/torjus/gpaste/client"
 | 
				
			||||||
	"github.com/google/uuid"
 | 
						"git.t-juice.club/torjus/gpaste/files"
 | 
				
			||||||
	"github.com/urfave/cli/v2"
 | 
						"github.com/urfave/cli/v2"
 | 
				
			||||||
	"golang.org/x/term"
 | 
						"golang.org/x/term"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func ActionUpload(c *cli.Context) error {
 | 
					func ActionUpload(c *cli.Context) error {
 | 
				
			||||||
	url := fmt.Sprintf("%s/api/file", c.String("url"))
 | 
						clnt := client.Client{
 | 
				
			||||||
	client := &http.Client{}
 | 
							BaseURL: c.String("url"),
 | 
				
			||||||
	// TODO: Change timeout
 | 
						}
 | 
				
			||||||
	ctx, cancel := context.WithTimeout(c.Context, 10*time.Minute)
 | 
					 | 
				
			||||||
	defer cancel()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	buf := &bytes.Buffer{}
 | 
					 | 
				
			||||||
	mw := multipart.NewWriter(buf)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for _, arg := range c.Args().Slice() {
 | 
						for _, arg := range c.Args().Slice() {
 | 
				
			||||||
		f, err := os.Open(arg)
 | 
							f, err := os.Open(arg)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		defer f.Close()
 | 
							defer f.Close()
 | 
				
			||||||
		fw, err := mw.CreateFormFile(uuid.Must(uuid.NewRandom()).String(), arg)
 | 
							file := &files.File{
 | 
				
			||||||
 | 
								OriginalFilename: arg,
 | 
				
			||||||
 | 
								Body:             f,
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							resp, err := clnt.Upload(c.Context, file)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return err
 | 
								errmsg := fmt.Sprintf("Error uploading file: %s", err)
 | 
				
			||||||
 | 
								return cli.Exit(errmsg, 1)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if _, err := io.Copy(fw, f); err != nil {
 | 
							fmt.Printf("Uploaded file %s - %s", file.OriginalFilename, resp[0].URL)
 | 
				
			||||||
			return err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	mw.Close()
 | 
					 | 
				
			||||||
	req, err := http.NewRequestWithContext(ctx, http.MethodPost, url, buf)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	req.Header.Add("Content-Type", mw.FormDataContentType())
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	resp, err := client.Do(req)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	defer resp.Body.Close()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	var expectedResp []struct {
 | 
					 | 
				
			||||||
		Message string `json:"message"`
 | 
					 | 
				
			||||||
		ID      string `json:"id"`
 | 
					 | 
				
			||||||
		URL     string `json:"url"`
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	decoder := json.NewDecoder(resp.Body)
 | 
					 | 
				
			||||||
	if err := decoder.Decode(&expectedResp); err != nil {
 | 
					 | 
				
			||||||
		return fmt.Errorf("error decoding response: %w", err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	for _, r := range expectedResp {
 | 
					 | 
				
			||||||
		fmt.Printf("Uploaded file %s\n", r.ID)
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -83,92 +49,49 @@ func ActionLogin(c *cli.Context) error {
 | 
				
			|||||||
		return fmt.Errorf("error reading password: %w", err)
 | 
							return fmt.Errorf("error reading password: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	url := fmt.Sprintf("%s/api/login", c.String("url"))
 | 
						clnt := client.Client{
 | 
				
			||||||
	client := &http.Client{}
 | 
							BaseURL: c.String("url"),
 | 
				
			||||||
	// TODO: Change timeout
 | 
					 | 
				
			||||||
	ctx, cancel := context.WithTimeout(c.Context, 10*time.Second)
 | 
					 | 
				
			||||||
	defer cancel()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	body := new(bytes.Buffer)
 | 
					 | 
				
			||||||
	requestData := struct {
 | 
					 | 
				
			||||||
		Username string `json:"username"`
 | 
					 | 
				
			||||||
		Password string `json:"password"`
 | 
					 | 
				
			||||||
	}{
 | 
					 | 
				
			||||||
		Username: username,
 | 
					 | 
				
			||||||
		Password: password,
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	encoder := json.NewEncoder(body)
 | 
						if err := clnt.Login(c.Context, username, password); err != nil {
 | 
				
			||||||
	if err := encoder.Encode(&requestData); err != nil {
 | 
							errmsg := fmt.Sprintf("Error logging in: %s", err)
 | 
				
			||||||
		return fmt.Errorf("error encoding response: %w", err)
 | 
							return cli.Exit(errmsg, 1)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	req, err := http.NewRequestWithContext(ctx, http.MethodPost, url, body)
 | 
						// TODO: Store this somewhere, so we don't need to log in each time
 | 
				
			||||||
	if err != nil {
 | 
						fmt.Println("Successfully logged in.")
 | 
				
			||||||
		return fmt.Errorf("error creating request: %w", err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	resp, err := client.Do(req)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return fmt.Errorf("unable to perform request: %s", err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	defer resp.Body.Close()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if resp.StatusCode != http.StatusOK {
 | 
					 | 
				
			||||||
		return cli.Exit("got non-ok response from server", 0)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	responseData := struct {
 | 
					 | 
				
			||||||
		Token string `json:"token"`
 | 
					 | 
				
			||||||
	}{}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	decoder := json.NewDecoder(resp.Body)
 | 
					 | 
				
			||||||
	if err := decoder.Decode(&responseData); err != nil {
 | 
					 | 
				
			||||||
		return fmt.Errorf("unable to parse response: %s", err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	fmt.Printf("Token: %s", responseData.Token)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func ActionUserCreate(c *cli.Context) error {
 | 
					func ActionUserCreate(c *cli.Context) error {
 | 
				
			||||||
	// TODO: Needs to supply auth token to actually work
 | 
						// TODO: Needs to supply auth token to actually work
 | 
				
			||||||
	username := c.Args().First()
 | 
						fmt.Println("Need to be logged in to create user")
 | 
				
			||||||
	if username == "" {
 | 
						username := readString("Enter username: ")
 | 
				
			||||||
		return cli.Exit("USERNAME not supplied.", 1)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	password, err := readPassword()
 | 
						password, err := readPassword()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return fmt.Errorf("error reading password: %w", err)
 | 
							return fmt.Errorf("error reading password: %w", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	url := fmt.Sprintf("%s/api/user", c.String("url"))
 | 
						clnt := client.Client{
 | 
				
			||||||
	client := &http.Client{}
 | 
							BaseURL: c.String("url"),
 | 
				
			||||||
	// TODO: Change timeout
 | 
						}
 | 
				
			||||||
	ctx, cancel := context.WithTimeout(c.Context, 10*time.Second)
 | 
						ctx, cancel := context.WithTimeout(c.Context, 10*time.Second)
 | 
				
			||||||
	defer cancel()
 | 
						defer cancel()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	body := new(bytes.Buffer)
 | 
						if err := clnt.Login(ctx, username, password); err != nil {
 | 
				
			||||||
	requestData := &api.RequestAPIUserCreate{
 | 
							errmsg := fmt.Sprintf("Error logging in: %s", err)
 | 
				
			||||||
		Username: username,
 | 
							return cli.Exit(errmsg, 1)
 | 
				
			||||||
		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)
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	resp, err := client.Do(req)
 | 
						fmt.Println("User to create:")
 | 
				
			||||||
 | 
						username = readString("Enter username: ")
 | 
				
			||||||
 | 
						password, err = readPassword()
 | 
				
			||||||
	if err != nil {
 | 
						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 {
 | 
						if err := clnt.UserCreate(ctx, username, password); err != nil {
 | 
				
			||||||
		return cli.Exit("got non-ok response from server", 0)
 | 
							errmsg := fmt.Sprintf("Error creating user: %s", err)
 | 
				
			||||||
 | 
							return cli.Exit(errmsg, 1)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fmt.Printf("Created user %s\n", username)
 | 
						fmt.Printf("Created user %s\n", username)
 | 
				
			||||||
@@ -186,3 +109,12 @@ func readPassword() (string, error) {
 | 
				
			|||||||
	password := string(bytePassword)
 | 
						password := string(bytePassword)
 | 
				
			||||||
	return strings.TrimSpace(password), nil
 | 
						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 ""
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user