Skip to content

Commit 9750397

Browse files
committed
H1 gql endpoint requires x-csrf-token now instead of the auth header
1 parent a0e2634 commit 9750397

File tree

1 file changed

+44
-6
lines changed

1 file changed

+44
-6
lines changed

pkg/generators/H1Generator.go

+44-6
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,34 @@ import (
99
"io/ioutil"
1010
"log"
1111
"net/http"
12+
"net/http/cookiejar"
13+
"strings"
1214
"time"
1315
)
1416

1517
type H1Generator struct {
1618
filterFunc ItemFilterFunc
1719
itemModFunc ItemModifierFunc
20+
client *http.Client
21+
}
22+
23+
func (g *H1Generator) httpclient() *http.Client {
24+
if g.client != nil {
25+
return g.client
26+
}
27+
28+
jar, err := cookiejar.New(&cookiejar.Options{PublicSuffixList: nil})
29+
if err != nil {
30+
panic(err)
31+
}
32+
33+
g.client = &http.Client{
34+
Transport: nil,
35+
CheckRedirect: nil,
36+
Jar: jar,
37+
Timeout: 15 * time.Second,
38+
}
39+
return g.client
1840
}
1941

2042
func (g *H1Generator) Feed() (*feeds.Feed, error) {
@@ -173,19 +195,19 @@ func (g *H1Generator) query() (map[string]interface{}, error) {
173195
"count": 25,
174196
"maxShownVoters": 10
175197
},
176-
"query": "query HacktivityPageQuery($querystring: String, $orderBy: HacktivityItemOrderInput, $secureOrderBy: FiltersHacktivityItemFilterOrder, $where: FiltersHacktivityItemFilterInput, $count: Int, $cursor: String, $maxShownVoters: Int) {\n me {\n id\n __typename\n }\n hacktivity_items(first: $count, after: $cursor, query: $querystring, order_by: $orderBy, secure_order_by: $secureOrderBy, where: $where) {\n total_count\n ...HacktivityList\n __typename\n }\n}\n\nfragment HacktivityList on HacktivityItemConnection {\n total_count\n pageInfo {\n endCursor\n hasNextPage\n __typename\n }\n edges {\n node {\n ... on HacktivityItemInterface {\n id\n databaseId: _id\n ...HacktivityItem\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment HacktivityItem on HacktivityItemUnion {\n type: __typename\n ... on HacktivityItemInterface {\n id\n votes {\n total_count\n __typename\n }\n voters: votes(last: $maxShownVoters) {\n edges {\n node {\n id\n user {\n id\n username\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n upvoted: upvoted_by_current_user\n __typename\n }\n ... on Undisclosed {\n id\n ...HacktivityItemUndisclosed\n __typename\n }\n ... on Disclosed {\n id\n ...HacktivityItemDisclosed\n __typename\n }\n ... on HackerPublished {\n id\n ...HacktivityItemHackerPublished\n __typename\n }\n}\n\nfragment HacktivityItemUndisclosed on Undisclosed {\n id\n reporter {\n id\n username\n ...UserLinkWithMiniProfile\n __typename\n }\n team {\n handle\n name\n medium_profile_picture: profile_picture(size: medium)\n url\n id\n ...TeamLinkWithMiniProfile\n __typename\n }\n latest_disclosable_action\n latest_disclosable_activity_at\n requires_view_privilege\n total_awarded_amount\n currency\n __typename\n}\n\nfragment TeamLinkWithMiniProfile on Team {\n id\n handle\n name\n __typename\n}\n\nfragment UserLinkWithMiniProfile on User {\n id\n username\n __typename\n}\n\nfragment HacktivityItemDisclosed on Disclosed {\n id\n reporter {\n id\n username\n ...UserLinkWithMiniProfile\n __typename\n }\n team {\n handle\n name\n medium_profile_picture: profile_picture(size: medium)\n url\n id\n ...TeamLinkWithMiniProfile\n __typename\n }\n report {\n id\n title\n substate\n url\n __typename\n }\n latest_disclosable_action\n latest_disclosable_activity_at\n total_awarded_amount\n severity_rating\n currency\n __typename\n}\n\nfragment HacktivityItemHackerPublished on HackerPublished {\n id\n reporter {\n id\n username\n ...UserLinkWithMiniProfile\n __typename\n }\n team {\n id\n handle\n name\n medium_profile_picture: profile_picture(size: medium)\n url\n ...TeamLinkWithMiniProfile\n __typename\n }\n report {\n id\n url\n title\n substate\n __typename\n }\n latest_disclosable_activity_at\n severity_rating\n __typename\n}\n"
198+
"query": "query HacktivityPageQuery($querystring: String, $orderBy: HacktivityItemOrderInput, $secureOrderBy: FiltersHacktivityItemFilterOrder, $where: FiltersHacktivityItemFilterInput, $count: Int, $cursor: String, $maxShownVoters: Int) {\n me {\n id\n __typename\n }\n hacktivity_items(\n first: $count\n after: $cursor\n query: $querystring\n order_by: $orderBy\n secure_order_by: $secureOrderBy\n where: $where\n ) {\n ...HacktivityList\n __typename\n }\n}\n\nfragment HacktivityList on HacktivityItemConnection {\n pageInfo {\n endCursor\n hasNextPage\n __typename\n }\n edges {\n node {\n ... on HacktivityItemInterface {\n id\n databaseId: _id\n __typename\n }\n __typename\n }\n ...HacktivityItem\n __typename\n }\n __typename\n}\n\nfragment HacktivityItem on HacktivityItemUnionEdge {\n node {\n ... on HacktivityItemInterface {\n id\n type: __typename\n }\n ... on Undisclosed {\n id\n ...HacktivityItemUndisclosed\n __typename\n }\n ... on Disclosed {\n id\n ...HacktivityItemDisclosed\n __typename\n }\n ... on HackerPublished {\n id\n ...HacktivityItemHackerPublished\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment HacktivityItemUndisclosed on Undisclosed {\n id\n votes {\n total_count\n __typename\n }\n voters: votes(last: $maxShownVoters) {\n edges {\n node {\n id\n user {\n id\n username\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n upvoted: upvoted_by_current_user\n reporter {\n id\n username\n ...UserLinkWithMiniProfile\n __typename\n }\n team {\n handle\n name\n medium_profile_picture: profile_picture(size: medium)\n url\n id\n ...TeamLinkWithMiniProfile\n __typename\n }\n latest_disclosable_action\n latest_disclosable_activity_at\n requires_view_privilege\n total_awarded_amount\n currency\n __typename\n}\n\nfragment TeamLinkWithMiniProfile on Team {\n id\n handle\n name\n __typename\n}\n\nfragment UserLinkWithMiniProfile on User {\n id\n username\n __typename\n}\n\nfragment HacktivityItemDisclosed on Disclosed {\n id\n reporter {\n id\n username\n ...UserLinkWithMiniProfile\n __typename\n }\n votes {\n total_count\n __typename\n }\n voters: votes(last: $maxShownVoters) {\n edges {\n node {\n id\n user {\n id\n username\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n upvoted: upvoted_by_current_user\n team {\n handle\n name\n medium_profile_picture: profile_picture(size: medium)\n url\n id\n ...TeamLinkWithMiniProfile\n __typename\n }\n report {\n id\n databaseId: _id\n title\n substate\n url\n __typename\n }\n latest_disclosable_action\n latest_disclosable_activity_at\n total_awarded_amount\n severity_rating\n currency\n __typename\n}\n\nfragment HacktivityItemHackerPublished on HackerPublished {\n id\n reporter {\n id\n username\n ...UserLinkWithMiniProfile\n __typename\n }\n votes {\n total_count\n __typename\n }\n voters: votes(last: $maxShownVoters) {\n edges {\n node {\n id\n user {\n id\n username\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n upvoted: upvoted_by_current_user\n team {\n id\n handle\n name\n medium_profile_picture: profile_picture(size: medium)\n url\n ...TeamLinkWithMiniProfile\n __typename\n }\n report {\n id\n url\n title\n substate\n __typename\n }\n latest_disclosable_activity_at\n severity_rating\n __typename\n}\n"
177199
}`
178-
client := http.Client{
179-
Timeout: 15 * time.Second,
180-
}
200+
client := g.httpclient()
181201

182202
req, err := http.NewRequest("POST", url, bytes.NewBuffer([]byte(body)))
183203
if err != nil {
184204
return nil, err
185205
}
186206
req.Header.Add("Content-Type", "application/json")
187-
req.Header.Add("user-agent", "feedgen/0.1")
188-
req.Header.Add("X-Auth-Token", "----")
207+
req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0")
208+
req.Header.Add("x-csrf-token", g.csrftoken())
209+
req.Header.Add("Origin", "https://hackerone.com")
210+
req.Header.Add("Referer", "https://hackerone.com/hacktivity?querystring=&filter=type:public&order_direction=DESC&order_field=latest_disclosable_activity_at&followed_only=false")
189211
res, err := client.Do(req)
190212
if err != nil {
191213
return nil, err
@@ -203,3 +225,19 @@ func (g *H1Generator) query() (map[string]interface{}, error) {
203225
}
204226
return out, nil
205227
}
228+
229+
func (g *H1Generator) csrftoken() string {
230+
client := g.httpclient()
231+
req, _ := http.NewRequest("GET", "https://hackerone.com/hacktivity?querystring=&filter=type:public&order_direction=DESC&order_field=latest_disclosable_activity_at&followed_only=false", nil)
232+
req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0")
233+
if res, err := client.Do(req); err == nil {
234+
defer res.Body.Close()
235+
responseBody, _ := ioutil.ReadAll(res.Body)
236+
i := strings.Index(string(responseBody), "name=\"csrf-token\"")
237+
if i >= 0 {
238+
return strings.Split(string(responseBody[i+len("name=\"csrf-token\""):]), "\"")[1]
239+
}
240+
return ""
241+
}
242+
return ""
243+
}

0 commit comments

Comments
 (0)