Path: blob/master/v3/pkg/services/haveibeenpwned/haveibeenpwned.go
689 views
/*1Copyright © 2023 github.com/alpkeskin2*/3package haveibeenpwned45import (6"encoding/json"7"fmt"8"io"9"net/http"10"strings"11"time"1213"github.com/alpkeskin/mosint/v3/internal/config"14"github.com/alpkeskin/mosint/v3/internal/spinner"15"github.com/fatih/color"16)1718type HaveIBeenPwned struct {19Response HaveIBeenPwnedResponse20}2122type HaveIBeenPwnedResponse []struct {23Name string `json:"Name"`24Title string `json:"Title"`25Domain string `json:"Domain"`26BreachDate string `json:"BreachDate"`27AddedDate time.Time `json:"AddedDate"`28ModifiedDate time.Time `json:"ModifiedDate"`29PwnCount int `json:"PwnCount"`30Description string `json:"Description"`31LogoPath string `json:"LogoPath"`32DataClasses []string `json:"DataClasses"`33IsVerified bool `json:"IsVerified"`34IsFabricated bool `json:"IsFabricated"`35IsSensitive bool `json:"IsSensitive"`36IsRetired bool `json:"IsRetired"`37IsSpamList bool `json:"IsSpamList"`38IsMalware bool `json:"IsMalware"`39IsSubscriptionFree bool `json:"IsSubscriptionFree"`40}4142func New() *HaveIBeenPwned {43return &HaveIBeenPwned{}44}4546func (h *HaveIBeenPwned) Lookup(email string) {47spinner := spinner.New("HaveIBeenPwned Lookup")48spinner.Start()4950key := config.Cfg.Services.HaveIBeenPwnedApiKey51if strings.EqualFold(key, "") {52spinner.StopFail()53spinner.SetMessage("HaveIBeenPwned Api Key is empty")54return55}5657url := fmt.Sprintf("https://haveibeenpwned.com/api/v3/breachedaccount/%s?truncateResponse=false", email)58req, err := http.NewRequest("GET", url, nil)5960if err != nil {61spinner.StopFail()62spinner.SetMessage(err.Error())63return64}6566req.Header.Set("hibp-api-key", key)67req.Header.Set("User-Agent", "mosint")6869client := &http.Client{}70resp, err := client.Do(req)7172if err != nil {73spinner.StopFail()74spinner.SetMessage(err.Error())75return76}7778defer resp.Body.Close()7980body, err := io.ReadAll(resp.Body)8182if err != nil {83spinner.StopFail()84spinner.SetMessage(err.Error())85return86}8788defer resp.Body.Close()89var response HaveIBeenPwnedResponse90json.Unmarshal(body, &response)91h.Response = response92spinner.Stop()93}9495func (h *HaveIBeenPwned) Print() {96key := config.Cfg.Services.HaveIBeenPwnedApiKey97if strings.EqualFold(key, "") {98return99}100101if len(h.Response) == 0 {102return103}104105fmt.Println("[*] HaveIBeenPwned Breaches")106for _, v := range h.Response {107fmt.Println(color.GreenString("[+]"), "Name:", v.Name)108fmt.Println(color.GreenString("[+]"), "Domain:", v.Domain)109fmt.Println(color.GreenString("[+]"), "Breach Date:", v.BreachDate)110fmt.Println(color.GreenString("[+]"), "DataClasses:")111for _, d := range v.DataClasses {112fmt.Println(" -", d)113}114fmt.Println()115}116}117118119