Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alpkeskin
GitHub Repository: alpkeskin/mosint
Path: blob/master/v3/pkg/services/haveibeenpwned/haveibeenpwned.go
689 views
1
/*
2
Copyright © 2023 github.com/alpkeskin
3
*/
4
package haveibeenpwned
5
6
import (
7
"encoding/json"
8
"fmt"
9
"io"
10
"net/http"
11
"strings"
12
"time"
13
14
"github.com/alpkeskin/mosint/v3/internal/config"
15
"github.com/alpkeskin/mosint/v3/internal/spinner"
16
"github.com/fatih/color"
17
)
18
19
type HaveIBeenPwned struct {
20
Response HaveIBeenPwnedResponse
21
}
22
23
type HaveIBeenPwnedResponse []struct {
24
Name string `json:"Name"`
25
Title string `json:"Title"`
26
Domain string `json:"Domain"`
27
BreachDate string `json:"BreachDate"`
28
AddedDate time.Time `json:"AddedDate"`
29
ModifiedDate time.Time `json:"ModifiedDate"`
30
PwnCount int `json:"PwnCount"`
31
Description string `json:"Description"`
32
LogoPath string `json:"LogoPath"`
33
DataClasses []string `json:"DataClasses"`
34
IsVerified bool `json:"IsVerified"`
35
IsFabricated bool `json:"IsFabricated"`
36
IsSensitive bool `json:"IsSensitive"`
37
IsRetired bool `json:"IsRetired"`
38
IsSpamList bool `json:"IsSpamList"`
39
IsMalware bool `json:"IsMalware"`
40
IsSubscriptionFree bool `json:"IsSubscriptionFree"`
41
}
42
43
func New() *HaveIBeenPwned {
44
return &HaveIBeenPwned{}
45
}
46
47
func (h *HaveIBeenPwned) Lookup(email string) {
48
spinner := spinner.New("HaveIBeenPwned Lookup")
49
spinner.Start()
50
51
key := config.Cfg.Services.HaveIBeenPwnedApiKey
52
if strings.EqualFold(key, "") {
53
spinner.StopFail()
54
spinner.SetMessage("HaveIBeenPwned Api Key is empty")
55
return
56
}
57
58
url := fmt.Sprintf("https://haveibeenpwned.com/api/v3/breachedaccount/%s?truncateResponse=false", email)
59
req, err := http.NewRequest("GET", url, nil)
60
61
if err != nil {
62
spinner.StopFail()
63
spinner.SetMessage(err.Error())
64
return
65
}
66
67
req.Header.Set("hibp-api-key", key)
68
req.Header.Set("User-Agent", "mosint")
69
70
client := &http.Client{}
71
resp, err := client.Do(req)
72
73
if err != nil {
74
spinner.StopFail()
75
spinner.SetMessage(err.Error())
76
return
77
}
78
79
defer resp.Body.Close()
80
81
body, err := io.ReadAll(resp.Body)
82
83
if err != nil {
84
spinner.StopFail()
85
spinner.SetMessage(err.Error())
86
return
87
}
88
89
defer resp.Body.Close()
90
var response HaveIBeenPwnedResponse
91
json.Unmarshal(body, &response)
92
h.Response = response
93
spinner.Stop()
94
}
95
96
func (h *HaveIBeenPwned) Print() {
97
key := config.Cfg.Services.HaveIBeenPwnedApiKey
98
if strings.EqualFold(key, "") {
99
return
100
}
101
102
if len(h.Response) == 0 {
103
return
104
}
105
106
fmt.Println("[*] HaveIBeenPwned Breaches")
107
for _, v := range h.Response {
108
fmt.Println(color.GreenString("[+]"), "Name:", v.Name)
109
fmt.Println(color.GreenString("[+]"), "Domain:", v.Domain)
110
fmt.Println(color.GreenString("[+]"), "Breach Date:", v.BreachDate)
111
fmt.Println(color.GreenString("[+]"), "DataClasses:")
112
for _, d := range v.DataClasses {
113
fmt.Println(" -", d)
114
}
115
fmt.Println()
116
}
117
}
118
119