-
Notifications
You must be signed in to change notification settings - Fork 3
/
wys
executable file
·2471 lines (2343 loc) · 96.5 KB
/
wys
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#!/bin/bash
# wys
# WhatsYourSign shell script version
#
# extended shell script variant of Patrick Wardle's "WhatsYourSign" Finder extension (objective-see.com)
# gain WhatsYourSign functionality (and more) in other file managers than macOS Finder
#
# v1.2 beta 1
# Copyright (c) 2018 Joss Brown (pseud.)
# license (wys): MIT+
# info: https://github.com/JayBrown/wys-WhatsYourSign-shell-script-version
#
# WhatsYourSign name & icon: (c) by Patrick Wardle ; Attribution-NonCommercial 4.0 International (CC BY-NC 4.0)
# check for single user
scrname=$(basename $0)
singleuser=$(sysctl -n kern.singleuser)
if [[ $singleuser == "1" ]] ; then
echo "Error! $scrname can not be run in single-user mode." >&2
exit
fi
export LANG=en_US.UTF-8
# check compatibility
osversion=$(sw_vers -productVersion | awk -F. '{print $2}')
if [[ "$osversion" -le 7 ]] ; then
echo "Error! Incompatible OS version: $scrname needs at least OS X 10.8." >&2
info=$(osascript << EOT
beep
tell application "System Events"
activate
set userChoice to button returned of (display alert "wys: Error!" & return & return & "Minimum OS Requirement:" & return & "OS X 10.8 (Mountain Lion)" ¬
as critical ¬
buttons {"Quit"} ¬
default button 1 ¬
giving up after 60)
end tell
EOT
)
exit
fi
export PATH=$PATH:/usr/local/bin:/opt/local/bin:/sw/bin
shopt -s extglob
cacheloc="$HOME/.wys"
configloc="$cacheloc/config"
version="1.2"
bversion=" beta 1"
# command line options
silentoverride=false
discrete=false
if [[ $1 =~ ^(--init|--initialize|--reset)$ ]] ; then
if [[ -f "$configloc" ]] ; then
echo -e "All previous settings will be lost.\nDo you really want to initialize wys? (n/Y)\n"
read -n 1 -s userinput
if [[ $userinput == "Y" ]] ; then
echo -e "report=no\nvtkey=\nsilent=no\nclamscan=no" > "$configloc"
echo "wys: initialized."
else
echo "wys: no change."
fi
else
! [[ -d "$cacheloc" ]] && mkdir "$cacheloc"
echo -e "report=no\nvtkey=\nsilent=no" > "$configloc"
echo "wys: initialized."
fi
exit
elif [[ $1 == "--config" ]] ; then
configfull=$(cat "$configloc")
if [[ $configfull == "" ]] ; then
echo "wys: config is empty. Please run 'wys --init' first." >&2
exit
fi
shift
if [[ $1 =~ ^(vt|virustotal|virus-total)$ ]] ; then
shift
if [[ $1 == "" ]] ; then
echo "wys: no VirusTotal API key specified." >&2
exit
else
configfull=$(echo "$configfull" | grep -v "^vtkey=")
echo -e "$configfull\nvtkey=$1" > "$configloc"
echo "wys: VirusTotal API key added to config: $1"
fi
elif [[ $1 =~ ^(report|log)$ ]] ; then
logstatus=$(echo "$configfull" | awk -F= '/^report/{print $2}')
configfull=$(echo "$configfull" | grep -v "^report=")
if [[ $logstatus == "no" ]] ; then
echo -e "$configfull\nreport=yes" > "$configloc"
echo "wys: logging enabled."
else
echo -e "$configfull\nreport=no" > "$configloc"
echo "wys: logging disabled."
fi
elif [[ $1 =~ ^(silent|quiet)$ ]] ; then
silentstatus=$(echo "$configfull" | awk -F= '/^silent/{print $2}')
configfull=$(echo "$configfull" | grep -v "^silent=")
if [[ $silentstatus == "no" ]] ; then
echo -e "$configfull\nsilent=yes" > "$configloc"
echo "wys: silent mode enabled."
else
echo -e "$configfull\nsilent=no" > "$configloc"
echo "wys: silent mode disabled."
fi
elif [[ $1 == "" ]] ; then
echo "wys: no argument specified." >&2
else
echo "wys: unknown argument: $1" >&2
fi
exit
elif [[ $1 == "--status" ]] ; then
configfull=$(cat "$configloc")
if [[ $configfull == "" ]] ; then
echo "wys: config is empty. Please run 'wys --init' first." >&2
else
logstatus=$(echo "$configfull" | awk -F= '/^report/{print $2}')
[[ $logstatus == "" ]] && logstatus="n/a"
silentstatus=$(echo "$configfull" | awk -F= '/^silent/{print $2}')
[[ $silentstatus == "" ]] && silentstatus="n/a"
vtkey=$(echo "$configfull" | awk -F= '/^vtkey/{print $2}')
[[ $vtkey == "" ]] && vtkey="n/a"
echo -e "logging:\t$logstatus"
echo -e "silent mode:\t$silentstatus"
echo -e "VirusTotal key:\t$vtkey"
fi
exit
elif [[ $1 == "--help" ]] ; then
echo -e "wys $version$bversion\n\nwys [<file(path) 1> ... <file(path) n>]\t\tscan filepath(s) or file(s) from the command line\n\nOptions:\n\n--discrete\tforce-disable silent mode and all logging\n--init\t\tinitialize wys\n--silent\tforce silent mode for current scans\n--status\tprint wys configuration status\n\n--config [report | silent | vt <key>]\t\tmodify wys configuration file\n\treport\t\ttoggle logging\n\tsilent\t\ttoggle silent mode\n\tvt <key>\tenter VirusTotal API key\n\n--help\t\tthis help page"
exit
elif [[ $1 == "--silent" ]] || [[ $1 == "--quiet" ]] ; then
echo "wys: silent mode forced for current scans."
silentoverride=true
shift
elif [[ $1 == "--discrete" ]] ; then
discrete=true
echo "wys: discrete mode enabled."
echo "wys: silent mode disabled for current scans."
echo "wys: all logging disabled for current scans."
shift
fi
# check if path is valid (for command line usage)
if [[ $@ == "" ]] ; then
echo "No filepaths specified." >&2
exit
fi
crlrefresh rp 2>/dev/null
process="wys"
account=$(id -un)
icon64="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
sMf/Ax59odGg0nmwAAAAAElFTkSuQmCC"
# create wys icon
! [[ -d $cacheloc ]] && mkdir "$cacheloc"
rm -f "$cacheloc/wys-icon.base64" 2>/dev/null
if ! [[ -f $cacheloc/wys-icon.png ]] ; then
echo "$icon64" > "$cacheloc/wys-icon.base64"
base64 -D -i "$cacheloc/wys-icon.base64" -o "$cacheloc/wys-icon.png" && rm -f "$cacheloc/wys-icon.base64" 2>/dev/null
fi
if ! [[ -f $cacheloc/wys-icon.png ]] ; then
icon_loc="/System/Library/PreferencePanes/Security.prefPane/Contents/Resources/FileVault.icns"
else
icon_loc="$cacheloc/wys-icon.png"
fi
# create database
dbloc="$cacheloc/wys.db"
! [[ -f "$dbloc" ]] && sqlite3 "$dbloc" "create table WhatsYourSign(cfbid TEXT, csid TEXT, skid TEXT, misc1 TEXT, misc2 TEXT, misc3 TEXT);"
# create bin directory and export abspath function
wysbin="$cacheloc/bin"
! [[ -d "$wysbin" ]] && mkdir -p "$wysbin"
if ! [[ -f "$wysbin/abspath" ]] ; then
fabsp=$(/bin/cat << 'EOT'
#!/usr/bin/env python
import os.path
import sys
for arg in sys.argv[1:]:
print os.path.realpath(os.path.abspath(arg))
EOT
)
echo "$fabsp" > "$wysbin/abspath" && chmod u+x "$wysbin/abspath"
fi
export PATH=$PATH:"$wysbin"
# create/read config
if ! [[ -f "$configloc" ]] ; then
echo -e "report=no\nvtkey=\nsilent=no\nclamscan=no" > "$configloc"
fi
configfull=$(cat "$configloc")
# check for clamscan
clamav=false
clampath="/usr/local/ClamXAV3/bin/clamscan"
if ! [[ -f $clampath ]] ; then
clampath="/usr/local/clamXav/bin/clamscan"
if ! [[ -f $clampath ]] ; then
clamcheck=$(clamscan --version 2>/dev/null)
if [[ $clamcheck != "" ]] ; then
clampath="clamscan"
clamav=true
else
clampath=""
fi
else
clamav=true
fi
else
clamav=true
fi
$clamav && echo "wys: will perform ClamAV scans."
# check for gpg
gnupg=false
gpgpath="/usr/local/MacGPG2/bin/gpg"
if ! [[ -f $gpgpath ]] ; then
gpgpath="/usr/local/MacGPG2/bin/gpg2"
if ! [[ -f $gpgpath ]] ; then
gpgcheck=$(gpg --version 2>/dev/null)
if [[ $gpgcheck != "" ]] ; then
gpgpath="gpg"
gnupg=true
else
gpgcheck=$(gpg2 --version 2>/dev/null)
if [[ $gpgcheck != "" ]] ; then
gpgpath="gpg2"
gnupg=true
else
gpgpath=""
fi
fi
else
gnupg=true
fi
else
gnupg=true
fi
$gnupg && echo "wys: will validate GnuPG signatures."
# read report setting
wyslog=false
if ! $discrete ; then
wysreport=$(echo "$configfull" | awk -F= '/report/{print $2}')
if [[ $wysreport == "yes" ]] ; then
wyslog=true
logdir="$HOME/Library/Logs/wys"
! [[ -d "$logdir" ]] && mkdir -p "$logdir"
echo "wys: configured to log scan reports."
fi
fi
# read silent mode
silent=false
if ! $discrete ; then
if ! $silentoverride ; then
silentmode=$(echo "$configfull" | awk -F= '/silent/{print $2}')
if [[ $silentmode == "yes" ]] ; then
silent=true
echo "wys: configured to run in silent mode."
else
echo "wys: silent mode disabled."
fi
else
silent=true
fi
fi
# read VirusTotal API key
vtaccess=false
vtkey=$(echo "$configfull" | awk -F= '/vtkey/{print $2}')
if [[ $vtkey != "" ]] ; then
vtaccess=true
echo "wys: VirusTotal API Key detected."
else
echo "wys: VirusTotal API Key not found."
fi
# temporary subdirectory for certificate dumps
certdir="/tmp/wys-certs"
rm -rf "$certdir" 2>/dev/null
# notify function
_notify () {
if ! $silent ; then
if [[ "$tn_status" == "osa" ]] ; then
osascript &>/dev/null << EOT
tell application "System Events"
display notification "$2" with title "$process [" & "$account" & "]" subtitle "$1"
end tell
EOT
elif [[ "$tn_status" == "tn-app-new" ]] || [[ "$tn_status" == "tn-app-old" ]] ; then
"$tn_loc/Contents/MacOS/terminal-notifier" \
-title "$process [$account]" \
-subtitle "$1" \
-message "$2" \
-appIcon "$icon_loc" \
>/dev/null
elif [[ "$tn_status" == "tn-cli" ]] ; then
"$tn" \
-title "$process [$account]" \
-subtitle "$1" \
-message "$2" \
-appIcon "$icon_loc" \
>/dev/null
fi
fi
}
# look for terminal-notifier
tn=$(which terminal-notifier 2>/dev/null)
if [[ "$tn" == "" ]] || [[ "$tn" == *"not found" ]] ; then
tn_loc=$(mdfind -onlyin / "kMDItemCFBundleIdentifier == 'fr.julienxx.oss.terminal-notifier'" 2>/dev/null | awk 'NR==1')
if [[ "$tn_loc" == "" ]] ; then
tn_loc=$(mdfind -onlyin / "kMDItemCFBundleIdentifier == 'nl.superalloy.oss.terminal-notifier'" 2>/dev/null | awk 'NR==1')
if [[ "$tn_loc" == "" ]] ; then
tn_status="osa"
else
tn_status="tn-app-old"
fi
else
tn_status="tn-app-new"
fi
else
tn_vers=$("$tn" -help | head -1 | awk -F'[()]' '{print $2}' | awk -F. '{print $1"."$2}')
if (( $(echo "$tn_vers >= 1.8" | bc -l) )) && (( $(echo "$tn_vers < 2.0" | bc -l) )) ; then
tn_status="tn-cli"
else
tn_loc=$(mdfind -onlyin / "kMDItemCFBundleIdentifier == 'fr.julienxx.oss.terminal-notifier'" 2>/dev/null | awk 'NR==1')
if [[ "$tn_loc" == "" ]] ; then
tn_loc=$(mdfind -onlyin / "kMDItemCFBundleIdentifier == 'nl.superalloy.oss.terminal-notifier'" 2>/dev/null | awk 'NR==1')
if [[ "$tn_loc" == "" ]] ; then
tn_status="osa"
else
tn_status="tn-app-old"
fi
else
tn_status="tn-app-new"
fi
fi
fi
# beep function
_beep () {
osascript -e "beep"
}
# hexer function
_hxr () {
echo -n "${1}" | xxd -p | sed -e 's/\(..\)/\\x\1/g'
}
# round function
_round () {
echo $(printf %.$2f $(echo "scale=$2;(((10^$2)*$1)+0.5)/(10^$2)" | bc))
}
# other size calculations
_sizes () {
mbsizeraw=$(bc -l <<< "scale=6; $bsize/1000000")
mbsize=$(_round "$mbsizeraw" 2)
if [[ "$mbsize" == "0.00" ]] ; then
mbsize="< 0.01"
fi
mibsizeraw=$(bc -l <<< "scale=6; $bsize/1048576")
mibsize=$(_round "$mibsizeraw" 2)
if [[ "$mibsize" == "0.00" ]] ; then
mibsize="< 0.01"
fi
hrbsize=$(echo "$bsize" | perl -wpe '1 while s/(\d+)(\d\d\d)/$1,$2/;')
}
# gpg validation
_gpgval () {
if [[ -f "$filepath.asc" ]] ; then
gpgvloc="$filepath.asc"
gpgval=true
elif [[ -f "$filepath.asc.txt" ]] ; then
gpgvloc="$filepath.asc.txt"
gpgval=true
elif [[ -f "$filepath.sig" ]] ; then
gpgvloc="$filepath.sig"
gpgval=true
elif [[ -f "$filepath.sig.txt" ]] ; then
gpgvloc="$filepath.sig.txt"
gpgval=true
else
gpgval=false
fi
if $gpgval ; then
gpgver=$("$gpgpath" --verify "$gpgvloc" "$filepath" 2>&1)
gpgresult=$(echo "$gpgver" | grep "gpg: Good signature")
if [[ $gpgresult != "" ]] ; then
gpgstat=$(echo "$gpgresult" | awk -F"gpg: " '{print $2}')
gpgsig=$(echo "$gpgstat" | awk -F\" '{print $2}')
gpgtrust=$(echo "$gpgstat" | awk -F '[][]' '{print $2}')
gpgresult="good signature"
_notify "✅ GnuPG signature validated" "$filename"
else
gpgerror=$(echo "$gpgver" | grep "gpg: BAD signature")
if [[ $gpgerror != "" ]] ; then
_beep
gpgstat=$(echo "$gpgerror" | awk -F"gpg: " '{print $2}')
gpgresult="BAD SIGNATURE"
gpgsig=$(echo "$gpgstat" | awk -F\" '{print $2}')
gpgtrust=$(echo "$gpgstat" | awk -F '[][]' '{print $2}')
_notify "❌ GnuPG: bad signature!" "$filename"
else
_beep
gpgresult="not validated"
_notify "⚠️ GnuPG: not validated!" "$filename"
fi
fi
if [[ $gpgresult == "not validated" ]] ; then
echo -e "GnuPG:\t\t$gpgresult\n" >> "$tmploc"
else
echo -e "GnuPG:\t\t$gpgresult" >> "$tmploc"
echo -e "\t\t$gpgsig" >> "$tmploc"
echo -e "\t\ttrust: $gpgtrust\n" >> "$tmploc"
fi
fi
}
# parse pbpasted clipboard content for possible checksums (only md5, sha1, sha2)
_cscn () {
case $1 in
( *[!0-9A-Fa-f]* | "" ) echo "none" ;;
( * )
case ${#1} in
( 32 ) echo "md" ;;
( 40 ) echo "1" ;;
( 56 ) echo "224" ;;
( 64 ) echo "256" ;;
( 96 ) echo "384" ;;
( 128 ) echo "512" ;;
( * ) echo "none" ;;
esac
esac
}
# hashing function
_hashes () {
[[ $md5hash == "" ]] && md5hash=$(md5 -q "$1")
echo -e "hashes:\t\tmd5:\t$md5hash" >> "$tmploc"
[[ $sha1hash == "" ]] && sha1hash=$(shasum -a 1 "$1" | awk '{print $1}')
echo -e "\t\tsha1:\t$sha1hash" >> "$tmploc"
[[ $sha256hash == "" ]] && sha256hash=$(shasum -a 256 "$1" | awk '{print $1}')
echo -e "\t\tsha256:\t$sha256hash\n" >> "$tmploc"
[[ $vthash == "" ]] && vthash="$sha256hash"
}
# find checksum files
_csfind () {
read -d '' hdiglist <<"EOF"
sha256
sha256.txt
sha1
sha1.txt