From 60139f377a1237cb75a6a9ae672f226a095cd150 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sat, 28 Feb 2026 01:38:24 +0000 Subject: [PATCH] OSINTAPP221 --- config/__pycache__/__init__.cpython-311.pyc | Bin 159 -> 159 bytes config/__pycache__/settings.cpython-311.pyc | Bin 5552 -> 5552 bytes config/__pycache__/urls.cpython-311.pyc | Bin 1557 -> 1557 bytes config/__pycache__/wsgi.cpython-311.pyc | Bin 679 -> 679 bytes core/__pycache__/__init__.cpython-311.pyc | Bin 157 -> 157 bytes core/__pycache__/admin.cpython-311.pyc | Bin 212 -> 212 bytes core/__pycache__/apps.cpython-311.pyc | Bin 524 -> 524 bytes .../context_processors.cpython-311.pyc | Bin 763 -> 763 bytes core/__pycache__/models.cpython-311.pyc | Bin 209 -> 1826 bytes .../osint_services.cpython-311.pyc | Bin 0 -> 4217 bytes core/__pycache__/urls.cpython-311.pyc | Bin 347 -> 550 bytes core/__pycache__/views.cpython-311.pyc | Bin 1364 -> 3644 bytes core/migrations/0001_initial.py | 28 ++ .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 1529 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 168 -> 168 bytes core/models.py | 28 +- core/osint_services.py | 80 ++++++ core/templates/base.html | 65 +++-- core/templates/core/index.html | 239 +++++++----------- core/templates/core/scan_detail.html | 106 ++++++++ core/urls.py | 8 +- core/views.py | 81 ++++-- static/css/custom.css | 103 +++++++- 23 files changed, 549 insertions(+), 189 deletions(-) create mode 100644 core/__pycache__/osint_services.cpython-311.pyc create mode 100644 core/migrations/0001_initial.py create mode 100644 core/migrations/__pycache__/0001_initial.cpython-311.pyc create mode 100644 core/osint_services.py create mode 100644 core/templates/core/scan_detail.html diff --git a/config/__pycache__/__init__.cpython-311.pyc b/config/__pycache__/__init__.cpython-311.pyc index 423a6362b2322713e75da67a35e209e76169dbae..5496d74e44790e79fb1607894502e0019b2c4543 100644 GIT binary patch delta 19 ZcmbQwIG>SwIWI340}zzBESktY1pq4i1fc)` delta 19 ZcmbQwIG>SwIWI340}xbw%b&y+NCMIWI340}zzBEZWGuR1^R>!UbIb delta 20 acmdm>y+NCMIWI340}xbw%iqYoR1^R_83p11 diff --git a/config/__pycache__/urls.cpython-311.pyc b/config/__pycache__/urls.cpython-311.pyc index 0b85e94ece283a83ff1af1d71f1b265c943eb37a..3b0d3e2bef8974fd731acf3c7bae03ebca9b8d2c 100644 GIT binary patch delta 20 acmbQrGnI#XIWI340}zzBEZWG;#RdQ`9|S)D delta 20 acmbQrGnI#XIWI340}xbw%iqY&#RdQ}b_B!# diff --git a/config/__pycache__/wsgi.cpython-311.pyc b/config/__pycache__/wsgi.cpython-311.pyc index 9c49e09df194d2dbcad4868349c9177db4b15571..dcc5b24b9d656045c44c48364b0758ca20c12d90 100644 GIT binary patch delta 20 acmZ3^x}24JIWI340}zzBEZWFDhY0{N?*!uj delta 20 acmZ3^x}24JIWI340}xbw%iqX7hY0{RMg?d9 diff --git a/core/__pycache__/__init__.cpython-311.pyc b/core/__pycache__/__init__.cpython-311.pyc index 74b111269bd81aac528770a53e2f849291524d56..6b40baa42a753da2fb6e5ffc396a756def32f35b 100644 GIT binary patch delta 19 ZcmbQsIG2%oIWI340}zzBESktY2>>dx1e*W= delta 19 ZcmbQsIG2%oIWI340}xbw%b&>mG1t0(b diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index a5ed392d6714413db63120e4233d2e96cbadb5de..907f2dfbce43e4e96dcc06f557f7cb8b585400a3 100644 GIT binary patch delta 19 Zcmcb@c!iOBIWI340}zzBESkuD5&$x#1wa4* delta 19 Zcmcb@c!iOBIWI340}xFAkw209Bmg!q1>^t# diff --git a/core/__pycache__/apps.cpython-311.pyc b/core/__pycache__/apps.cpython-311.pyc index 6f131d4873bc56e3763e4ed09960c6e3f34140e1..27ea22c16f4b0860e85a34f34441ae6c7b4ab10c 100644 GIT binary patch delta 20 acmeBS>0#ks&dbZi00bp2i#BpIG64WAlLQa| delta 20 acmeBS>0#ks&dbZi00dRv@;7obG64WD>I9Vl diff --git a/core/__pycache__/context_processors.cpython-311.pyc b/core/__pycache__/context_processors.cpython-311.pyc index 75bf2234fb21a6b62efc5cec11af9512dd0c9616..3073655dfeff237b1e2ea5fdf83aea2e7d9b61d6 100644 GIT binary patch delta 20 acmey(`kR$|IWI340}zzBEZWHZfe8RV4+Y-< delta 20 acmey(`kR$|IWI340}xbw%iqZTfe8RYW(H&c diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index e061640edbdcec3e5c1744466c916e7acdd2763b..85f270aff775cf68b2ea737c37ab6164d2bdacbb 100644 GIT binary patch literal 1826 zcmZuy%}*Og6rb4-I6vRs>L88ilV4A3bZ9H7L{owd|54?iLtZx(%E$( zZYx<;4jg*m5Q$1rrK$%?R1P`j&_BYKe6UvPsl9M>L=K2c``)f`fMmw|=Dpv0JM-rE zX4ZeiVqpU9@$B!V8JUoO&^T^tPdWGmlx@NYqb8})Jf)~hrj(Z?@)=?BBf=C;%kaM6 zc0l{HZ{-yx(dDs;Mj(00wI|7wB+!BCgJ{}D;fN$G<5MIqg6aiV}e!|Zv2mS9|zs>P>7 zq+k_)OA5{>u7Q0S9{U1_M!$E?U)`G73}W|RxdHBMIxdD`6eB1`LAc@E-8)%*X?bxj zC$Lm*=yg$1{z4 zo%kq%qt9+OgU@p5P$gwr(44TX@K?*b( zZ?Wa(r=;c-`)M-W;!Md(%uCPLOGzqX21>4E_zY6>OHV%|KQ~psG^sSNq*On(A~m_R zB)>?%JijQrxF9h(RX;huC{-U~j9x+IFAf_ZyEG@&u80Guoe_wOWr4&8W=2NF8w@fR Ku%RM0pb7xLi8T)Z diff --git a/core/__pycache__/osint_services.cpython-311.pyc b/core/__pycache__/osint_services.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f73da3512c3efda1c1cb82b410d2a920ae75a349 GIT binary patch literal 4217 zcmc&%U2GHC6~5!~&-f?)Ap~}zDWed==GTt@O-QMoScHWplmJ_TcCGQuwHdHIW@em# zo3v524^h>s-PKB4ImC!!*+?m*EHcJJi z+P!n<%sF@N&zW=Y`TY5ASC<1p`F#48=m6~>#Ap|0LwO;9at#ScpbBWgcv1_LZkrZN zCWK8F>GmLOzC$5&A8w;8SOk+m3ueJ0SOuHF2=*^*3s%ALFtB^^;e5R=M$N-SdKcut-UEd|d`=aaE;yqZX9$<+MmQ^~2*n*D70 z)UlH@bF*oUnK?6i8mu|ZF?TXOJC#0h;@Gst=z8*KTC>fkPn}GjJjQo+2cm6(o9x~T zw~6esh*l^&?DR7F6B0}+yl5AJez&c{yFZ&(OloJ>5xNMYjk0VK%wJjVfPKHywn8t{ zn`cC@Uee#lyO-%3=JvS%eBJ@$ey3rX5^RUTDuwqWRX?xBt9~ROTrsPzPDgaZwyAGw z0<&xek4;-oCWX!+!MnlIt2lQP-P=j06Dqcoce*)3Jn=a0eG?42p9zS&Cg zgt0W1Wl287&Q^!ot1V(#)VJ^v+bem#7}Y4-FL9+y=SRBJ)X=dr9=^jQWi zniX8nLW51l3PcGesmKM*3|3jAutGkUCFPr_|AJJ+{z|q|QY(IZ1@jeElKo4Pd`T&D zJofXFjQx@#meh=b8p8$>z?6;XL!xrbb1=jz1Nk$JNs(RzUKae zcN4b~Hz#gStR4O1@w$tB`SPiAXA4o5u}$%masR>fTUV`T1g7d4fm&xq8_Z~JTYU+o zMZ;k7WOV1wKZw@c;L`ag=Evt7Gv^HB2Y1ejT-~d)$~Z*yxV6%KeQyBQ$F;_=a@FpkM{OXP127hEueolv_=8$zGrA1em!Wt(Sd0A+D;K{BH9Yz z0Kv>#0g(Nb0OZ(!VEwrTg8vKn3S9)Azvmwz_gh84^QIBdA=q2p*@j?TB5B$3)4$81(DiMhVIRaLY$@bFyk5fQ}g*2D@ONWr7!SHxWG`G&A5br&*1O zs=k@_gl%A)t%lnR>Jx52IiTMdmsM1m<5l9w2GA39H`a2(WEu3Nd@7izKZ#r)~?|N=|zP3Iv)!B&#OCWKk?&|&jLgHxCjsJG~@lYdursl?^ ze#9HfYx&wYaCh+5;LYLN!{FWfb=SU*ccTQb4bcJY;V-FL&oItnqsFa6MK0sY~-fQbjtqXUlVUGyV=@3fEptIq=ZcVprR?9(+w zsOAcg%`G&`v`MqbUxzQ~S5i$1$fo5h>m4AX_d8_tTV&I=K{nreD@0`S-$KOs|DBG$ zF&5?#kTGX<^r$4|3E{$=%wJ#^MUI`vav2yso0DX=T*($ho-N`MVI@j+Upr%gIh5Pk zX^b5s6h`)vG_vOPNe5|-x~$nY5?8b0QeG_K=Y*aOnlx*flewZI?*!8T438w|xsu3d zHYiTj({`oJ&^j3nL`uGDBy*UIe`Q8HiKD=C$k)j+=$e9C`3s0u)G|9QBTct|jeh3a z^>p{%>&HI(b#vE`TQ>6!M+<>iv;ND0yzl6&2GX?VnW%dv8lH)5yrz5iwZx~1PbNN_ zxOU{zBenhEue0^;M58-Vb0u0da_xWlPlM)+kgPF8Cu@doT(0#DL9H{x4Q9But+umf z1e9mauGM1-0k+>Hf0Sg=I_pUJ==GuAl#71ovVcD5koUlAxfg_HBQ#PhzRGe+U|yZ&-HlS-runIuUcCS+L5N3-eA)gYI+Yfck~h6^YfO6 hVN5LqV%6N*xr^#(0$S%7-@)OM!@Pv#*}^!&hr!?X1wI?b%?C4~>zgt1e}%Mv@H!C|4u*HTjNlX^z#Lqng_dL?zlJWTKjykL;0 delta 234 zcmZ3+a+|4sIWI340}xbw%g@XL(vLwL7+{4mKHC5p(-~42QW$d>av7r-85vTTQkZj? za+#x;85x)uQW;ZNQkhd&*RU;PW?)zi#1N3q7{!vp9?YQ0@e(AU$#{#UAh9IlB_ouR zA)23?dW)e5WD!U*FEKaOPm^`B9HZQ1FGgQ3KA<>AZL!zng^W@b4;aKRprQ|K46K|D hE*(N0Av4%6u*hFzk-x$s|ACo_pQ(Wx1dDip+5v^VF%AF# diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 2a36fd69370b38a98d8b01bf8eb9817c42f16ed6..778c7f9d4f8c12d715649fcaf49e79993946d4c4 100644 GIT binary patch literal 3644 zcmbVP-D?|H7QgeQ&ygj|vSl}IqS&fj(b`V!dYg5-8#i%c+6K4ONny1RA#3j1Bac3M zXOt#Jf;@CV4}AzrAck#01nRgr4|&Yv{s|*7U@>3_Ec@U$1t%|k+H>z%iqynx*z3`m z`*G%+bI&>VcaI+i0zL$-zVtv9y$JoA4mwRb?i~FCI`@%+6i!1a`sOt*&!_mjkP`A@ zO62IAph*HGf`C$@xGkkRM15aEM3CNb&rD6fbt| z2ng-L&uOV3Tl2x1|CP0n!mXmDd`MYWl7j6bxS(KSdk9ukg0qG_xQ>lhMv&C;!{5`xqd93T1b*vw9Ab>8cW-|qlBbPRc1)SE3#m#cbmT^9#YMqf^$E1|j zafW0!vW|@or7~zcdJD*Xgi(r9P>NT$A5cnAc%Y&pfVrX_Sjy-dYsCyvs3BRNedZAA zYr6NNEg<)i;mk6c>nK3=-Y>cwJJ8$fjvx};-}$lbxXM>}g;#{1_^M#IyVIz`DPl$F z_c<6TtsK&X*cx5M1w$=hE%w#w=PTD@UCWcaErW+)HLZiwbXzi1L&ICaY?0s@6~b_9 zdc(+TNs&N4A=~W)LAQmBrV+YDaD=F1?Qgc5;P1*Npp^>}m=9zPk zCmX>9E4W~K7LGs=>WdupDT~|)(EH%m9A#mx-i=&mhQ1X};ddaCd);WhNn9b0|68)4 zi2ahQLWS4ky>ZV`_p$~VAoX)|$nbYo!A{o>*uU4^!zxly6>>%qH<{&R+z7nnuJHZb zRnZ8Zyjl?z_ouL2SO9sRt~{Cu$L;@=7k(41inl8D=si~vPl%LHMg1N+fzRK+cSSzl zk)Q;sQenQwXEP`28hArp!Qbf$9qZzi!K!40JN`o`$B>pf9@xn6{uFwfzp%-^^&La^)}utAI;>BSYxL!K{;y z2f$Ls6!e((bWSf8Y#&keO#nc^JloGUq+kOsi(fgLFKs4+w)pi|tJetit}TIqYKc&s z0MiL65<>k*Xn2TB2@MZJOELsK+m$6aV_;ikswAbHFX`kQtR&rJn6i#g@-`)>flwS} zrjaQ+5*aL0Z4^YIkx@2XD(c2oxE~(r96fXT&v44`pjIe)Pu>s3nxR-dx;x$oO#7#Xk6H%5}yNV2y4pTvic z-)$t$TZ!|v<-02ldBT(@T7i-6$!6fJ893X=eDFHv7cMk8`#Tw+bY!&V>rq-?e)#2s zFCY7!Tx`TISn&({@k`D4C3ERoBYxeAUpN1<(Ts1H@r~BlsoEE{FM2GfuRq*;u=)7? zC!~?MXeBQ0C$2OTSN>IPB(7Tt`0z$Eal=g9U>|}lp~#Pw{or^rINlmP+ZsE4F!s(* zZ`GF@V;@*!AGD%p+g=o!c!s2q?>Qwk@x=fNjcx~aDiUKMmK4Z&m>?fhLQ!{Xn3W?vVBpk25}~_uiXlG*m(FQ@pH5S2lCGX(P0x9c zQ*$Nt>B{RSv<}|kt~23 z@(CsM9(PjiPqar9)k(Muv_}c`k^UZ#-h}f=pK)#Udg=(FpC$*%JiP3XlFJmkcF{ zG-kNWP7K>c|IU8%eCnLMKa*upM6*?=|BJK*j^kR$e~10G(4u+r(?ai<{Z9)`nEg)+ vjhg*W3tci#e%j&`2gmkRa(C$&oqhgt=?3TJsQ+J2?_PVxR-T`*&f@c5h=Mm1 literal 1364 zcmZ`(&1)M+6ra_{dS%J>I&SM!uH%hUh$T{~CE!96oTjQ1oHkCdQ$lozPf-Q6#oM~=1-7}AYwoe=&3h>36z}rW~~)fO5P4{-h1=r&HMPV zzfVm~BA|nRhVUX&zZ=1NEJDd#(kRMro?7~GlVKiARAFbK7y={g8`rq_)Wa;XDEltUWCmB zkq~sth&3ZeP{;A878u54V{Oaty2i>_vx<&kIwj51DaMXgGg(=)ND+pj!HI^Q9g`Br z#tzdA%!;PvWg3a1>()Z2BR!#4DWHiJ1dw>FOuS)~xge&2p-9tZ06jh%7)=`o)~k%rY>m)oo?Fy$ z*3WOp#5FJD)_FvD(?z&0py>SutcBjF^RHFyMAbU#a#vk`t*)G?D;+i6Rnx7Fo|by~ z_(Z$b)~@ZR_tUQyT0itB&pp5LYvy^Tl^e+D)6aYJ%l+g^CzEdC%omzVp>MZ5DOS%5y(&3}_6owzcbHm(7?9Rw5vtvl1SB~m?7 zj;*4AhYlUH)nkysMG^f09y@gCNCO;6LXRBlM3jMk5(3mk&Yt4G~0e8+C9Kcci9-k%X2Jk$yo$rg#U|4#zQQudl79 zOcLv;nmiZ5s>IcfWirFF9NXne$04-sw&I1+q{YVNT`W>k)WifeC4!r>iJA!s(d3RY zT0kTsgD16Qc04!X3Ogvuqm+m229+M1ZktG&)9Wx`E6hSl!pz7kV; zkq|~*7yJpaOFz3tnd{i)RWQJr?m@a}`}B9Q242bP_SKcO(c<$7U<}-;*0y7{s0(+- z*w@?CHoa}G#mCw++C6&yuRvl}go$gAxYzbveFqZurJsJTVxA&&%K#@=ndR>4Zp&em ziBfYlWGO{m?nsLMpB@a&VQHqS&qFmY+Q_SiBP zp=u40jAx!~8!T2g=)N~pwH4c=CXEBRC8+L()uF?n>U3$`Xn&wf*b=>6sBJqPTI+50 zY_C_N`?LiKSnavPcHOSgqBTKJ?f(X?)$8?HJwEnK_kfAUi-b_z0`$Y-_48(I{BSu; z;0fjMn=p+srC-$`ednxDd{db8i}zma1;u+OiNB})rtaI!FS@5iHz>M(-a9MY@yqp> zN>Hwc2z}9)K9I}uiVUvGQ~4s2SCIry;cNMbcPGW69DN(g(&Sh;naijb2*i~Tp?qsxIeaP}RvU4&3XPW`JBDpKGh{QW zb5zWL Ku09ft^8N>gxTWO) literal 0 HcmV?d00001 diff --git a/core/migrations/__pycache__/__init__.cpython-311.pyc b/core/migrations/__pycache__/__init__.cpython-311.pyc index 9c833c8090679ee4c9ffd863c8f7abb0bb73a5db..c6652d12ab5ffe88db918ccc86ab1798a96276be 100644 GIT binary patch delta 19 ZcmZ3%xPp;;IWI340}zzBESktY7XU0t1iSzM delta 19 ZcmZ3%xPp;;IWI340}xbw%b& - - - {% block title %}Knowledge Base{% endblock %} - {% if project_description %} - - - - {% endif %} - {% if project_image_url %} - - - {% endif %} - {% load static %} - - {% block head %}{% endblock %} + + + {{ title|default:"Sentinel OSINT" }} + + + + + + + + + + + - - {% block content %}{% endblock %} - +
+ +
- +
+ {% if messages %} + {% for message in messages %} + + {% endfor %} + {% endif %} + + {% block content %}{% endblock %} +
+ +
+ © 2026 SENTINEL_OSINT CORE // FORENSIC INVESTIGATION SYSTEM +
+ + + + + \ No newline at end of file diff --git a/core/templates/core/index.html b/core/templates/core/index.html index faec813..47807d8 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -1,145 +1,102 @@ {% extends "base.html" %} -{% block title %}{{ project_name }}{% endblock %} - -{% block head %} - - - - -{% endblock %} - {% block content %} -
-
-

