misc python code

This commit is contained in:
ys
2024-12-20 21:50:09 +00:00
parent 6dc40ba6af
commit d3dc84416d
44 changed files with 24998 additions and 0 deletions

View File

@@ -0,0 +1,14 @@
*.pyc
*.db
*.python-version
/.quarto/
.ipynb_checkpoints
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# IPython
profile_default/
ipython_config.py

View File

@@ -0,0 +1,719 @@
anal
analprobe
anilingus
anus
areola
areole
arian
aryan
ass
assbang
assbanged
assbangs
asses
assfuck
assfucker
assh0le
asshat
assho1e
ass hole
assholes
assmaster
assmunch
asswipe
asswipes
azazel
azz
b1tch
babe
babes
ballsack
bang
banger
barf
bastard
bastards
bawdy
beaner
beardedclam
beastiality
beatch
beater
beaver
beer
beeyotch
beotch
biatch
bigtits
big tits
bimbo
bitch
bitched
bitches
bitchy
blow job
blow
blowjob
blowjobs
bod
bodily
boink
bollock
bollocks
bollok
bone
boned
boner
boners
bong
boob
boobies
boobs
booby
booger
bookie
bootee
bootie
booty
booze
boozer
boozy
bosom
bosomy
bowel
bowels
bra
brassiere
breast
breasts
bugger
bukkake
bullshit
bull shit
bullshits
bullshitted
bullturds
bung
busty
butt
butt fuck
buttfuck
buttfucker
buttfucker
buttplug
c.0.c.k
c.o.c.k.
c.u.n.t
c0ck
c-0-c-k
caca
cahone
cameltoe
carpetmuncher
cawk
cervix
chinc
chincs
chink
chink
chode
chodes
cl1t
climax
clit
clitoris
clitorus
clits
clitty
cocain
cocaine
cock
c-o-c-k
cockblock
cockholster
cockknocker
cocks
cocksmoker
cocksucker
cock sucker
coital
commie
condom
coon
coons
corksucker
crabs
crack
cracker
crackwhore
crap
crappy
cum
cummin
cumming
cumshot
cumshots
cumslut
cumstain
cunilingus
cunnilingus
cunny
cunt
cunt
c-u-n-t
cuntface
cunthunter
cuntlick
cuntlicker
cunts
d0ng
d0uch3
d0uche
d1ck
d1ld0
d1ldo
dago
dagos
dammit
damn
damned
damnit
dawgie-style
dick
dickbag
dickdipper
dickface
dickflipper
dickhead
dickheads
dickish
dick-ish
dickripper
dicksipper
dickweed
dickwhipper
dickzipper
diddle
dike
dildo
dildos
diligaf
dillweed
dimwit
dingle
dipship
doggie-style
doggy-style
dong
doofus
doosh
dopey
douch3
douche
douchebag
douchebags
douchey
drunk
dumass
dumbass
dumbasses
dummy
dyke
dykes
ejaculate
enlargement
erect
erection
erotic
essohbee
extacy
extasy
f.u.c.k
fack
fag
fagg
fagged
faggit
faggot
fagot
fags
faig
faigt
fannybandit
fart
fartknocker
fat
felch
felcher
felching
fellate
fellatio
feltch
feltcher
fisted
fisting
fisty
floozy
foad
fondle
foobar
foreskin
freex
frigg
frigga
fubar
fuck
f-u-c-k
fuckass
fucked
fucked
fucker
fuckface
fuckin
fucking
fucknugget
fucknut
fuckoff
fucks
fucktard
fuck-tard
fuckup
fuckwad
fuckwit
fudgepacker
fuk
fvck
fxck
gae
gai
ganja
gay
gays
gey
gfy
ghay
ghey
gigolo
glans
goatse
godamn
godamnit
goddam
goddammit
goddamn
goldenshower
gonad
gonads
gook
gooks
gringo
gspot
g-spot
gtfo
guido
h0m0
h0mo
handjob
hard on
he11
hebe
heeb
hell
hemp
heroin
herp
herpes
herpy
hitler
hiv
hobag
hom0
homey
homo
homoey
honky
hooch
hookah
hooker
hoor
hootch
hooter
hooters
horny
hump
humped
humping
hussy
hymen
inbred
incest
injun
j3rk0ff
jackass
jackhole
jackoff
jap
japs
jerk
jerk0ff
jerked
jerkoff
jism
jiz
jizm
jizz
jizzed
junkie
junky
kike
kikes
kill
kinky
kkk
klan
knobend
kooch
kooches
kootch
kraut
kyke
labia
lech
leper
lesbians
lesbo
lesbos
lez
lezbian
lezbians
lezbo
lezbos
lezzie
lezzies
lezzy
lmao
lmfao
loin
loins
lube
lusty
mams
massa
masterbate
masterbating
masterbation
masturbate
masturbating
masturbation
maxi
menses
menstruate
menstruation
meth
m-fucking
mofo
molest
moolie
moron
motherfucka
motherfucker
motherfucking
mtherfucker
mthrfucker
mthrfucking
muff
muffdiver
murder
muthafuckaz
muthafucker
mutherfucker
mutherfucking
muthrfucking
nad
nads
naked
napalm
nappy
nazi
nazism
negro
nigga
niggah
niggas
niggaz
nigger
nigger
niggers
niggle
niglet
nimrod
ninny
nipple
nooky
nympho
opiate
opium
oral
orally
organ
orgasm
orgasmic
orgies
orgy
ovary
ovum
ovums
p.u.s.s.y.
paddy
paki
pantie
panties
panty
pastie
pasty
pcp
pecker
pedo
pedophile
pedophilia
pedophiliac
pee
peepee
penetrate
penetration
penial
penile
penis
perversion
peyote
phalli
phallic
phuck
pillowbiter
pimp
pinko
piss
pissed
pissoff
piss-off
pms
polack
pollock
poon
poontang
porn
porno
pornography
pot
potty
prick
prig
prostitute
prude
pube
pubic
pubis
punkass
punky
puss
pussies
pussy
pussypounder
puto
queaf
queef
queef
queer
queero
queers
quicky
quim
racy
rape
raped
raper
rapist
raunch
rectal
rectum
rectus
reefer
reetard
reich
retard
retarded
revue
rimjob
ritard
rtard
r-tard
rum
rump
rumprammer
ruski
s.h.i.t.
s.o.b.
s0b
sadism
sadist
scag
scantily
schizo
schlong
screw
screwed
scrog
scrot
scrote
scrotum
scrud
scum
seaman
seamen
seduce
semen
sex
sexual
sh1t
s-h-1-t
shamedame
shit
s-h-i-t
shite
shiteater
shitface
shithead
shithole
shithouse
shits
shitt
shitted
shitter
shitty
shiz
sissy
skag
skank
slave
sleaze
sleazy
slut
slutdumper
slutkiss
sluts
smegma
smut
smutty
snatch
sniper
snuff
s-o-b
sodom
souse
soused
sperm
spic
spick
spik
spiks
spooge
spunk
steamy
stfu
stiffy
stoned
strip
stroke
stupid
suck
sucked
sucking
sumofabiatch
t1t
tampon
tard
tawdry
teabagging
teat
terd
teste
testee
testes
testicle
testis
thrust
thug
tinkle
tit
titfuck
titi
tits
tittiefucker
titties
titty
tittyfuck
tittyfucker
toke
toots
tramp
transsexual
trashy
tubgirl
turd
tush
twat
twats
ugly
undies
unwed
urinal
urine
uterus
uzi
vag
vagina
valium
viagra
virgin
vixen
vodka
vomit
voyeur
vulgar
vulva
wad
wang
wank
wanker
wazoo
wedgie
weed
weenie
weewee
weiner
weirdo
wench
wetback
wh0re
wh0reface
whitey
whiz
whoralicious
whore
whorealicious
whored
whoreface
whorehopper
whorehouse
whores
whoring
wigger
womb
woody
wop
wtf
x-rated
xxx
yeasty
yobbo
zoophile
1 anal
2 analprobe
3 anilingus
4 anus
5 areola
6 areole
7 arian
8 aryan
9 ass
10 assbang
11 assbanged
12 assbangs
13 asses
14 assfuck
15 assfucker
16 assh0le
17 asshat
18 assho1e
19 ass hole
20 assholes
21 assmaster
22 assmunch
23 asswipe
24 asswipes
25 azazel
26 azz
27 b1tch
28 babe
29 babes
30 ballsack
31 bang
32 banger
33 barf
34 bastard
35 bastards
36 bawdy
37 beaner
38 beardedclam
39 beastiality
40 beatch
41 beater
42 beaver
43 beer
44 beeyotch
45 beotch
46 biatch
47 bigtits
48 big tits
49 bimbo
50 bitch
51 bitched
52 bitches
53 bitchy
54 blow job
55 blow
56 blowjob
57 blowjobs
58 bod
59 bodily
60 boink
61 bollock
62 bollocks
63 bollok
64 bone
65 boned
66 boner
67 boners
68 bong
69 boob
70 boobies
71 boobs
72 booby
73 booger
74 bookie
75 bootee
76 bootie
77 booty
78 booze
79 boozer
80 boozy
81 bosom
82 bosomy
83 bowel
84 bowels
85 bra
86 brassiere
87 breast
88 breasts
89 bugger
90 bukkake
91 bullshit
92 bull shit
93 bullshits
94 bullshitted
95 bullturds
96 bung
97 busty
98 butt
99 butt fuck
100 buttfuck
101 buttfucker
102 buttfucker
103 buttplug
104 c.0.c.k
105 c.o.c.k.
106 c.u.n.t
107 c0ck
108 c-0-c-k
109 caca
110 cahone
111 cameltoe
112 carpetmuncher
113 cawk
114 cervix
115 chinc
116 chincs
117 chink
118 chink
119 chode
120 chodes
121 cl1t
122 climax
123 clit
124 clitoris
125 clitorus
126 clits
127 clitty
128 cocain
129 cocaine
130 cock
131 c-o-c-k
132 cockblock
133 cockholster
134 cockknocker
135 cocks
136 cocksmoker
137 cocksucker
138 cock sucker
139 coital
140 commie
141 condom
142 coon
143 coons
144 corksucker
145 crabs
146 crack
147 cracker
148 crackwhore
149 crap
150 crappy
151 cum
152 cummin
153 cumming
154 cumshot
155 cumshots
156 cumslut
157 cumstain
158 cunilingus
159 cunnilingus
160 cunny
161 cunt
162 cunt
163 c-u-n-t
164 cuntface
165 cunthunter
166 cuntlick
167 cuntlicker
168 cunts
169 d0ng
170 d0uch3
171 d0uche
172 d1ck
173 d1ld0
174 d1ldo
175 dago
176 dagos
177 dammit
178 damn
179 damned
180 damnit
181 dawgie-style
182 dick
183 dickbag
184 dickdipper
185 dickface
186 dickflipper
187 dickhead
188 dickheads
189 dickish
190 dick-ish
191 dickripper
192 dicksipper
193 dickweed
194 dickwhipper
195 dickzipper
196 diddle
197 dike
198 dildo
199 dildos
200 diligaf
201 dillweed
202 dimwit
203 dingle
204 dipship
205 doggie-style
206 doggy-style
207 dong
208 doofus
209 doosh
210 dopey
211 douch3
212 douche
213 douchebag
214 douchebags
215 douchey
216 drunk
217 dumass
218 dumbass
219 dumbasses
220 dummy
221 dyke
222 dykes
223 ejaculate
224 enlargement
225 erect
226 erection
227 erotic
228 essohbee
229 extacy
230 extasy
231 f.u.c.k
232 fack
233 fag
234 fagg
235 fagged
236 faggit
237 faggot
238 fagot
239 fags
240 faig
241 faigt
242 fannybandit
243 fart
244 fartknocker
245 fat
246 felch
247 felcher
248 felching
249 fellate
250 fellatio
251 feltch
252 feltcher
253 fisted
254 fisting
255 fisty
256 floozy
257 foad
258 fondle
259 foobar
260 foreskin
261 freex
262 frigg
263 frigga
264 fubar
265 fuck
266 f-u-c-k
267 fuckass
268 fucked
269 fucked
270 fucker
271 fuckface
272 fuckin
273 fucking
274 fucknugget
275 fucknut
276 fuckoff
277 fucks
278 fucktard
279 fuck-tard
280 fuckup
281 fuckwad
282 fuckwit
283 fudgepacker
284 fuk
285 fvck
286 fxck
287 gae
288 gai
289 ganja
290 gay
291 gays
292 gey
293 gfy
294 ghay
295 ghey
296 gigolo
297 glans
298 goatse
299 godamn
300 godamnit
301 goddam
302 goddammit
303 goddamn
304 goldenshower
305 gonad
306 gonads
307 gook
308 gooks
309 gringo
310 gspot
311 g-spot
312 gtfo
313 guido
314 h0m0
315 h0mo
316 handjob
317 hard on
318 he11
319 hebe
320 heeb
321 hell
322 hemp
323 heroin
324 herp
325 herpes
326 herpy
327 hitler
328 hiv
329 hobag
330 hom0
331 homey
332 homo
333 homoey
334 honky
335 hooch
336 hookah
337 hooker
338 hoor
339 hootch
340 hooter
341 hooters
342 horny
343 hump
344 humped
345 humping
346 hussy
347 hymen
348 inbred
349 incest
350 injun
351 j3rk0ff
352 jackass
353 jackhole
354 jackoff
355 jap
356 japs
357 jerk
358 jerk0ff
359 jerked
360 jerkoff
361 jism
362 jiz
363 jizm
364 jizz
365 jizzed
366 junkie
367 junky
368 kike
369 kikes
370 kill
371 kinky
372 kkk
373 klan
374 knobend
375 kooch
376 kooches
377 kootch
378 kraut
379 kyke
380 labia
381 lech
382 leper
383 lesbians
384 lesbo
385 lesbos
386 lez
387 lezbian
388 lezbians
389 lezbo
390 lezbos
391 lezzie
392 lezzies
393 lezzy
394 lmao
395 lmfao
396 loin
397 loins
398 lube
399 lusty
400 mams
401 massa
402 masterbate
403 masterbating
404 masterbation
405 masturbate
406 masturbating
407 masturbation
408 maxi
409 menses
410 menstruate
411 menstruation
412 meth
413 m-fucking
414 mofo
415 molest
416 moolie
417 moron
418 motherfucka
419 motherfucker
420 motherfucking
421 mtherfucker
422 mthrfucker
423 mthrfucking
424 muff
425 muffdiver
426 murder
427 muthafuckaz
428 muthafucker
429 mutherfucker
430 mutherfucking
431 muthrfucking
432 nad
433 nads
434 naked
435 napalm
436 nappy
437 nazi
438 nazism
439 negro
440 nigga
441 niggah
442 niggas
443 niggaz
444 nigger
445 nigger
446 niggers
447 niggle
448 niglet
449 nimrod
450 ninny
451 nipple
452 nooky
453 nympho
454 opiate
455 opium
456 oral
457 orally
458 organ
459 orgasm
460 orgasmic
461 orgies
462 orgy
463 ovary
464 ovum
465 ovums
466 p.u.s.s.y.
467 paddy
468 paki
469 pantie
470 panties
471 panty
472 pastie
473 pasty
474 pcp
475 pecker
476 pedo
477 pedophile
478 pedophilia
479 pedophiliac
480 pee
481 peepee
482 penetrate
483 penetration
484 penial
485 penile
486 penis
487 perversion
488 peyote
489 phalli
490 phallic
491 phuck
492 pillowbiter
493 pimp
494 pinko
495 piss
496 pissed
497 pissoff
498 piss-off
499 pms
500 polack
501 pollock
502 poon
503 poontang
504 porn
505 porno
506 pornography
507 pot
508 potty
509 prick
510 prig
511 prostitute
512 prude
513 pube
514 pubic
515 pubis
516 punkass
517 punky
518 puss
519 pussies
520 pussy
521 pussypounder
522 puto
523 queaf
524 queef
525 queef
526 queer
527 queero
528 queers
529 quicky
530 quim
531 racy
532 rape
533 raped
534 raper
535 rapist
536 raunch
537 rectal
538 rectum
539 rectus
540 reefer
541 reetard
542 reich
543 retard
544 retarded
545 revue
546 rimjob
547 ritard
548 rtard
549 r-tard
550 rum
551 rump
552 rumprammer
553 ruski
554 s.h.i.t.
555 s.o.b.
556 s0b
557 sadism
558 sadist
559 scag
560 scantily
561 schizo
562 schlong
563 screw
564 screwed
565 scrog
566 scrot
567 scrote
568 scrotum
569 scrud
570 scum
571 seaman
572 seamen
573 seduce
574 semen
575 sex
576 sexual
577 sh1t
578 s-h-1-t
579 shamedame
580 shit
581 s-h-i-t
582 shite
583 shiteater
584 shitface
585 shithead
586 shithole
587 shithouse
588 shits
589 shitt
590 shitted
591 shitter
592 shitty
593 shiz
594 sissy
595 skag
596 skank
597 slave
598 sleaze
599 sleazy
600 slut
601 slutdumper
602 slutkiss
603 sluts
604 smegma
605 smut
606 smutty
607 snatch
608 sniper
609 snuff
610 s-o-b
611 sodom
612 souse
613 soused
614 sperm
615 spic
616 spick
617 spik
618 spiks
619 spooge
620 spunk
621 steamy
622 stfu
623 stiffy
624 stoned
625 strip
626 stroke
627 stupid
628 suck
629 sucked
630 sucking
631 sumofabiatch
632 t1t
633 tampon
634 tard
635 tawdry
636 teabagging
637 teat
638 terd
639 teste
640 testee
641 testes
642 testicle
643 testis
644 thrust
645 thug
646 tinkle
647 tit
648 titfuck
649 titi
650 tits
651 tittiefucker
652 titties
653 titty
654 tittyfuck
655 tittyfucker
656 toke
657 toots
658 tramp
659 transsexual
660 trashy
661 tubgirl
662 turd
663 tush
664 twat
665 twats
666 ugly
667 undies
668 unwed
669 urinal
670 urine
671 uterus
672 uzi
673 vag
674 vagina
675 valium
676 viagra
677 virgin
678 vixen
679 vodka
680 vomit
681 voyeur
682 vulgar
683 vulva
684 wad
685 wang
686 wank
687 wanker
688 wazoo
689 wedgie
690 weed
691 weenie
692 weewee
693 weiner
694 weirdo
695 wench
696 wetback
697 wh0re
698 wh0reface
699 whitey
700 whiz
701 whoralicious
702 whore
703 whorealicious
704 whored
705 whoreface
706 whorehopper
707 whorehouse
708 whores
709 whoring
710 wigger
711 womb
712 woody
713 wop
714 wtf
715 x-rated
716 xxx
717 yeasty
718 yobbo
719 zoophile

