whois.go 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. package netutils
  2. import (
  3. "net"
  4. "strings"
  5. "time"
  6. )
  7. type WHOISResult struct {
  8. DomainName string `json:"domainName"`
  9. RegistryDomainID string `json:"registryDomainID"`
  10. Registrar string `json:"registrar"`
  11. UpdatedDate time.Time `json:"updatedDate"`
  12. CreationDate time.Time `json:"creationDate"`
  13. ExpiryDate time.Time `json:"expiryDate"`
  14. RegistrantID string `json:"registrantID"`
  15. RegistrantName string `json:"registrantName"`
  16. RegistrantEmail string `json:"registrantEmail"`
  17. AdminID string `json:"adminID"`
  18. AdminName string `json:"adminName"`
  19. AdminEmail string `json:"adminEmail"`
  20. TechID string `json:"techID"`
  21. TechName string `json:"techName"`
  22. TechEmail string `json:"techEmail"`
  23. NameServers []string `json:"nameServers"`
  24. DNSSEC string `json:"dnssec"`
  25. }
  26. func ParseWHOISResponse(response string) (WHOISResult, error) {
  27. result := WHOISResult{}
  28. lines := strings.Split(response, "\n")
  29. for _, line := range lines {
  30. line = strings.TrimSpace(line)
  31. if strings.HasPrefix(line, "Domain Name:") {
  32. result.DomainName = strings.TrimSpace(strings.TrimPrefix(line, "Domain Name:"))
  33. } else if strings.HasPrefix(line, "Registry Domain ID:") {
  34. result.RegistryDomainID = strings.TrimSpace(strings.TrimPrefix(line, "Registry Domain ID:"))
  35. } else if strings.HasPrefix(line, "Registrar:") {
  36. result.Registrar = strings.TrimSpace(strings.TrimPrefix(line, "Registrar:"))
  37. } else if strings.HasPrefix(line, "Updated Date:") {
  38. dateStr := strings.TrimSpace(strings.TrimPrefix(line, "Updated Date:"))
  39. updatedDate, err := time.Parse("2006-01-02T15:04:05Z", dateStr)
  40. if err == nil {
  41. result.UpdatedDate = updatedDate
  42. }
  43. } else if strings.HasPrefix(line, "Creation Date:") {
  44. dateStr := strings.TrimSpace(strings.TrimPrefix(line, "Creation Date:"))
  45. creationDate, err := time.Parse("2006-01-02T15:04:05Z", dateStr)
  46. if err == nil {
  47. result.CreationDate = creationDate
  48. }
  49. } else if strings.HasPrefix(line, "Registry Expiry Date:") {
  50. dateStr := strings.TrimSpace(strings.TrimPrefix(line, "Registry Expiry Date:"))
  51. expiryDate, err := time.Parse("2006-01-02T15:04:05Z", dateStr)
  52. if err == nil {
  53. result.ExpiryDate = expiryDate
  54. }
  55. } else if strings.HasPrefix(line, "Registry Registrant ID:") {
  56. result.RegistrantID = strings.TrimSpace(strings.TrimPrefix(line, "Registry Registrant ID:"))
  57. } else if strings.HasPrefix(line, "Registrant Name:") {
  58. result.RegistrantName = strings.TrimSpace(strings.TrimPrefix(line, "Registrant Name:"))
  59. } else if strings.HasPrefix(line, "Registrant Email:") {
  60. result.RegistrantEmail = strings.TrimSpace(strings.TrimPrefix(line, "Registrant Email:"))
  61. } else if strings.HasPrefix(line, "Registry Admin ID:") {
  62. result.AdminID = strings.TrimSpace(strings.TrimPrefix(line, "Registry Admin ID:"))
  63. } else if strings.HasPrefix(line, "Admin Name:") {
  64. result.AdminName = strings.TrimSpace(strings.TrimPrefix(line, "Admin Name:"))
  65. } else if strings.HasPrefix(line, "Admin Email:") {
  66. result.AdminEmail = strings.TrimSpace(strings.TrimPrefix(line, "Admin Email:"))
  67. } else if strings.HasPrefix(line, "Registry Tech ID:") {
  68. result.TechID = strings.TrimSpace(strings.TrimPrefix(line, "Registry Tech ID:"))
  69. } else if strings.HasPrefix(line, "Tech Name:") {
  70. result.TechName = strings.TrimSpace(strings.TrimPrefix(line, "Tech Name:"))
  71. } else if strings.HasPrefix(line, "Tech Email:") {
  72. result.TechEmail = strings.TrimSpace(strings.TrimPrefix(line, "Tech Email:"))
  73. } else if strings.HasPrefix(line, "Name Server:") {
  74. ns := strings.TrimSpace(strings.TrimPrefix(line, "Name Server:"))
  75. result.NameServers = append(result.NameServers, ns)
  76. } else if strings.HasPrefix(line, "DNSSEC:") {
  77. result.DNSSEC = strings.TrimSpace(strings.TrimPrefix(line, "DNSSEC:"))
  78. }
  79. }
  80. return result, nil
  81. }
  82. type WhoisIpLookupEntry struct {
  83. NetRange string
  84. CIDR string
  85. NetName string
  86. NetHandle string
  87. Parent string
  88. NetType string
  89. OriginAS string
  90. Organization Organization
  91. RegDate time.Time
  92. Updated time.Time
  93. Ref string
  94. }
  95. type Organization struct {
  96. OrgName string
  97. OrgId string
  98. Address string
  99. City string
  100. StateProv string
  101. PostalCode string
  102. Country string
  103. /*
  104. RegDate time.Time
  105. Updated time.Time
  106. OrgTechHandle string
  107. OrgTechName string
  108. OrgTechPhone string
  109. OrgTechEmail string
  110. OrgAbuseHandle string
  111. OrgAbuseName string
  112. OrgAbusePhone string
  113. OrgAbuseEmail string
  114. OrgRoutingHandle string
  115. OrgRoutingName string
  116. OrgRoutingPhone string
  117. OrgRoutingEmail string
  118. */
  119. }
  120. func ParseWhoisIpData(data string) (WhoisIpLookupEntry, error) {
  121. var entry WhoisIpLookupEntry = WhoisIpLookupEntry{}
  122. var org Organization = Organization{}
  123. lines := strings.Split(data, "\n")
  124. for _, line := range lines {
  125. line = strings.TrimSpace(line)
  126. if strings.HasPrefix(line, "NetRange:") {
  127. entry.NetRange = strings.TrimSpace(strings.TrimPrefix(line, "NetRange:"))
  128. } else if strings.HasPrefix(line, "CIDR:") {
  129. entry.CIDR = strings.TrimSpace(strings.TrimPrefix(line, "CIDR:"))
  130. } else if strings.HasPrefix(line, "NetName:") {
  131. entry.NetName = strings.TrimSpace(strings.TrimPrefix(line, "NetName:"))
  132. } else if strings.HasPrefix(line, "NetHandle:") {
  133. entry.NetHandle = strings.TrimSpace(strings.TrimPrefix(line, "NetHandle:"))
  134. } else if strings.HasPrefix(line, "Parent:") {
  135. entry.Parent = strings.TrimSpace(strings.TrimPrefix(line, "Parent:"))
  136. } else if strings.HasPrefix(line, "NetType:") {
  137. entry.NetType = strings.TrimSpace(strings.TrimPrefix(line, "NetType:"))
  138. } else if strings.HasPrefix(line, "OriginAS:") {
  139. entry.OriginAS = strings.TrimSpace(strings.TrimPrefix(line, "OriginAS:"))
  140. } else if strings.HasPrefix(line, "Organization:") {
  141. org.OrgName = strings.TrimSpace(strings.TrimPrefix(line, "Organization:"))
  142. } else if strings.HasPrefix(line, "OrgId:") {
  143. org.OrgId = strings.TrimSpace(strings.TrimPrefix(line, "OrgId:"))
  144. } else if strings.HasPrefix(line, "Address:") {
  145. org.Address = strings.TrimSpace(strings.TrimPrefix(line, "Address:"))
  146. } else if strings.HasPrefix(line, "City:") {
  147. org.City = strings.TrimSpace(strings.TrimPrefix(line, "City:"))
  148. } else if strings.HasPrefix(line, "StateProv:") {
  149. org.StateProv = strings.TrimSpace(strings.TrimPrefix(line, "StateProv:"))
  150. } else if strings.HasPrefix(line, "PostalCode:") {
  151. org.PostalCode = strings.TrimSpace(strings.TrimPrefix(line, "PostalCode:"))
  152. } else if strings.HasPrefix(line, "Country:") {
  153. org.Country = strings.TrimSpace(strings.TrimPrefix(line, "Country:"))
  154. } else if strings.HasPrefix(line, "RegDate:") {
  155. entry.RegDate, _ = parseDate(strings.TrimSpace(strings.TrimPrefix(line, "RegDate:")))
  156. } else if strings.HasPrefix(line, "Updated:") {
  157. entry.Updated, _ = parseDate(strings.TrimSpace(strings.TrimPrefix(line, "Updated:")))
  158. } else if strings.HasPrefix(line, "Ref:") {
  159. entry.Ref = strings.TrimSpace(strings.TrimPrefix(line, "Ref:"))
  160. }
  161. }
  162. entry.Organization = org
  163. return entry, nil
  164. }
  165. func parseDate(dateStr string) (time.Time, error) {
  166. dateLayout := "2006-01-02"
  167. date, err := time.Parse(dateLayout, strings.TrimSpace(dateStr))
  168. if err != nil {
  169. return time.Time{}, err
  170. }
  171. return date, nil
  172. }
  173. func isDomainName(input string) bool {
  174. ip := net.ParseIP(input)
  175. if ip != nil {
  176. // Check if it's IPv4 or IPv6
  177. if ip.To4() != nil {
  178. return false
  179. } else if ip.To16() != nil {
  180. return false
  181. }
  182. }
  183. _, err := net.LookupHost(input)
  184. return err == nil
  185. }