Analyzing your requirements and generating your app…

-
- Loading… +
+ +
+
+

OSINT_CORE_SYSTEM

+

Enterprise-grade intelligence gathering and forensic lead enrichment. Unified data extraction from 20+ sources.

+
+ +
+

INITIATE_SEARCH

+
+ {% csrf_token %} +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+
+
{{ recent_scans.count }}
+
TOTAL_INVESTIGATIONS
+
+
+
+
+
14
+
ACTIVE_MODULES
+
+
+
+
+
LIVE
+
SYSTEM_STATUS
+
+
+
-

AppWizzy AI is collecting your requirements and applying the first changes.

-

This page will refresh automatically as the plan is implemented.

-

- Runtime: Django {{ django_version }} · Python {{ python_version }} - — UTC {{ current_time|date:"Y-m-d H:i:s" }} -

-
-
-
- Page updated: {{ current_time|date:"Y-m-d H:i:s" }} (UTC) -
-{% endblock %} \ No newline at end of file + + +
+
+

+ RECENT_SCANS + HIST_LOG +

+ +
+ {% for scan in recent_scans %} +
+
+
+ {{ scan.target_type|slice:":1"|upper }} +
+
+ + {{ scan.target_value|truncatechars:20 }} + + {{ scan.created_at|timesince }} ago +
+
+
+ + RS:{{ scan.risk_score }} + +
+
+ {% empty %} +
+
NO_DATA_FOUND
+