View File

@@ -0,0 +1,113 @@
from flask import Flask, render_template, redirect, url_for, request, flash
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user
from werkzeug.security import generate_password_hash, check_password_hash
import getpass,datetime
app = Flask(__name__)
app.secret_key = 'your_secret_key'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
db = SQLAlchemy(app)
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(150), unique=True, nullable=False)
password_hash = db.Column(db.String(150), nullable=False)
must_change_password = db.Column(db.Boolean, default=True, nullable=False)
def __init__(self, username, password, must_change_password=True):
self.username = username
self.password_hash = generate_password_hash(password)
self.must_change_password = must_change_password
def check_password(self, password):
return check_password_hash(self.password_hash, password)
class UserRequest(db.Model):
id = db.Column(db.Integer, primary_key=True)
url = db.Column(db.String(500), nullable=False)
reason = db.Column(db.String(500), nullable=False)
status = db.Column(db.String(50), nullable=False, default='pending')
user = db.Column(db.String(150), nullable=False)
mac_address = db.Column(db.String(50), nullable=False)
ip_address = db.Column(db.String(50), nullable=False)
timestamp = db.Column(db.DateTime, nullable=False)
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
user = User.query.filter_by(username=username).first()
if user and user.check_password(password):
login_user(user)
if user.must_change_password:
return redirect(url_for('change_password'))
return redirect(url_for('admin'))
else:
flash('Invalid username or password')
return render_template('login.html')
@app.route('/logout')
@login_required
def logout():
logout_user()
return redirect(url_for('login'))
@app.route('/change_password', methods=['GET', 'POST'])
@login_required
def change_password():
if request.method == 'POST':
new_password = request.form['new_password']
current_user.password_hash = generate_password_hash(new_password)
current_user.must_change_password = False
db.session.commit()
flash('Password changed successfully')
return redirect(url_for('admin'))
return render_template('change_password.html')
@app.route('/admin')
@login_required
def admin():
requests = UserRequest.query.all()
return render_template('admin.html', requests=requests)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/whitelist', methods=['POST'])
def whitelist():
url = request.form['url']
reason = request.form['reason']
user = current_user.username if current_user.is_authenticated else 'anonymous'
mac_address = '00:00:00:00:00:00' # Placeholder, replace with actual MAC address retrieval logic
ip_address = request.remote_addr # Gets the IP address of the client
timestamp = datetime.utcnow()
new_request = UserRequest(url=url, reason=reason, user=user, mac_address=mac_address, ip_address=ip_address, timestamp=timestamp)
db.session.add(new_request)
db.session.commit()
return redirect(url_for('index'))
def create_admin_user():
admin_user = User.query.filter_by(username='admin').first()
if not admin_user:
print("No admin user found. Please set a password for the admin user.")
password = getpass.getpass("Enter password for admin user: ")
admin_user = User(username='admin', password=password)
db.session.add(admin_user)
db.session.commit()
print("Admin user created successfully.")
if __name__ == '__main__':
with app.app_context():
db.create_all()
create_admin_user()
app.run(debug=True)

