master
Raw Download raw file
  1package main
  2
  3import (
  4	"bytes"
  5	"encoding/json"
  6	"fmt"
  7	"net/http"
  8	"time"
  9
 10	"github.com/google/uuid"
 11)
 12
 13const (
 14	userBase = "pete"
 15	password = "onebullet"
 16)
 17
 18func registerUser(client *http.Client) (string, error) {
 19	username := userBase + uuid.New().String()[:4]
 20	payload, err := json.Marshal(
 21		map[string]string{
 22			"username": username,
 23			"password": password,
 24		})
 25	req, err := http.NewRequest("POST", httpURL+"/api/register", bytes.NewBuffer(payload))
 26	if err != nil {
 27		return "", err
 28	}
 29	req.Header.Set("Content-Type", "application/json")
 30
 31	resp, err := client.Do(req)
 32	if err != nil {
 33		return "", err
 34	}
 35	defer resp.Body.Close()
 36	return username, nil
 37}
 38
 39func loginUser(client *http.Client, username string) (*http.Cookie, error) {
 40	payload, err := json.Marshal(
 41		map[string]string{
 42			"username": username,
 43			"password": password,
 44		})
 45
 46	req, err := http.NewRequest("POST", httpURL+"/api/login", bytes.NewBuffer(payload))
 47	if err != nil {
 48		return nil, err
 49	}
 50	req.Header.Set("Content-Type", "application/json")
 51
 52	resp, err := client.Do(req)
 53	if err != nil {
 54		return nil, err
 55	}
 56	defer resp.Body.Close()
 57
 58	for _, cookie := range resp.Cookies() {
 59		if cookie.Name == "session" {
 60			return cookie, nil
 61		}
 62	}
 63
 64	return nil, fmt.Errorf("session cookie not found")
 65}
 66
 67func createSecret(client *http.Client, cookie *http.Cookie, revealAt time.Time) (string, time.Time, error) {
 68	now := time.Now()
 69	revealFmt := revealAt.UTC().Format(time.RFC3339Nano)
 70	type secret struct {
 71		Id        string `json:"id,omitempty"`
 72		Name      string `json:"name,omitempty"`
 73		RevealAt  string `json:"revealAt,omitempty"`
 74		CreatedAt string `json:"createdAt,omitempty"`
 75	}
 76	type my struct {
 77		Secrets []secret
 78	}
 79
 80	name := uuid.New().String()
 81	payload, err := json.Marshal(map[string]string{
 82		"name":     name,
 83		"secret":   name,
 84		"revealAt": revealFmt,
 85	})
 86	if err != nil {
 87		return "", now, err
 88	}
 89
 90	req, err := http.NewRequest("POST", httpURL+"/api/secrets/create", bytes.NewBuffer(payload))
 91	if err != nil {
 92		return "", now, err
 93	}
 94	req.Header.Set("Content-Type", "application/json")
 95	req.AddCookie(cookie)
 96
 97	resp, err := client.Do(req)
 98	if err != nil {
 99		return "", now, err
100	}
101	defer resp.Body.Close()
102
103	var result struct {
104		ID string `json:"id"`
105	}
106	err = json.NewDecoder(resp.Body).Decode(&result)
107	if err != nil {
108		return "", now, err
109	}
110
111	req, err = http.NewRequest("GET", httpURL+"/api/secrets/my", nil)
112	if err != nil {
113		return "", now, err
114	}
115	req.Header.Set("Content-Type", "application/json")
116	req.AddCookie(cookie)
117
118	resp, err = client.Do(req)
119	if err != nil {
120		return "", now, err
121	}
122	defer resp.Body.Close()
123
124	var mySecrets my
125	err = json.NewDecoder(resp.Body).Decode(&mySecrets)
126	if err != nil {
127		return "", now, err
128	}
129
130	for _, s := range mySecrets.Secrets {
131		if s.Id == result.ID {
132			r, err := time.Parse(time.RFC3339Nano, s.RevealAt)
133			if err != nil {
134				return "", now, err
135			}
136			return result.ID, r, nil
137		}
138	}
139
140	return result.ID, now, nil
141
142}