master
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}