View File

@@ -0,0 +1,133 @@
from flask import Flask, request, render_template, redirect, url_for, session
from flask_sqlalchemy import SQLAlchemy
from werkzeug.security import generate_password_hash, check_password_hash
from datetime import datetime, timedelta
from scapy.all import ARP, Ether, srp
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///whitelist.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.secret_key = 'supersecretkey'
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(minutes=5)
db = SQLAlchemy(app)
class Whitelist(db.Model):
id = db.Column(db.Integer, primary_key=True)
url = db.Column(db.String(255), unique=True, nullable=False)
class Request(db.Model):
id = db.Column(db.Integer, primary_key=True)
url = db.Column(db.String(255), nullable=False)
reason = db.Column(db.String(255), nullable=False)
status = db.Column(db.String(50), nullable=False, default='pending')
timestamp = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
mac_address = db.Column(db.String(17), nullable=False)
ip_address = db.Column(db.String(45), nullable=False)
class Admin(db.Model):
id = db.Column(db.Integer, primary_key=True)
password = db.Column(db.String(255), nullable=False)
def get_mac_address(ip_address):
try:
# Create an ARP request packet
arp_request = ARP(pdst=ip_address)
# Create an Ethernet frame to encapsulate the ARP request
ether = Ether(dst="ff:ff:ff:ff:ff:ff")
# Combine the Ethernet frame and ARP request
packet = ether / arp_request
# Send the packet and capture the response
result = srp(packet, timeout=3, verbose=False)[0]
# Extract the MAC address from the response
mac_address = result[0][1].hwsrc
return mac_address
except Exception as e:
print(f"Error getting MAC address: {e}")
return "00:00:00:00:00:00"
@app.route('/set_admin_password', methods=['GET', 'POST'])
def set_admin_password():
if Admin.query.first():
return redirect(url_for('admin_login'))
if request.method == 'POST':
password = request.form['password']
hashed_password = generate_password_hash(password)
new_admin = Admin(password=hashed_password)
db.session.add(new_admin)
db.session.commit()
return redirect(url_for('admin_login'))
return render_template('set_admin_password.html')
@app.route('/admin_login', methods=['GET', 'POST'])
def admin_login():
if request.method == 'POST':
password = request.form['password']
admin = Admin.query.first()
if admin and check_password_hash(admin.password, password):
session['admin_logged_in'] = True
session.permanent = True # Mark the session as permanent
return redirect(url_for('admin'))
else:
return "Invalid password"
return render_template('admin_login.html')
@app.route('/admin_logout')
def admin_logout():
session.pop('admin_logged_in', None)
return redirect(url_for('admin_login'))
@app.route('/admin', methods=['GET', 'POST'])
def admin():
if not session.get('admin_logged_in'):
return redirect(url_for('admin_login'))
if request.method == 'POST':
action = request.form['action']
url = request.form['url']
req = Request.query.filter_by(url=url).first()
if req:
if action == 'approve':
req.status = 'approved'
if not Whitelist.query.filter_by(url=url).first():
new_whitelist = Whitelist(url=url)
db.session.add(new_whitelist)
elif action == 'reject':
req.status = 'rejected'
whitelist_entry = Whitelist.query.filter_by(url=url).first()
if whitelist_entry:
db.session.delete(whitelist_entry)
elif action == 'revoke':
req.status = 'revoked'
whitelist_entry = Whitelist.query.filter_by(url=url).first()
if whitelist_entry:
db.session.delete(whitelist_entry)
db.session.commit()
return redirect(url_for('admin'))
requests = Request.query.all()
whitelist = Whitelist.query.all()
return render_template('admin.html', requests=requests, whitelist=whitelist)
@app.route('/whitelist', methods=['GET'])
def get_whitelist():
whitelist = Whitelist.query.all()
return {"whitelist": [entry.url for entry in whitelist]}
@app.route('/', methods=['GET', 'POST'])
def request_whitelist():
if request.method == 'POST':
url = request.form['url']
reason = request.form['reason']
ip_address = request.remote_addr
mac_address = get_mac_address(ip_address)
new_request = Request(url=url, reason=reason, mac_address=mac_address, ip_address=ip_address)
db.session.add(new_request)
db.session.commit()
return redirect(url_for('request_whitelist'))
return render_template('request.html')
if __name__ == '__main__':
with app.app_context():
db.create_all()
app.run(debug=True)

