From 6cdb4af53d7ef99b76d698071abe70710fd39df5 Mon Sep 17 00:00:00 2001 From: Nicholas O'Brien Date: Sat, 23 Mar 2024 18:26:27 +0000 Subject: [PATCH 01/12] initial --- .tavern-auth | 1 + bin/pwnboard-go/auth.go | 32 ++++++++ bin/pwnboard-go/main.go | 69 +++++++++++++++++ bin/pwnboard-go/pwnboard_client.go | 0 bin/pwnboard-go/tavern_client.go | 115 +++++++++++++++++++++++++++++ 5 files changed, 217 insertions(+) create mode 100644 .tavern-auth create mode 100644 bin/pwnboard-go/auth.go create mode 100644 bin/pwnboard-go/main.go create mode 100644 bin/pwnboard-go/pwnboard_client.go create mode 100644 bin/pwnboard-go/tavern_client.go diff --git a/.tavern-auth b/.tavern-auth new file mode 100644 index 000000000..89132aba6 --- /dev/null +++ b/.tavern-auth @@ -0,0 +1 @@ +PqlOze/nzDCUEqswayE8QIFgYD6zGgsx4LLUVcpNksAe+rZlEDT3zC+OEXIIBdGZrhxTl+X8t9+VuIQqhvc5Xg== \ No newline at end of file diff --git a/bin/pwnboard-go/auth.go b/bin/pwnboard-go/auth.go new file mode 100644 index 000000000..8748daa57 --- /dev/null +++ b/bin/pwnboard-go/auth.go @@ -0,0 +1,32 @@ +package main + +import ( + "context" + "fmt" + "log" + "os" + + "realm.pub/tavern/cli/auth" +) + +func getAuthToken(ctx context.Context, tavernURL, cachePath string) (auth.Token, error) { + tokenData, err := os.ReadFile(cachePath) + if os.IsNotExist(err) { + token, err := auth.Authenticate(ctx, auth.BrowserFunc(func(url string) error { log.Printf("OPEN THIS: %s", url); return nil }), tavernURL) + + // token, err := auth.Authenticate(ctx, auth.BrowserFunc(browser.OpenURL), tavernURL) + if err != nil { + return auth.Token(""), err + } + if err := os.WriteFile(cachePath, []byte(token), 0640); err != nil { + log.Printf("[WARN] Failed to save token to credential cache (%q): %v", cachePath, err) + } + return token, nil + } + if err != nil { + return auth.Token(""), fmt.Errorf("failed to read credential cache (%q): %v", cachePath, err) + } + + log.Printf("Loaded authentication credentials from %q", cachePath) + return auth.Token(tokenData), nil +} diff --git a/bin/pwnboard-go/main.go b/bin/pwnboard-go/main.go new file mode 100644 index 000000000..a30faeead --- /dev/null +++ b/bin/pwnboard-go/main.go @@ -0,0 +1,69 @@ +package main + +import ( + "context" + "fmt" + "log" + "net/http" + "regexp" + "time" +) + +func NewHostnameHostsFilter(re string) func([]Host) (matching []Host) { + regex := regexp.MustCompile(re) + return func(hosts []Host) (matching []Host) { + // Find Matching Hosts + for _, host := range hosts { + if regex.Match([]byte(host.Name)) { + matching = append(matching, host) + } + } + return + } +} + +func main() { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) + defer cancel() + + var ( + tavernURL = "https://tavern.aws-metadata.com" + credentialPath = ".tavern-auth" + lookbackWindow = 3 * time.Minute + sleepInterval = 10 * time.Second + ) + + token, err := getAuthToken(ctx, tavernURL, credentialPath) + if err != nil { + log.Fatalf("failed to obtain authentication credentials: %v", err) + } + + client := &Client{ + Credential: token, + URL: fmt.Sprintf("%s/graphql", tavernURL), + HTTP: &http.Client{ + Timeout: 60 * time.Second, + }, + } + + for { + + log.Printf("Starting new lookbackWindow...") + + hosts, err := client.GetHostsSeenInLastDuration(lookbackWindow) + if err != nil { + log.Fatalf("failed to query hosts: %v", err) + } + + log.Printf("Successfully queried hosts (len=%d)", len(hosts)) + for _, host := range hosts { + log.Printf("Found Host: id=%s\tname=%s\tip=%s", host.ID, host.Name, host.PrimaryIP) + + } + + log.Printf("Sleeping for %s...", sleepInterval) + time.Sleep(sleepInterval) + + } + +} diff --git a/bin/pwnboard-go/pwnboard_client.go b/bin/pwnboard-go/pwnboard_client.go new file mode 100644 index 000000000..e69de29bb diff --git a/bin/pwnboard-go/tavern_client.go b/bin/pwnboard-go/tavern_client.go new file mode 100644 index 000000000..c3a7ba8b0 --- /dev/null +++ b/bin/pwnboard-go/tavern_client.go @@ -0,0 +1,115 @@ +package main + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + "time" + + "realm.pub/tavern/cli/auth" +) + +// Request represents an outgoing GraphQL request +type Request struct { + Query string `json:"query"` + Variables map[string]any `json:"variables,omitempty"` + OperationName string `json:"operationName,omitempty"` + Extensions map[string]any `json:"extensions,omitempty"` +} + +// Response is a GraphQL layer response from a handler. +type Response struct { + Errors []struct { + Message string `json:"message"` + } `json:"errors"` + Extensions map[string]any +} + +func (resp Response) Error() string { + msg := "" + for _, err := range resp.Errors { + msg = fmt.Sprintf("%s\n%s;", msg, err.Message) + } + return msg +} + +type Host struct { + ID string `json:"id"` + Name string `json:"name"` + PrimaryIP string `json:"primaryIP"` +} + +type Client struct { + Credential auth.Token + URL string + HTTP *http.Client +} + +func (client *Client) GetHostsSeenInLastDuration(timeAgo time.Duration) ([]Host, error) { + now := time.Now().UTC() + timeAgoFromNow := now.Add(-timeAgo) + formattedTime := timeAgoFromNow.Format(time.RFC3339) + req := Request{ + OperationName: "getHosts", + Query: `query getHosts($input: HostWhereInput) { + hosts(where: $input) { + id + primaryIP + name + } + }`, + Variables: map[string]any{ + "input": map[string]string{"lastSeenAtGT": formattedTime}, + }, + } + + type GetHostsResponse struct { + Response + Data struct { + Hosts []Host `json:"hosts"` + } `json:"data"` + } + var resp GetHostsResponse + if err := client.do(req, &resp); err != nil { + return nil, fmt.Errorf("http request failed: %w", err) + } + + if resp.Errors != nil { + return nil, fmt.Errorf("graphql error: %s", resp.Error()) + } + + return resp.Data.Hosts, nil +} + +// do sends a GraphQL request and returns the response +func (client *Client) do(gqlReq Request, gqlResp any) error { + + data, err := json.Marshal(gqlReq) + if err != nil { + return fmt.Errorf("failed to marshal json request to json: %w", err) + } + + req, err := http.NewRequest(http.MethodPost, client.URL, bytes.NewBuffer(data)) + if err != nil { + return err + } + req.Header.Set("Content-Type", "application/json") + client.Credential.Authenticate(req) + + resp, err := client.HTTP.Do(req) + if err != nil { + return fmt.Errorf("failed to send request: %v", err) + } + body, err := io.ReadAll(resp.Body) + if err != nil { + return err + } + + if err := json.Unmarshal(body, gqlResp); err != nil { + return fmt.Errorf("failed to unmarshal body to json: %v", err) + } + + return nil +} From a129e3272ee8af7e025a2444ce597281b3b583d7 Mon Sep 17 00:00:00 2001 From: Nicholas O'Brien Date: Sat, 23 Mar 2024 19:08:22 +0000 Subject: [PATCH 02/12] stuff --- bin/pwnboard-go/main.go | 34 +++++++-- bin/pwnboard-go/pwnboard/client.go | 72 +++++++++++++++++++ bin/pwnboard-go/pwnboard_client.go | 0 .../{tavern_client.go => tavern/client.go} | 2 +- 4 files changed, 101 insertions(+), 7 deletions(-) create mode 100644 bin/pwnboard-go/pwnboard/client.go delete mode 100644 bin/pwnboard-go/pwnboard_client.go rename bin/pwnboard-go/{tavern_client.go => tavern/client.go} (99%) diff --git a/bin/pwnboard-go/main.go b/bin/pwnboard-go/main.go index a30faeead..76f28fe6d 100644 --- a/bin/pwnboard-go/main.go +++ b/bin/pwnboard-go/main.go @@ -7,11 +7,14 @@ import ( "net/http" "regexp" "time" + + "realm.pub/bin/pwnboard-go/pwnboard" + "realm.pub/bin/pwnboard-go/tavern" ) -func NewHostnameHostsFilter(re string) func([]Host) (matching []Host) { +func NewHostnameHostsFilter(re string) func([]tavern.Host) (matching []tavern.Host) { regex := regexp.MustCompile(re) - return func(hosts []Host) (matching []Host) { + return func(hosts []tavern.Host) (matching []tavern.Host) { // Find Matching Hosts for _, host := range hosts { if regex.Match([]byte(host.Name)) { @@ -29,8 +32,13 @@ func main() { var ( tavernURL = "https://tavern.aws-metadata.com" credentialPath = ".tavern-auth" + + pwnboardURL = "https://pwnboard.aws-metadata.com" + pwnboardAppName = "Realm" + lookbackWindow = 3 * time.Minute sleepInterval = 10 * time.Second + httpTimeouts = 30 * time.Second ) token, err := getAuthToken(ctx, tavernURL, credentialPath) @@ -38,11 +46,19 @@ func main() { log.Fatalf("failed to obtain authentication credentials: %v", err) } - client := &Client{ + tavern_client := &tavern.Client{ Credential: token, URL: fmt.Sprintf("%s/graphql", tavernURL), HTTP: &http.Client{ - Timeout: 60 * time.Second, + Timeout: httpTimeouts, + }, + } + + pwnboard_client := &pwnboard.Client{ + ApplicationName: pwnboardAppName, + URL: pwnboardURL, + HTTP: &http.Client{ + Timeout: httpTimeouts, }, } @@ -50,15 +66,21 @@ func main() { log.Printf("Starting new lookbackWindow...") - hosts, err := client.GetHostsSeenInLastDuration(lookbackWindow) + hosts, err := tavern_client.GetHostsSeenInLastDuration(lookbackWindow) if err != nil { log.Fatalf("failed to query hosts: %v", err) } log.Printf("Successfully queried hosts (len=%d)", len(hosts)) + var ips []string for _, host := range hosts { - log.Printf("Found Host: id=%s\tname=%s\tip=%s", host.ID, host.Name, host.PrimaryIP) + ips = append(ips, host.PrimaryIP) + } + log.Printf("Sending IPs to pwnboard...") + err = pwnboard_client.ReportIPs(ips) + if err != nil { + log.Fatalf("failed to send ips to pwnboard: %v", err) } log.Printf("Sleeping for %s...", sleepInterval) diff --git a/bin/pwnboard-go/pwnboard/client.go b/bin/pwnboard-go/pwnboard/client.go new file mode 100644 index 000000000..3c0813b7a --- /dev/null +++ b/bin/pwnboard-go/pwnboard/client.go @@ -0,0 +1,72 @@ +package pwnboard + +import ( + "bytes" + "fmt" + "io" + + "encoding/json" + "net/http" +) + +type Request struct { + Data map[string]any +} + +type Client struct { + ApplicationName string + URL string + HTTP *http.Client +} + +func (c *Client) ReportIPs(ips []string) error { + if len(ips) == 0 { + return nil + } + var r Request + if len(ips) == 1 { + r = Request{ + Data: map[string]any{ + "ip": ips[0], + "application": c.ApplicationName, + }, + } + } else { + r = Request{ + Data: map[string]any{ + "ip": ips[0], + "application": c.ApplicationName, + "ips": ips[1:], + }, + } + } + return c.do(r) +} + +func (c *Client) do(r Request) error { + data, err := json.Marshal(r.Data) + if err != nil { + return fmt.Errorf("failed to marshal json request to json: %w", err) + } + + req, err := http.NewRequest(http.MethodPost, c.URL, bytes.NewBuffer(data)) + if err != nil { + return err + } + req.Header.Set("Content-Type", "application/json") + + resp, err := c.HTTP.Do(req) + if err != nil { + return fmt.Errorf("failed to send request: %v", err) + } + + // if pwnboard issue + if resp.StatusCode != 202 { + body, err := io.ReadAll(resp.Body) + if err != nil { + return err + } + return fmt.Errorf("pwnboard error: %s", body) + } + return nil +} diff --git a/bin/pwnboard-go/pwnboard_client.go b/bin/pwnboard-go/pwnboard_client.go deleted file mode 100644 index e69de29bb..000000000 diff --git a/bin/pwnboard-go/tavern_client.go b/bin/pwnboard-go/tavern/client.go similarity index 99% rename from bin/pwnboard-go/tavern_client.go rename to bin/pwnboard-go/tavern/client.go index c3a7ba8b0..19f286e33 100644 --- a/bin/pwnboard-go/tavern_client.go +++ b/bin/pwnboard-go/tavern/client.go @@ -1,4 +1,4 @@ -package main +package tavern import ( "bytes" From 7243a6c5b06a5f8c5cabecc115b975291076d7d7 Mon Sep 17 00:00:00 2001 From: Nicholas O'Brien Date: Sat, 23 Mar 2024 19:12:35 +0000 Subject: [PATCH 03/12] stuff --- bin/pwnboard-go/pwnboard/client.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/bin/pwnboard-go/pwnboard/client.go b/bin/pwnboard-go/pwnboard/client.go index 3c0813b7a..925273b66 100644 --- a/bin/pwnboard-go/pwnboard/client.go +++ b/bin/pwnboard-go/pwnboard/client.go @@ -9,6 +9,10 @@ import ( "net/http" ) +var ( + BOX_ACCESS_PATH = "/pwn/boxaccess" +) + type Request struct { Data map[string]any } @@ -49,7 +53,7 @@ func (c *Client) do(r Request) error { return fmt.Errorf("failed to marshal json request to json: %w", err) } - req, err := http.NewRequest(http.MethodPost, c.URL, bytes.NewBuffer(data)) + req, err := http.NewRequest(http.MethodPost, c.URL+BOX_ACCESS_PATH, bytes.NewBuffer(data)) if err != nil { return err } From ad7c3578e16c6e90859d6821c8e0eb22d7d8635e Mon Sep 17 00:00:00 2001 From: Nicholas O'Brien Date: Sat, 23 Mar 2024 19:46:52 +0000 Subject: [PATCH 04/12] works! --- bin/pwnboard-go/main.go | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/bin/pwnboard-go/main.go b/bin/pwnboard-go/main.go index 76f28fe6d..b6aa8f0a7 100644 --- a/bin/pwnboard-go/main.go +++ b/bin/pwnboard-go/main.go @@ -37,7 +37,7 @@ func main() { pwnboardAppName = "Realm" lookbackWindow = 3 * time.Minute - sleepInterval = 10 * time.Second + sleepInterval = 30 * time.Second httpTimeouts = 30 * time.Second ) @@ -64,23 +64,22 @@ func main() { for { - log.Printf("Starting new lookbackWindow...") - + log.Printf("Querying Tavern for any Hosts seen in the last %s...", lookbackWindow) hosts, err := tavern_client.GetHostsSeenInLastDuration(lookbackWindow) if err != nil { log.Fatalf("failed to query hosts: %v", err) } - log.Printf("Successfully queried hosts (len=%d)", len(hosts)) + log.Printf("Found %d host(s)!", len(hosts)) var ips []string for _, host := range hosts { ips = append(ips, host.PrimaryIP) } - log.Printf("Sending IPs to pwnboard...") + log.Printf("Sending %d IP(s) to PWNboard...", len(ips)) err = pwnboard_client.ReportIPs(ips) if err != nil { - log.Fatalf("failed to send ips to pwnboard: %v", err) + log.Fatalf("failed to send ips to PWNboard: %v", err) } log.Printf("Sleeping for %s...", sleepInterval) From 9620e27871ebd220866d9364354eb620342c4cd3 Mon Sep 17 00:00:00 2001 From: Nicholas O'Brien Date: Sat, 23 Mar 2024 16:30:49 -0400 Subject: [PATCH 05/12] added creds file to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 6f5207db7..2c01468da 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,7 @@ dist/** # Credentials .creds/** implants/imix/imix-test-config.json +.tavern-auth implants/golem/embed_files_golem_prod/* !implants/golem/embed_files_golem_prod/.gitkeep From bbf7a338be11c3e12ccdba2d068959f17561a61b Mon Sep 17 00:00:00 2001 From: Nicholas O'Brien Date: Sat, 23 Mar 2024 16:31:18 -0400 Subject: [PATCH 06/12] removed nonsense --- .tavern-auth | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .tavern-auth diff --git a/.tavern-auth b/.tavern-auth deleted file mode 100644 index 89132aba6..000000000 --- a/.tavern-auth +++ /dev/null @@ -1 +0,0 @@ -PqlOze/nzDCUEqswayE8QIFgYD6zGgsx4LLUVcpNksAe+rZlEDT3zC+OEXIIBdGZrhxTl+X8t9+VuIQqhvc5Xg== \ No newline at end of file From f6b4cfc2c9a8b1e558755e30d57d57c96a82b7e0 Mon Sep 17 00:00:00 2001 From: Nicholas O'Brien Date: Sat, 23 Mar 2024 16:48:09 -0400 Subject: [PATCH 07/12] cleaning --- bin/pwnboard-go/main.go | 55 ++++++++++++++++------------------------- 1 file changed, 21 insertions(+), 34 deletions(-) diff --git a/bin/pwnboard-go/main.go b/bin/pwnboard-go/main.go index b6aa8f0a7..8038a112c 100644 --- a/bin/pwnboard-go/main.go +++ b/bin/pwnboard-go/main.go @@ -5,67 +5,54 @@ import ( "fmt" "log" "net/http" - "regexp" "time" "realm.pub/bin/pwnboard-go/pwnboard" "realm.pub/bin/pwnboard-go/tavern" ) -func NewHostnameHostsFilter(re string) func([]tavern.Host) (matching []tavern.Host) { - regex := regexp.MustCompile(re) - return func(hosts []tavern.Host) (matching []tavern.Host) { - // Find Matching Hosts - for _, host := range hosts { - if regex.Match([]byte(host.Name)) { - matching = append(matching, host) - } - } - return - } -} +const ( + TAVERN_URL = "https://tavern.aws-metadata.com" + CREDENTIAL_PATH = ".tavern-auth" + + PWNBOARD_URL = "https://pwnboard.aws-metadata.com" + PWNBOARD_APP_NAME = "Realm" + + LOOKBACK_WINDOW = 3 * time.Minute + SLEEP_INTERVAL = 30 * time.Second + HTTP_TIMEOUT = 30 * time.Second +) func main() { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) defer cancel() - var ( - tavernURL = "https://tavern.aws-metadata.com" - credentialPath = ".tavern-auth" - - pwnboardURL = "https://pwnboard.aws-metadata.com" - pwnboardAppName = "Realm" - - lookbackWindow = 3 * time.Minute - sleepInterval = 30 * time.Second - httpTimeouts = 30 * time.Second - ) - token, err := getAuthToken(ctx, tavernURL, credentialPath) + token, err := getAuthToken(ctx, TAVERN_URL, CREDENTIAL_PATH) if err != nil { log.Fatalf("failed to obtain authentication credentials: %v", err) } tavern_client := &tavern.Client{ Credential: token, - URL: fmt.Sprintf("%s/graphql", tavernURL), + URL: fmt.Sprintf("%s/graphql", TAVERN_URL), HTTP: &http.Client{ - Timeout: httpTimeouts, + Timeout: HTTP_TIMEOUT, }, } pwnboard_client := &pwnboard.Client{ - ApplicationName: pwnboardAppName, - URL: pwnboardURL, + ApplicationName: PWNBOARD_APP_NAME, + URL: PWNBOARD_URL, HTTP: &http.Client{ - Timeout: httpTimeouts, + Timeout: HTTP_TIMEOUT, }, } for { - log.Printf("Querying Tavern for any Hosts seen in the last %s...", lookbackWindow) - hosts, err := tavern_client.GetHostsSeenInLastDuration(lookbackWindow) + log.Printf("Querying Tavern for any Hosts seen in the last %s...", LOOKBACK_WINDOW) + hosts, err := tavern_client.GetHostsSeenInLastDuration(LOOKBACK_WINDOW) if err != nil { log.Fatalf("failed to query hosts: %v", err) } @@ -82,8 +69,8 @@ func main() { log.Fatalf("failed to send ips to PWNboard: %v", err) } - log.Printf("Sleeping for %s...", sleepInterval) - time.Sleep(sleepInterval) + log.Printf("Sleeping for %s...", SLEEP_INTERVAL) + time.Sleep(SLEEP_INTERVAL) } From a4bd5f13e6ca1c2bf813afd3a3af15ce2a105e96 Mon Sep 17 00:00:00 2001 From: Nicholas O'Brien Date: Sat, 23 Mar 2024 16:49:31 -0400 Subject: [PATCH 08/12] cleaning --- bin/pwnboard-go/main.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/bin/pwnboard-go/main.go b/bin/pwnboard-go/main.go index 8038a112c..4f0c9d7f9 100644 --- a/bin/pwnboard-go/main.go +++ b/bin/pwnboard-go/main.go @@ -15,19 +15,18 @@ const ( TAVERN_URL = "https://tavern.aws-metadata.com" CREDENTIAL_PATH = ".tavern-auth" - PWNBOARD_URL = "https://pwnboard.aws-metadata.com" + PWNBOARD_URL = "https://pwnboard.aws-metadata.com" PWNBOARD_APP_NAME = "Realm" LOOKBACK_WINDOW = 3 * time.Minute SLEEP_INTERVAL = 30 * time.Second - HTTP_TIMEOUT = 30 * time.Second + HTTP_TIMEOUT = 30 * time.Second ) func main() { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) defer cancel() - token, err := getAuthToken(ctx, TAVERN_URL, CREDENTIAL_PATH) if err != nil { log.Fatalf("failed to obtain authentication credentials: %v", err) From 422a46b9e2ec46370c6211b40f03a9eda1912c61 Mon Sep 17 00:00:00 2001 From: Nicholas O'Brien Date: Sat, 23 Mar 2024 16:54:42 -0400 Subject: [PATCH 09/12] more uniform --- bin/pwnboard-go/main.go | 2 +- bin/pwnboard-go/pwnboard/client.go | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/bin/pwnboard-go/main.go b/bin/pwnboard-go/main.go index 4f0c9d7f9..206604a91 100644 --- a/bin/pwnboard-go/main.go +++ b/bin/pwnboard-go/main.go @@ -42,7 +42,7 @@ func main() { pwnboard_client := &pwnboard.Client{ ApplicationName: PWNBOARD_APP_NAME, - URL: PWNBOARD_URL, + URL: fmt.Sprintf("%s/pwn/boxaccess", PWNBOARD_URL), HTTP: &http.Client{ Timeout: HTTP_TIMEOUT, }, diff --git a/bin/pwnboard-go/pwnboard/client.go b/bin/pwnboard-go/pwnboard/client.go index 925273b66..3c0813b7a 100644 --- a/bin/pwnboard-go/pwnboard/client.go +++ b/bin/pwnboard-go/pwnboard/client.go @@ -9,10 +9,6 @@ import ( "net/http" ) -var ( - BOX_ACCESS_PATH = "/pwn/boxaccess" -) - type Request struct { Data map[string]any } @@ -53,7 +49,7 @@ func (c *Client) do(r Request) error { return fmt.Errorf("failed to marshal json request to json: %w", err) } - req, err := http.NewRequest(http.MethodPost, c.URL+BOX_ACCESS_PATH, bytes.NewBuffer(data)) + req, err := http.NewRequest(http.MethodPost, c.URL, bytes.NewBuffer(data)) if err != nil { return err } From e46f8d76f827c94d5d4a85eb55ad1ce85fb687e5 Mon Sep 17 00:00:00 2001 From: Nicholas O'Brien Date: Sat, 23 Mar 2024 16:59:07 -0400 Subject: [PATCH 10/12] format --- bin/pwnboard-go/auth.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/bin/pwnboard-go/auth.go b/bin/pwnboard-go/auth.go index 8748daa57..df72fcd80 100644 --- a/bin/pwnboard-go/auth.go +++ b/bin/pwnboard-go/auth.go @@ -12,7 +12,16 @@ import ( func getAuthToken(ctx context.Context, tavernURL, cachePath string) (auth.Token, error) { tokenData, err := os.ReadFile(cachePath) if os.IsNotExist(err) { - token, err := auth.Authenticate(ctx, auth.BrowserFunc(func(url string) error { log.Printf("OPEN THIS: %s", url); return nil }), tavernURL) + token, err := auth.Authenticate( + ctx, + auth.BrowserFunc( + func(url string) error { + log.Printf("OPEN THIS: %s", url) + return nil + }, + ), + tavernURL, + ) // token, err := auth.Authenticate(ctx, auth.BrowserFunc(browser.OpenURL), tavernURL) if err != nil { From e0bf2574734045065c518475dad3b8b69a541d32 Mon Sep 17 00:00:00 2001 From: Nicholas O'Brien Date: Sat, 23 Mar 2024 17:00:05 -0400 Subject: [PATCH 11/12] format --- bin/pwnboard-go/auth.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/pwnboard-go/auth.go b/bin/pwnboard-go/auth.go index df72fcd80..e3788c874 100644 --- a/bin/pwnboard-go/auth.go +++ b/bin/pwnboard-go/auth.go @@ -12,6 +12,7 @@ import ( func getAuthToken(ctx context.Context, tavernURL, cachePath string) (auth.Token, error) { tokenData, err := os.ReadFile(cachePath) if os.IsNotExist(err) { + token, err := auth.Authenticate( ctx, auth.BrowserFunc( @@ -22,11 +23,10 @@ func getAuthToken(ctx context.Context, tavernURL, cachePath string) (auth.Token, ), tavernURL, ) - - // token, err := auth.Authenticate(ctx, auth.BrowserFunc(browser.OpenURL), tavernURL) if err != nil { return auth.Token(""), err } + if err := os.WriteFile(cachePath, []byte(token), 0640); err != nil { log.Printf("[WARN] Failed to save token to credential cache (%q): %v", cachePath, err) } From 370e64ac93e6366625626dd8497f83f9f6aaa287 Mon Sep 17 00:00:00 2001 From: Nicholas O'Brien Date: Sat, 23 Mar 2024 17:03:19 -0400 Subject: [PATCH 12/12] format --- bin/pwnboard-go/tavern/client.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/bin/pwnboard-go/tavern/client.go b/bin/pwnboard-go/tavern/client.go index 19f286e33..34fed7125 100644 --- a/bin/pwnboard-go/tavern/client.go +++ b/bin/pwnboard-go/tavern/client.go @@ -27,9 +27,9 @@ type Response struct { Extensions map[string]any } -func (resp Response) Error() string { +func (r Response) Error() string { msg := "" - for _, err := range resp.Errors { + for _, err := range r.Errors { msg = fmt.Sprintf("%s\n%s;", msg, err.Message) } return msg @@ -47,7 +47,7 @@ type Client struct { HTTP *http.Client } -func (client *Client) GetHostsSeenInLastDuration(timeAgo time.Duration) ([]Host, error) { +func (c *Client) GetHostsSeenInLastDuration(timeAgo time.Duration) ([]Host, error) { now := time.Now().UTC() timeAgoFromNow := now.Add(-timeAgo) formattedTime := timeAgoFromNow.Format(time.RFC3339) @@ -72,7 +72,7 @@ func (client *Client) GetHostsSeenInLastDuration(timeAgo time.Duration) ([]Host, } `json:"data"` } var resp GetHostsResponse - if err := client.do(req, &resp); err != nil { + if err := c.do(req, &resp); err != nil { return nil, fmt.Errorf("http request failed: %w", err) } @@ -84,21 +84,21 @@ func (client *Client) GetHostsSeenInLastDuration(timeAgo time.Duration) ([]Host, } // do sends a GraphQL request and returns the response -func (client *Client) do(gqlReq Request, gqlResp any) error { +func (c *Client) do(gqlReq Request, gqlResp any) error { data, err := json.Marshal(gqlReq) if err != nil { return fmt.Errorf("failed to marshal json request to json: %w", err) } - req, err := http.NewRequest(http.MethodPost, client.URL, bytes.NewBuffer(data)) + req, err := http.NewRequest(http.MethodPost, c.URL, bytes.NewBuffer(data)) if err != nil { return err } req.Header.Set("Content-Type", "application/json") - client.Credential.Authenticate(req) + c.Credential.Authenticate(req) - resp, err := client.HTTP.Do(req) + resp, err := c.HTTP.Do(req) if err != nil { return fmt.Errorf("failed to send request: %v", err) }