From d562b238c23f6a6fb49ba796dc4d321c4d176fee Mon Sep 17 00:00:00 2001 From: Joost Agterhoek Date: Wed, 14 Aug 2024 15:34:48 +0200 Subject: [PATCH] corrected wrong import and added generic lookup module --- .../__pycache__/domain_lookup.cpython-312.pyc | Bin 0 -> 428 bytes generic/__pycache__/ip_lookup.cpython-312.pyc | Bin 0 -> 418 bytes generic/__pycache__/sanitize.cpython-312.pyc | Bin 0 -> 493 bytes generic/__pycache__/spf_dmarc.cpython-312.pyc | Bin 0 -> 1361 bytes .../__pycache__/type_hosts.cpython-312.pyc | Bin 0 -> 2040 bytes .../type_hosts_listed.cpython-312.pyc | Bin 0 -> 795 bytes .../type_hosts_organized.cpython-312.pyc | Bin 0 -> 2049 bytes generic/domain_lookup.py | 5 +++ generic/ip_lookup.py | 5 +++ generic/sanitize.py | 7 ++++ generic/spf_dmarc.py | 19 +++++++++ generic/type_hosts_listed.py | 8 ++++ generic/type_hosts_organized.py | 38 ++++++++++++++++++ tkinter-enter.py | 5 ++- 14 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 generic/__pycache__/domain_lookup.cpython-312.pyc create mode 100644 generic/__pycache__/ip_lookup.cpython-312.pyc create mode 100644 generic/__pycache__/sanitize.cpython-312.pyc create mode 100644 generic/__pycache__/spf_dmarc.cpython-312.pyc create mode 100644 generic/__pycache__/type_hosts.cpython-312.pyc create mode 100644 generic/__pycache__/type_hosts_listed.cpython-312.pyc create mode 100644 generic/__pycache__/type_hosts_organized.cpython-312.pyc create mode 100644 generic/domain_lookup.py create mode 100644 generic/ip_lookup.py create mode 100644 generic/sanitize.py create mode 100644 generic/spf_dmarc.py create mode 100644 generic/type_hosts_listed.py create mode 100644 generic/type_hosts_organized.py diff --git a/generic/__pycache__/domain_lookup.cpython-312.pyc b/generic/__pycache__/domain_lookup.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..383727c8070db2071f9d863613fd4782f471a624 GIT binary patch literal 428 zcmX|7Jxc>Y5Z%25i67^IAJ`tGI^^77VI_hnVwDsUi!|Z99nZbwZo}>-5Qvb%|B%*J z@(=tAR$`%?c2;)6b*bD0p8=qPUA% zh*}S*g@@QH{TM+##D&g4sW^E}2NR_Jxp>*ls0tgQX~Ey)5xznmu6tItB6-*WmDv%f zJ1*7DFbxtg1m#J<(yU^trY22K*PStvq>6;3DM3gQ2hm~eh%{0-7i<8o?_LWQgWF7X zCL~k9lzW;;1%d_%IpY*a)Mviw>UTNs^m`Gr&de9qYn|i1=>$L+)1xP7Y z^#tb6a!)Yc-t|{bMqO4(l;Ry+|by3l7Ryj^M?RVis YZ0OYNL)zN?mN3Sj$j-|a-kHn)0P9p{%>V!Z literal 0 HcmV?d00001 diff --git a/generic/__pycache__/ip_lookup.cpython-312.pyc b/generic/__pycache__/ip_lookup.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fae8203a15f9ade0073262c961d92b63461e5a5f GIT binary patch literal 418 zcmX@j%ge<81gn#Gr6mIC#~=<2FhLogg@BCd3@HpLj5!QZ3@J=43{i}gjGD|ZK??km z8KLSx6f+cmHUKiFGnByPvS6lxR6#)v!)mB}En^L1FoPzepC;2Sw&MKc?9`H5yy>YW z8TrK}NtKByDMdgDCeMId93YXr#N59 zQeBEN%Tg6|6~c-#vr-j8^MJgf;>?oN%n}91+~ShdqLjp3edqj?RQ>eQOkI$vx;gpz z*`)>g>8W|CMVZO^nFa9>5xs)STRcF=#KY_^;sn|a@@cU+kZ54I!!LTBU-=@x@&c#J z{OS!JH@Jlx{67Pw7&MuRSb!8*!%BuCP*@jn0Eu55Ho5sJr8%i~MLa+*C=`l$fy4)9 RMn=Zl47{INm>5OC$^or)Vr~Ec literal 0 HcmV?d00001 diff --git a/generic/__pycache__/sanitize.cpython-312.pyc b/generic/__pycache__/sanitize.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81b4c28ca6b94ce784247ae22f4311d53c017fc1 GIT binary patch literal 493 zcmX@j%ge<81gnyFrL6_hk3k$5V1hC}3jrC^8B!Qh7;_k+7*d#87@`;}88w+-f)w~A zGeXsYC>9`Q2I9|AKw>&W4MP^PEKm#tRzoPDdD-R+3`G(pARS9QeBEN%Tg6|6~c-# zvr-j8^MJgf;>?oN%n}91+~ShdqLjp3edqj?RQ>eQOkI%ax;gpz*`)>g>8W|CMVZO^ zFst+mDsS>2WCb_#@h^>pIMk0Wx>h;0u*u^ literal 0 HcmV?d00001 diff --git a/generic/__pycache__/spf_dmarc.cpython-312.pyc b/generic/__pycache__/spf_dmarc.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02d1dc0339384ad646deea7a785364fe992b9f87 GIT binary patch literal 1361 zcmZ`(-D@0G6u)<7b~njxK9)@xQc^qGfDUbTN;inLAt((f)~3~L#Rf_k=H4W;osaFk zv$Y8mT%-?*f{I|~K`@VM5&BsC7kt_6781r31Yhi1VEdqX>bbKYNsC^X^F3$I`JHp; z_u=6o1m_p)x0SMl&|gC79i=O@=Rw#)1QF~Y7cXHfWXX|Sc}Y%W*-@4hqRS!;M-^r-Wj2bDAGADLN3tw-1u@Rm6^3&*6bM)oUmEG)U z{Zbo3(Q~k-!62Y*KLm0V)H5xMg8~U%tm%a0kB1D`*}4Du04?yZ}oq^ML76EEUhj3e4E$ zVkMSgZn#d<0kJQEXPIYERcRw};jfln+%oMV*N99R@_!Q!!mE#In{%=7}=qw!GJ z59<}@#E#jX<hz9UYO1CC7hCEZ5Asd*LPHtf%O8(szB^fe@6Up|b^hD)(9iuhAFMS?@9dN= zH%pgWr7MlAA2hCh*eESNnk=^pWk{EsjGRXHbVE7KU=m0ljK`ASMAA$#p$P`@$PqL2 zlEA^lZ;c5o6R_e`P^&sLY2#;<(modhV(QA*<)E_9n fugG{TD(oX*+l97Z`?(B0^9`7QMaP~BmSlYfyu&!$ literal 0 HcmV?d00001 diff --git a/generic/__pycache__/type_hosts.cpython-312.pyc b/generic/__pycache__/type_hosts.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dfee58dcc75166a94eef71cc1ec5468be1002cbc GIT binary patch literal 2040 zcma)7&2Jk;6rbIl_2;^Y?YJNLViTvS3{6avHmE5os+zQRT(ZGQRznY!;8KZ0Xe6ZMK$zLsv5QhA&z?6s z^M3PtZ|BXt{nh9504je4?tGAh0Q|uQ72(SdtNZE0eV_n^OM+`a;qQQJoFY)o-{KcKqMt}iEKtvpl@B|Tx}W{Kv9S>mhzIL2q~i%q zzd;17BO>B#Qqv=lz#AE?6R(m<#kBNjI+jw2peGgLPiIgnmeeLyWpvYs8M91fJrPZ% z^=LeL6{`qG6S1+L*ZZOu)9L`y##OmXeh+C0Rlb_0BZM_w)pYq(3hOFTVyWoqjG{)d zmdYm8u89o#unWhLmep}|Oiimui%0caS#^{}g}bx2hwJbpQeezir~T5FEJoY7HBU=YLYe)?^6VvFYy0k}9?m0p-6| z!*5@Y3VO4zuEC)ir1T<+jjBi#FyMBPR1wtg7d32qc3=~CWcyL~S2z@&`YG=__45k^ z2E8r^s5ud=V5+^r4}gL*PBR(juhY|=a~jUi`FjpX$2n(ppC|`>DTlCY4)LWNaMv7; zmvV@^dA`D%^L{w?HNKW=#xuId1{?i#!~w zSRT4`ShlTlOi_@Ev7A9NyUwh(^vftf_aCujpa!NwR7E_*Gfr!b64NsX6X7OG5=ShX zRnrP_Z2Gk?KY?0y{HU$_?1eD78HC?OXP>n!eTshGFG|feL5t~Y znNdoOP&42%d;OXboQ6v31%ELVdFAvGhtgXzSQ1R^v@ny zXzwY(US>RN!scZdHeq;9TOdDyu2+zmR8t&z_DHPYU*MmqX1 z`_ldtbq^kLJ@UH;54#@qx(AQAeh#?@`&Hayp2}Ba@ z!Gl7$^=Elgy7&-Z0ay~{zuXCD?^+bDC3)Rx6 z^V~aO5bQmbpoKO;MeFKBm}=;zfpy=ZUMSY7878q~>4qIjhTF(TdO1uG7Gf#gb%~8t zF-$ykJl_jvM#Thg4+Bzk@CR2E<;c=3+t}z8Q=>+d zqRl+&89p(5W!3V0La}aXw;fEhYTd~3mO0aLcIvKHB{rc(S@WAN8D6<<8mt0ebDLr6 zBuZ!42z(6h2~)e!o4>HT(VLz74MIYFE`6Vxds%oUprm(8l}@R0SltOqX5c>l3-Ac73crR&AK;d7NBG0NyFyRSbmfJPyzn~z zRleF!uxt8BkTZwU#Q~cDRDtrviRO9>be7xGOdU<$upC@BNrCdM<_qWX|JN50Lf_!r KKuVxYg#QB-6R&{) literal 0 HcmV?d00001 diff --git a/generic/__pycache__/type_hosts_organized.cpython-312.pyc b/generic/__pycache__/type_hosts_organized.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5855079eeedd4b9f4124fb66f6cddd99e9ce4390 GIT binary patch literal 2049 zcma)7O>7%Q6rSCk_3yfgowz^wW9$4>h9;&-e`tz|swSm>B!#3LDyqoxF6kQEYi2eH zjn>piNHkI>D9GBxwkgUZ~D-(skU7kfgid)uNZ30EOT}CKS z0Zm|=nMO2Cp(f9CPB4WLV1f}46^Eic0f>b(4X382dLD8;_y2qJ=uuQ4K5WF1fu}U% z3K6h@h={W(&4@w*ujtqyenn5mwai#1o>qxqq!bd&=qMdeY167Qwq?YOS*G$Z8%t-5 zSR!^2s|d%E@$ueQ566Zx>HyLvRk>S!7imdVzL=pSgf&Ce4EaPF8!A%b>DWnKQDfs1 zS~qjtoznFWCbF?{HKQUe5i_o4)iGwkV>%j-XPEn*>{a63jt14yDA<1u*Zmum5ktk%sr$tglP`_W)uNqOS6ZXlMNM2wKw?zP;e(`CKLQ+dd72Z)BQPr!v*O$=dSJ(<$%xR5MG!=d?p8c zVGh?bIm8#`7@=>+Id3@ioTsRJh}DUU@0`cPT`mPgICB9Lmr9F93QzZrUeT~j{~6to z<1$6=m(N_-FFR&At|&;wSk{ruZZ<11{W1#C1R$0T)W}qrs;H0nCTYo0;)aee5hhTI zxZ>HYno)>r%dvC&3DmNa2OWKwh>jB?W|5XLXha_w6dv^u(WxS&u1rX)m^1OD-xlVa z9eToP*h70(;FutGB8jhBkWhq9utSee)61O)_v%A-L)fkh+M&jOyy7lbet2C1(vJLq zy`w(=rtOpRCv7?$wClqUfKMFauERBdxNv;t_*_TH|B@}$7tYO`n}f?z>snyfYM{*u zw9Of%K!+_g6ozJoZqf4f)f>ywE7V#Tn;DxMEd?UqCBN6d)fbdf*D+hFE1aDz<)oj<7o@FuEGurb}WQfI*$}j%*U5HkCfnRw!di+Hf=uef{sI*q^p0E zM0z(#=Ml_4xxd7`gZn&pg5JUXo;!Ws!2_OO!`{Keo~VF!QnQnEXZwEusGd!*+&uKW lp4OF#lzJR>&><_hm>sHhf#bM8LGS@|bB!CJCa&38^FPH^#Nq$| literal 0 HcmV?d00001 diff --git a/generic/domain_lookup.py b/generic/domain_lookup.py new file mode 100644 index 0000000..251d54b --- /dev/null +++ b/generic/domain_lookup.py @@ -0,0 +1,5 @@ +import socket + +def get_ip_address(domain): + hostname = socket.gethostbyname(domain) + return hostname diff --git a/generic/ip_lookup.py b/generic/ip_lookup.py new file mode 100644 index 0000000..a2b6ca5 --- /dev/null +++ b/generic/ip_lookup.py @@ -0,0 +1,5 @@ +import socket + +def get_hostname(IP): + hostname = socket.gethostbyaddr(IP) + return hostname diff --git a/generic/sanitize.py b/generic/sanitize.py new file mode 100644 index 0000000..5da7c76 --- /dev/null +++ b/generic/sanitize.py @@ -0,0 +1,7 @@ +import re + +def strip_and_list(hosts): + if hosts.strip() != '': + sanitized = re.split("; |, | |\n", hosts) + return sanitized + # break diff --git a/generic/spf_dmarc.py b/generic/spf_dmarc.py new file mode 100644 index 0000000..f310eff --- /dev/null +++ b/generic/spf_dmarc.py @@ -0,0 +1,19 @@ +from checkdmarc.dmarc import check_dmarc +from checkdmarc.spf import check_spf +import validators + +def extract_domain(host: str) -> str: + if validators.email(host): + host = host.split('@')[1] + return host + + +def lookup(host: str) -> tuple: + host = extract_domain(host) + result_dmarc = check_dmarc(host) + dmarc_quarantine = result_dmarc['record'].split(';')[1] + result_spf = check_spf(host) + # spf_includes = result_spf['record'].split()[1:] + spf_includes = ', '.join(str(item) for item in result_spf['record'].split()[1:]) + return (dmarc_quarantine, spf_includes) + diff --git a/generic/type_hosts_listed.py b/generic/type_hosts_listed.py new file mode 100644 index 0000000..0ca4cf2 --- /dev/null +++ b/generic/type_hosts_listed.py @@ -0,0 +1,8 @@ +import validators + +def type_hosts(hosts): + validated_hosts = [] + for host in hosts: + if validators.url(host) or validators.domain(host) or validators.ipv4(host) or validators.ipv6(host) or validators.email(host): + validated_hosts.append(host) + return validated_hosts diff --git a/generic/type_hosts_organized.py b/generic/type_hosts_organized.py new file mode 100644 index 0000000..27b88f1 --- /dev/null +++ b/generic/type_hosts_organized.py @@ -0,0 +1,38 @@ +import validators + +def normalize(host): + domain_name, tld = "", "" + if host.startswith('www.'): + domain_name, tld = str.split(host,'.')[-2:] + normalized_domain = domain_name + '.' + tld + return normalized_domain + else: + return host + +def type_hosts(hosts): + validated_hosts = { + "URLs": [], + "domains": [], + "IPs": [], + "emails": [], + } + URLs = [] + domains = [] + IPs = [] + email = [] + for host in hosts: + if validators.url(host): + URLs.append(host) + elif validators.domain(host): + domains.append(normalize(host)) + elif validators.ipv4(host) or validators.ipv6(host): + IPs.append(host) + elif validators.email(host): + email.append(host) + else: + print("This is not a URL, IP, email address or hostname: ", host) + validated_hosts["URLs"].extend([i for i in URLs]) + validated_hosts["domains"].extend([i for i in domains]) + validated_hosts["IPs"].extend([i for i in IPs]) + validated_hosts["emails"].extend([i for i in email]) + return validated_hosts diff --git a/tkinter-enter.py b/tkinter-enter.py index 022f1bb..e632782 100644 --- a/tkinter-enter.py +++ b/tkinter-enter.py @@ -1,14 +1,15 @@ -# From: https://www.geeksforgeeks.org/how-to-bind-the-enter-key-to-a-tkinter-window/ +# From: https://www.geeksforgeeks.org/how-to-bind-the-enter-key-to-a-t//kinter-window/ # importing tkinter import tkinter as tk -from ..generic import sanitize, type_hosts_listed, type_hosts_organized, ip_lookup, domain_lookup, spf_dmarc +from generic import sanitize, type_hosts_listed, type_hosts_organized, ip_lookup, domain_lookup, spf_dmarc # function to run on pressing # 'ENTER' key from keyboard. def key_handler_function(event): inputs = entry.get() + print(type(inputs)) sanitized = sanitize.strip_and_list(inputs) typed = type_hosts_listed.type_hosts(sanitized) textbox.insert('end', typed)