View File

@@ -0,0 +1,209 @@
import asyncio
import sys
import re
import zlib
import json
import csv
import requests
from mitmproxy import http, ctx
from mitmproxy import options
from mitmproxy.tools import dump
import sqlite3
from bs4 import BeautifulSoup
# Method 1: Load blocked words from a CSV file
def load_blocked_words_from_csv(file_path):
"""
Loads blocked words from a CSV file.
Args:
file_path (str): The path to the CSV file containing blocked words.
Returns:
list: A list of blocked words loaded from the CSV file.
"""
blocked_words = []
with open(file_path, newline='') as csvfile:
reader = csv.reader(csvfile)
for row in reader:
blocked_words.extend(row)
return blocked_words
# Method 2: Load blocked words from a web service
def load_blocked_words_from_web_service(url):
"""
Fetches blocked words from a web service.
Args:
url (str): The URL of the web service to fetch blocked words from.
Returns:
list: A list of blocked words.
"""
try:
response = requests.get(url)
response.raise_for_status() # Raise an error for bad status codes
blocked_words = response.json() # Assuming the response is a JSON array of words
return blocked_words
except requests.RequestException as e:
ctx.log.error(f"Error fetching blocked words: {e}")
return []
# Load blocked words from the web service
blocked_words = ['fdhfghrth']#load_blocked_words_from_csv('Terms-to-Block.csv')
#blocked_words = load_blocked_words_from_web_service('https://example.com/api/blocked_words')
# Compile a regex pattern for blocked words
pattern = re.compile(r'\b(?:' + '|'.join(re.escape(word) for word in blocked_words) + r')\b', re.IGNORECASE)
def check_string_in_list(target_string, string_list):
"""
Checks if any string in a list is present in the target string.
Args:
target_string (str): The string to search within.
string_list (list): The list of strings to search for.
Returns:
bool: True if any string in the list is found in the target string, False otherwise.
"""
return any(item in target_string for item in string_list)
def search_blocked_words_in_json(data, pattern):
"""
Recursively searches for blocked words in a JSON object.
Args:
data (dict or list or str): The JSON data to search within.
pattern (re.Pattern): The compiled regex pattern for blocked words.
Returns:
list: A list of matches found in the JSON data.
"""
matches = []
if isinstance(data, dict):
for key, value in data.items():
matches.extend(search_blocked_words_in_json(value, pattern))
elif isinstance(data, list):
for item in data:
matches.extend(search_blocked_words_in_json(item, pattern))
elif isinstance(data, str):
matches.extend(pattern.findall(data))
return matches
class RequestLogger:
"""
A class to log and filter HTTP requests and responses.
"""
def __init__(self):
"""
Initializes the RequestLogger and loads the whitelist.
"""
self.whitelist = []
asyncio.create_task(self.load_whitelist_periodically())
async def load_whitelist(self):
"""
Loads the whitelist from the SQLite database.
Returns:
list: A list of whitelisted URLs.
"""
conn = sqlite3.connect('whitelist.db')
c = conn.cursor()
c.execute("SELECT url FROM whitelist WHERE status='approved'")
self.whitelist = [row[0] for row in c.fetchall()]
conn.close()
async def load_whitelist_periodically(self):
"""
Periodically loads the whitelist every 20 seconds.
"""
while True:
await self.load_whitelist()
await asyncio.sleep(20)
def request(self, flow: http.HTTPFlow):
"""
Handles HTTP requests. Blocks requests to non-whitelisted URLs.
Args:
flow (http.HTTPFlow): The HTTP flow object.
"""
if flow.request.pretty_host not in self.whitelist:
ctx.log.info('Blocked request to %s' % flow.request.host)
flow.response = http.Response.make(
403, # Forbidden status code
b"Blocked by URL whitelist", # Response content
{"Content-Type": "text/plain"} # Response headers
)
return
def response(self, flow: http.HTTPFlow):
"""
Handles HTTP responses. Searches for blocked words in the response content.
Args:
flow (http.HTTPFlow): The HTTP flow object.
"""
content_type = flow.response.headers.get("Content-Type", "")
content = flow.response.content
# Handle compressed content
if "gzip" in flow.response.headers.get("Content-Encoding", ""):
content = zlib.decompress(content, zlib.MAX_WBITS | 16)
if "deflate" in flow.response.headers.get("Content-Encoding", ""):
content = zlib.decompress(content)
# Decode content to text
if isinstance(content, bytes):
content = content.decode('utf-8', errors='ignore')
# Check if content is HTML
if "text/html" in content_type:
soup = BeautifulSoup(content, 'html.parser')
text = soup.get_text()
matches = pattern.findall(text)
elif "application/json" in content_type:
data = json.loads(content)
matches = search_blocked_words_in_json(data, pattern)
else:
matches = []
# Search for matches in the text content
if matches:
matched_keyword = matches[0]
flow.response.text = 'response contains filtered contents'
ctx.log.error(matched_keyword)
flow.response = http.Response.make(
200, # (optional) status code
b"Hello World", # (optional) content
{"Content-Type": "text/html"}, # (optional) headers
)
async def start_proxy(host, port):
"""
Starts the proxy server.
Args:
host (str): The host address to listen on.
port (int): The port to listen on.
"""
opts = options.Options(listen_host=host, listen_port=port)
master = dump.DumpMaster(
opts,
with_termlog=False,
with_dumper=False,
)
master.addons.add(RequestLogger())
await master.run()
return master
if __name__ == '__main__':
host = sys.argv[1]
port = int(sys.argv[2])
asyncio.run(start_proxy(host, port))