INITIATE A SCAN TO BEGIN LOGGING

+
+ {% endfor %} +
+ + {% if recent_scans %} + + {% endif %} +
+
+ +{% endblock %} diff --git a/core/templates/core/scan_detail.html b/core/templates/core/scan_detail.html new file mode 100644 index 0000000..a856dbd --- /dev/null +++ b/core/templates/core/scan_detail.html @@ -0,0 +1,106 @@ +{% extends "base.html" %} + +{% block content %} +
+
+
+ ← BACK_TO_DASHBOARD +

REPORT_{{ scan.id }}_{{ scan.target_value|truncatechars:10 }}

+
+ TARGET: {{ scan.target_value }} + TYPE: {{ scan.target_type|upper }} +
+
+
+
+
+

RISK_SCORE

+
+ {{ scan.risk_score }} +
+
CONFIDENCE: HIGH
+
+
+
+ +
+ +
+

MODULE_OUTPUTS

+ + {% for module, data in results.items %} + {% if module != 'serp_results' %} +
+
+

{{ module }}_DATA

+ LIVE_FEED +
+
+
{{ data|pprint }}
+
+
+ {% endif %} + {% endfor %} + + + {% if results.serp_results %} +
+

PUBLIC_MENTIONS_EXTRACT

+
+ {% for item in results.serp_results %} +
+ + {{ item.title }} + +

