forked from simplepush/send-encrypted
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsimplepush.sh
executable file
·129 lines (108 loc) · 2.6 KB
/
simplepush.sh
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
#!/bin/sh
#
# Push notifications using Simplepush
#
# Environment variables:
# SIMPLEPUSH_KEY SIMPLEPUSH_PASSWORD SIMPLEPUSH_SALT
api_url=https://api.simplepush.io/send
main() {
set -ef
parse_options "$@" || :
# Encrypt the data only when password is set
[ -n "$password" ] && {
iv=$(generate_iv)
encryption_key=$(generate_key "$password" "$salt")
message=$(encrypt "$encryption_key" "$iv" "$message")
[ -n "$title" ] &&
title=$(encrypt "$encryption_key" "$iv" "$title")
is_encrypted=true
} ||
is_encrypted=false
# Set curl options
set -- \
--silent \
--data-urlencode "key=$key" \
--data-urlencode "msg=$message" \
$is_encrypted &&
set -- "$@" \
--data-urlencode "encrypted=true" \
--data-urlencode "iv=$iv"
[ -n "$title" ] &&
set -- "$@" --data-urlencode "title=$title"
[ -n "$event" ] &&
set -- "$@" --data-urlencode "event=$event"
curl "$@" "$api_url"
}
usage() {
error_message=$*
prog_name=${0##*/}
help_text="Usage: $prog_name [options...]
Push notifications using Simplepush
-e <event> Event name
-k <key> Simplepush key
-p <pass> Encryption password
-s <salt> Encryption salt
-t <title> Title of the push message
-m <message> Message to push
-h Display this help text and exit"
[ $# -gt 0 ] && {
exec >&2
printf '%s: %s\n\n' "$prog_name" "$error_message"
}
printf %s\\n "$help_text"
exit ${error_message:+1}
}
parse_options() {
help=false
key=$SIMPLEPUSH_KEY
password=$SIMPLEPUSH_PASSWORD
salt=${SIMPLEPUSH_SALT:-1789F0B8C4A051E5}
has_message=false
while getopts :e:k:m:p:s:t:h opt; do
case $opt in
e) event=$OPTARG ;;
k) key=$OPTARG ;;
m) message=$OPTARG; has_message=true ;;
p) password=$OPTARG ;;
s) salt=$OPTARG ;;
t) title=$OPTARG ;;
h) help=true ;;
:) usage \
"option '$OPTARG' requires a parameter" ;;
\?) usage \
"unrecognized option '$OPTARG'" ;;
esac
done
shift $((OPTIND-1))
[ $# -gt 0 ] &&
usage "unrecognized option '$1'"
# Read message from stdin if it's not a terminal
! $has_message && ! [ -t 0 ] &&
message=$(cat -)
unset opt
[ -z "$key" ] && opt=k
[ -z "$message" ] && opt=m
[ -n "$opt" ] &&
usage "missing or empty mandatory option '$opt'"
$help && usage
}
generate_iv() {
openssl enc -aes-128-cbc -k dummy -P -md sha1 |
sed -n '/^iv/ s/.*=//p'
}
generate_key() {
_password=$1
_salt=$2
printf %s%s "$_password" "$_salt" \
| sha1sum \
| awk '{ print toupper(substr($1, 1, 32)) }'
}
encrypt() {
_key=$1
_iv=$2
_data=$3
printf %s "$_data" |
openssl aes-128-cbc -base64 -K "$_key" -iv "$_iv" |
tr +/ -_ | tr -d \\n
}
main "$@"