View File

@@ -0,0 +1,9 @@
import mitmproxy.http
class MyAddon:
def request(self, flow: mitmproxy.http.HTTPFlow) -> None:
print(flow.request.url)
addons = [
MyAddon()
]

View File

@@ -0,0 +1,67 @@
<!DOCTYPE html>
<html>
<head>
<title>Admin Dashboard</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<h1 class="mt-5">Admin Dashboard</h1>
<a href="{{ url_for('admin_logout') }}" class="btn btn-danger float-right">Logout</a>
<h2 class="mt-4">Pending Requests</h2>
<table class="table table-bordered mt-3">
<thead>
<tr>
<th>URL/Domain</th>
<th>Reason</th>
<th>Status</th>
<th>Date & Time</th>
<th>IP Address</th>
<th>MAC Address</th>
<th>Action</th>
</tr>
</thead>
<tbody>
{% for req in requests %}
<tr>
<td>{{ req.url }}</td>
<td>{{ req.reason }}</td>
<td>{{ req.status }}</td>
<td>{{ req.timestamp }}</td>
<td>{{ req.ip_address }}</td>
<td>{{ req.mac_address }}</td>
<td>
<form method="post" class="d-inline">
<input type="hidden" name="url" value="{{ req.url }}">
<input type="hidden" name="action" value="approve">
<button type="submit" class="btn btn-success btn-sm">Approve</button>
</form>
<form method="post" class="d-inline">
<input type="hidden" name="url" value="{{ req.url }}">
<input type="hidden" name="action" value="reject">
<button type="submit" class="btn btn-danger btn-sm">Reject</button>
</form>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<h2 class="mt-4">Whitelisted URLs/Domains</h2>
<ul class="list-group mt-3">
{% for url in whitelist %}
<li class="list-group-item">
{{ url.url }}
<form method="post" class="d-inline float-right">
<input type="hidden" name="url" value="{{ url.url }}">
<input type="hidden" name="action" value="revoke">
<button type="submit" class="btn btn-warning btn-sm">Revoke</button>
</form>
</li>
{% endfor %}
</ul>
</div>
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.5.4/dist/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
</body>
</html>