{{ item.snippet }}

+
SOURCE: {{ item.displayed_link }}
+
+ {% endfor %} +
+
+ {% endif %} +
+ + +
+
+

INVESTIGATIVE_ACTIONS

+
+ + + + +
+
+ +
+

FORENSIC_TIMELINE

+
+
+
+
SCAN_INITIATED
+
{{ scan.created_at|date:"Y-m-d H:i:s" }}
+
+
+
+
API_ENRICHMENT_COMPLETE
+
SUCCESSFUL DATA FETCH
+
+
+
+
REPORT_FINALIZED
+
READY FOR REVIEW
+
+
+
+
+
+{% endblock %} diff --git a/core/urls.py b/core/urls.py index 6299e3d..94371cd 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,7 +1,7 @@ from django.urls import path - -from .views import home +from .views import DashboardView, ScanDetailView urlpatterns = [ - path("", home, name="home"), -] + path('', DashboardView.as_view(), name='index'), + path('scan//', ScanDetailView.as_view(), name='scan_detail'), +] \ No newline at end of file diff --git a/core/views.py b/core/views.py index c9aed12..4d888b2 100644 --- a/core/views.py +++ b/core/views.py @@ -1,25 +1,64 @@ -import os -import platform +import json +from django.shortcuts import render, redirect, get_object_or_404 +from django.views import View +from django.contrib import messages +from .models import Scan +from .osint_services import phone_lookup, email_lookup, serp_search -from django import get_version as django_version -from django.shortcuts import render -from django.utils import timezone +class DashboardView(View): + def get(self, request): + recent_scans = Scan.objects.all()[:10] + context = { + 'recent_scans': recent_scans, + 'title': "Sentinel OSINT Dashboard" + } + return render(request, 'core/index.html', context) + def post(self, request): + query = request.POST.get('query', '').strip() + scan_type = request.POST.get('scan_type', 'phone') + + if not query: + messages.error(request, "Search query is required.") + return redirect('index') -def home(request): - """Render the landing screen with loader and environment details.""" - host_name = request.get_host().lower() - agent_brand = "AppWizzy" if host_name == "appwizzy.com" else "Flatlogic" - now = timezone.now() + # Perform lookups based on type + results = {} + if scan_type == 'phone': + results = phone_lookup(query) + # Add serp search for the phone number + results['serp_results'] = serp_search(query) + elif scan_type == 'email': + results = email_lookup(query) + results['serp_results'] = serp_search(query) + else: + # For general names, usernames, or IPs, we primarily use SERP and future modules + results['serp_results'] = serp_search(query) - context = { - "project_name": "New Style", - "agent_brand": agent_brand, - "django_version": django_version(), - "python_version": platform.python_version(), - "current_time": now, - "host_name": host_name, - "project_description": os.getenv("PROJECT_DESCRIPTION", ""), - "project_image_url": os.getenv("PROJECT_IMAGE_URL", ""), - } - return render(request, "core/index.html", context) + # Basic risk score calculation logic (mock for now) + risk_score = 10 # Default low + if scan_type == 'email' and results.get('abstract', {}).get('deliverability') == 'UNDELIVERABLE': + risk_score = 80 + elif scan_type == 'phone' and results.get('veriphone', {}).get('phone_valid') == False: + risk_score = 90 + + # Save scan + scan = Scan.objects.create( + target_type=scan_type, + target_value=query, + results_json=json.dumps(results), + risk_score=risk_score + ) + + return redirect('scan_detail', pk=scan.pk) + +class ScanDetailView(View): + def get(self, request, pk): + scan = get_object_or_404(Scan, pk=pk) + results = scan.get_results() + context = { + 'scan': scan, + 'results': results, + 'title': f"Report: {scan.target_value}" + } + return render(request, 'core/scan_detail.html', context) \ No newline at end of file diff --git a/static/css/custom.css b/static/css/custom.css index 925f6ed..69e491c 100644 --- a/static/css/custom.css +++ b/static/css/custom.css @@ -1,4 +1,101 @@ -/* Custom styles for the application */ -body { - font-family: system-ui, -apple-system, sans-serif; +:root { + --bg-dark: #0f172a; + --bg-card: #1e293b; + --accent: #06b6d4; + --accent-glow: rgba(6, 182, 212, 0.4); + --text-primary: #f1f5f9; + --text-muted: #94a3b8; + --border: #334155; } + +body { + background-color: var(--bg-dark); + color: var(--text-primary); + font-family: 'Inter', sans-serif; +} + +.osint-header { + background: linear-gradient(180deg, rgba(30, 41, 59, 0.8) 0%, rgba(15, 23, 42, 0) 100%); + border-bottom: 1px solid var(--border); + padding: 1rem 0; +} + +.brand-title { + font-weight: 800; + letter-spacing: -1px; + color: var(--accent); + text-transform: uppercase; + font-family: 'JetBrains Mono', monospace; +} + +.dashboard-card { + background: var(--bg-card); + border: 1px solid var(--border); + border-radius: 12px; + padding: 1.5rem; + box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1); + transition: transform 0.2s; +} + +.dashboard-card:hover { + border-color: var(--accent); + box-shadow: 0 0 15px var(--accent-glow); +} + +.search-input { + background: #0f172a; + border: 1px solid var(--border); + color: white; + padding: 1.2rem; + border-radius: 8px; +} + +.search-input:focus { + background: #0f172a; + border-color: var(--accent); + box-shadow: 0 0 0 2px var(--accent-glow); + color: white; +} + +.btn-osint { + background: var(--accent); + color: #0f172a; + font-weight: 700; + padding: 0.8rem 2rem; + border-radius: 8px; + text-transform: uppercase; + letter-spacing: 1px; +} + +.btn-osint:hover { + background: #22d3ee; + box-shadow: 0 0 20px var(--accent-glow); +} + +.risk-badge { + padding: 4px 12px; + border-radius: 20px; + font-size: 0.8rem; + font-weight: 600; +} + +.risk-low { background: #065f46; color: #34d399; } +.risk-high { background: #991b1b; color: #f87171; } + +.history-item { + border-bottom: 1px solid var(--border); + padding: 0.75rem 0; +} + +.history-item:last-child { + border-bottom: none; +} + +pre { + background: #020617; + color: #34d399; + padding: 1rem; + border-radius: 8px; + border: 1px solid #1e293b; + font-size: 0.85rem; +} \ No newline at end of file