View File

@@ -0,0 +1,22 @@
<!DOCTYPE html>
<html>
<head>
<title>Admin Login</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<h1 class="mt-5">Admin Login</h1>
<form method="post" class="mt-3">
<div class="form-group">
<label for="password">Password</label>
<input type="password" class="form-control" id="password" name="password" required>
</div>
<button type="submit" class="btn btn-primary">Login</button>
</form>
</div>
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.5.4/dist/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
</body>
</html>

View File

@@ -0,0 +1,15 @@
<!DOCTYPE html>
<html>
<head>
<title>Change Password</title>
</head>
<body>
<h1>Change Password</h1>
<form method="POST">
<label for="new_password">New Password:</label>
<input type="password" name="new_password" id="new_password" required>
<br>
<button type="submit">Change Password</button>
</form>
</body>
</html>

View File

@@ -0,0 +1,23 @@
<!DOCTYPE html>
<html>
<head>
<title>Whitelist Request</title>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container mt-5">
<h1 class="mb-4">Request to Whitelist a URL</h1>
<form action="/whitelist" method="post">
<div class="form-group">
<label for="url">URL:</label>
<input type="text" class="form-control" id="url" name="url" required>
</div>
<div class="form-group">
<label for="reason">Reason:</label>
<textarea class="form-control" id="reason" name="reason" rows="3" required></textarea>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
</body>
</html>

View File

@@ -0,0 +1,27 @@
<!DOCTYPE html>
<html>
<head>
<title>Login</title>
</head>
<body>
<h1>Login</h1>
<form method="POST">
<label for="username">Username:</label>
<input type="text" name="username" id="username" required>
<br>
<label for="password">Password:</label>
<input type="password" name="password" id="password" required>
<br>
<button type="submit">Login</button>
</form>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
</body>
</html>

View File

@@ -0,0 +1,26 @@
<!DOCTYPE html>
<html>
<head>
<title>Request Whitelist</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<h1 class="mt-5">Request URL/Domain Whitelisting</h1>
<form method="post" class="mt-3">
<div class="form-group">
<label for="url">URL/Domain</label>
<input type="text" class="form-control" id="url" name="url" required>
</div>
<div class="form-group">
<label for="reason">Reason</label>
<input type="text" class="form-control" id="reason" name="reason" required>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.5.4/dist/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
</body>
</html>

View File

@@ -0,0 +1,22 @@
<!DOCTYPE html>
<html>
<head>
<title>Set Admin Password</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<h1 class="mt-5">Set Admin Password</h1>
<form method="post" class="mt-3">
<div class="form-group">
<label for="password">Password</label>
<input type="password" class="form-control" id="password" name="password" required>
</div>
<button type="submit" class="btn btn-primary">Set Password</button>
</form>
</div>
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.5.4/dist/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
</body>
</html>

View File

@@ -0,0 +1,27 @@
<!DOCTYPE html>
<html>
<head>
<title>Whitelisted URLs</title>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container mt-5">
<h1 class="mb-4">Whitelisted URLs</h1>
<a href="{{ url_for('admin') }}" class="btn btn-secondary mb-4">Back to Admin</a>
<table class="table table-bordered">
<thead class="thead-dark">
<tr>
<th>URL</th>
</tr>
</thead>
<tbody>
{% for url in approved_urls %}
<tr>
<td>{{ url[0] }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</body>
</html>

View File

@@ -0,0 +1,73 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Error logged during startup, exiting...\n"
]
},
{
"ename": "SystemExit",
"evalue": "1",
"output_type": "error",
"traceback": [
"An exception has occurred, use %tb to see the full traceback.\n",
"\u001b[0;31mSystemExit\u001b[0m\u001b[0;31m:\u001b[0m 1\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/ys/.pyenv/versions/3.12.0/envs/mitm/lib/python3.12/site-packages/IPython/core/interactiveshell.py:3585: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.\n",
" warn(\"To exit: use 'exit', 'quit', or Ctrl-D.\", stacklevel=1)\n"
]
}
],
"source": [
"import driver\n",
"import asyncio\n",
"import nest_asyncio\n",
"\n",
"# Apply nest_asyncio to allow nested event loops\n",
"#nest_asyncio.apply()\n",
"\n",
"await driver.start_proxy('127.0.0.1', 8083)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "mitm",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.0"
}
},
"nbformat": 4,
"nbformat_minor": 2
}