freedombone-app-keyserver 28KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721
  1. #!/bin/bash
  2. #
  3. # .---. . .
  4. # | | |
  5. # |--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-.
  6. # | | (.-' (.-' ( | ( )| | | | )( )| | (.-'
  7. # ' ' --' --' -' - -' ' ' -' -' -' ' - --'
  8. #
  9. # Freedom in the Cloud
  10. #
  11. # SKS Keyserver
  12. #
  13. # License
  14. # =======
  15. #
  16. # Copyright (C) 2017 Bob Mottram <bob@freedombone.net>
  17. #
  18. # This program is free software: you can redistribute it and/or modify
  19. # it under the terms of the GNU Affero General Public License as published by
  20. # the Free Software Foundation, either version 3 of the License, or
  21. # (at your option) any later version.
  22. #
  23. # This program is distributed in the hope that it will be useful,
  24. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  25. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  26. # GNU Affero General Public License for more details.
  27. #
  28. # You should have received a copy of the GNU Affero General Public License
  29. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  30. VARIANTS='full full-vim'
  31. IN_DEFAULT_INSTALL=0
  32. SHOW_ON_ABOUT=1
  33. KEYSERVER_WEB_REPO="https://github.com/mattrude/pgpkeyserver-lite"
  34. KEYSERVER_WEB_COMMIT='a038cb79b927c99bf7da62f20d2c6a2f20374339'
  35. KEYSERVER_PORT=11371
  36. KEYSERVER_ONION_PORT=8122
  37. KEYSERVER_DOMAIN_NAME=
  38. KEYSERVER_CODE=
  39. keyserver_variables=(ONION_ONLY
  40. MY_USERNAME
  41. DEFAULT_DOMAIN_NAME
  42. KEYSERVER_DOMAIN_NAME
  43. KEYSERVER_CODE)
  44. function check_keyserver_directory_size {
  45. dirsize=$(du /var/lib/sks/DB | awk -F ' ' '{print $1}')
  46. # 500M
  47. if [ $dirsize -gt 500000 ]; then
  48. echo "1"
  49. return
  50. fi
  51. echo "0"
  52. }
  53. function configure_firewall_for_keyserver {
  54. if [[ $ONION_ONLY != "no" ]]; then
  55. return
  56. fi
  57. firewall_add keyserver 11370 tcp
  58. firewall_add keyserver 11371 tcp
  59. firewall_add keyserver 11372 tcp
  60. mark_completed $FUNCNAME
  61. }
  62. function keyserver_reset_database {
  63. if [ -d /var/lib/sks/DB ]; then
  64. rm -rf /var/lib/sks/DB
  65. fi
  66. sks build
  67. chown -Rc debian-sks: /var/lib/sks
  68. systemctl restart sks
  69. }
  70. function logging_on_keyserver {
  71. echo -n ''
  72. }
  73. function logging_off_keyserver {
  74. echo -n ''
  75. }
  76. function reconfigure_keyserver {
  77. echo -n ''
  78. }
  79. function upgrade_keyserver {
  80. CURR_KEYSERVER_WEB_COMMIT=$(get_completion_param "keyserver web commit")
  81. if [[ "$CURR_KEYSERVER_WEB_COMMIT" == "$KEYSERVER_WEB_COMMIT" ]]; then
  82. return
  83. fi
  84. if grep -q "keyserver domain" $COMPLETION_FILE; then
  85. KEYSERVER_DOMAIN_NAME=$(get_completion_param "keyserver domain")
  86. fi
  87. # update to the next commit
  88. function_check set_repo_commit
  89. set_repo_commit /var/www/$KEYSERVER_DOMAIN_NAME/htdocs "keyserver web commit" "$KEYSERVER_WEB_COMMIT" $KEYSERVER_WEB_REPO
  90. read_config_param MY_USERNAME
  91. USER_EMAIL_ADDRESS=$MY_USERNAME@$HOSTNAME
  92. GPG_ID=$(su -m root -c "gpg --list-keys $USER_EMAIL_ADDRESS | sed -n '2p' | sed 's/^[ \t]*//'" - $MY_USERNAME)
  93. if [ ! $GPG_ID ]; then
  94. echo $'No GPG ID for admin user'
  95. exit 846336
  96. fi
  97. if [ ${#GPG_ID} -lt 5 ]; then
  98. echo $'GPG ID not retrieved for admin user'
  99. exit 835292
  100. fi
  101. if [[ "$GPG_ID" == *"error"* ]]; then
  102. echo $'GPG ID not retrieved for admin user due to error'
  103. exit 74825
  104. fi
  105. sed -i "s|###ENTERPUBLICKEYHERE###|$GPG_ID|g" /var/www/$KEYSERVER_DOMAIN_NAME/htdocs/404.html
  106. sed -i "s|###ENTERPUBLICKEYHERE###|$GPG_ID|g" /var/www/$KEYSERVER_DOMAIN_NAME/htdocs/index.html
  107. sed -i "s|###ENTERNAMEHERE###|$USER_EMAIL_ADDRESS|g" /var/www/$KEYSERVER_DOMAIN_NAME/htdocs/404.html
  108. sed -i "s|###ENTERNAMEHERE###|$USER_EMAIL_ADDRESS|g" /var/www/$KEYSERVER_DOMAIN_NAME/htdocs/index.html
  109. chown -R www-data:www-data /var/www/$KEYSERVER_DOMAIN_NAME/htdocs
  110. }
  111. function backup_local_keyserver {
  112. source_directory=/etc/sks
  113. if [ -d $source_directory ]; then
  114. systemctl stop sks
  115. dest_directory=keyserverconfig
  116. function_check backup_directory_to_usb
  117. backup_directory_to_usb $source_directory $dest_directory
  118. systemctl start sks
  119. fi
  120. if [[ "$(check_keyserver_directory_size)" != "0" ]]; then
  121. echo $'WARNING: Keyserver database size is too large to backup'
  122. return
  123. fi
  124. source_directory=/var/lib/sks/DB
  125. if [ -d $source_directory ]; then
  126. systemctl stop sks
  127. dest_directory=keyserver
  128. function_check backup_directory_to_usb
  129. backup_directory_to_usb $source_directory $dest_directory
  130. systemctl start sks
  131. fi
  132. }
  133. function restore_local_keyserver {
  134. if [ ! -d /var/lib/sks/DB ]; then
  135. return
  136. fi
  137. echo $"Restoring SKS Keyserver"
  138. systemctl stop sks
  139. temp_restore_dir=/root/tempkeyserverconfig
  140. function_check restore_directory_from_usb
  141. restore_directory_from_usb $temp_restore_dir keyserverconfig
  142. cp -r $temp_restore_dir/etc/sks/* /etc/sks/
  143. rm -rf $temp_restore_dir
  144. chown -Rc debian-sks: /etc/sks/sksconf
  145. chown -Rc debian-sks: /etc/sks/mailsync
  146. temp_restore_dir=/root/tempkeyserver
  147. function_check restore_directory_from_usb
  148. restore_directory_from_usb $temp_restore_dir keyserver
  149. mv /var/lib/sks/DB /var/lib/sks/DB_prev
  150. cp -r $temp_restore_dir/var/lib/sks/DB /var/lib/sks/DB
  151. if [ ! "$?" = "0" ]; then
  152. # restore the old database
  153. rm -rf /var/lib/sks/DB
  154. mv /var/lib/sks/DB_prev /var/lib/sks/DB
  155. rm -rf $temp_restore_dir
  156. function_check set_user_permissions
  157. set_user_permissions
  158. function_check backup_unmount_drive
  159. backup_unmount_drive
  160. exit 5627294
  161. fi
  162. rm -rf $temp_restore_dir
  163. chown -Rc debian-sks: /var/lib/sks
  164. # remove the old database
  165. rm -rf /var/lib/sks/DB_prev
  166. systemctl start sks
  167. }
  168. function backup_remote_keyserver {
  169. source_directory=/etc/sks
  170. if [ -d $source_directory ]; then
  171. systemctl stop sks
  172. dest_directory=keyserverconfig
  173. function_check backup_directory_to_friend
  174. backup_directory_to_friend $source_directory $dest_directory
  175. systemctl start sks
  176. fi
  177. if [[ "$(check_keyserver_directory_size)" != "0" ]]; then
  178. echo $'WARNING: Keyserver database size is too large to backup'
  179. return
  180. fi
  181. source_directory=/var/lib/sks/DB
  182. if [ -d $source_directory ]; then
  183. systemctl stop sks
  184. dest_directory=keyserver
  185. function_check backup_directory_to_friend
  186. backup_directory_to_friend $source_directory $dest_directory
  187. systemctl start sks
  188. fi
  189. }
  190. function restore_remote_keyserver {
  191. if [ ! -d /var/lib/sks/DB ]; then
  192. return
  193. fi
  194. echo $"Restoring SKS Keyserver"
  195. systemctl stop sks
  196. temp_restore_dir=/root/tempkeyserverconfig
  197. function_check restore_directory_from_friend
  198. restore_directory_from_friend $temp_restore_dir keyserverconfig
  199. cp -r $temp_restore_dir/etc/sks/* /etc/sks/
  200. rm -rf $temp_restore_dir
  201. chown -Rc debian-sks: /etc/sks/sksconf
  202. chown -Rc debian-sks: /etc/sks/mailsync
  203. temp_restore_dir=/root/tempkeyserver
  204. function_check restore_directory_from_friend
  205. restore_directory_from_friend $temp_restore_dir keyserver
  206. mv /var/lib/sks/DB /var/lib/sks/DB_prev
  207. cp -r $temp_restore_dir/var/lib/sks/DB /var/lib/sks/DB
  208. if [ ! "$?" = "0" ]; then
  209. # restore the old database
  210. rm -rf /var/lib/sks/DB
  211. mv /var/lib/sks/DB_prev /var/lib/sks/DB
  212. rm -rf $temp_restore_dir
  213. function_check set_user_permissions
  214. set_user_permissions
  215. return
  216. fi
  217. rm -rf $temp_restore_dir
  218. chown -Rc debian-sks: /var/lib/sks
  219. # remove the old database
  220. rm -rf /var/lib/sks/DB_prev
  221. systemctl start sks
  222. }
  223. function remove_keyserver {
  224. systemctl stop sks
  225. apt-get -qy remove sks dirmngr
  226. read_config_param "KEYSERVER_DOMAIN_NAME"
  227. nginx_dissite $KEYSERVER_DOMAIN_NAME
  228. remove_certs ${KEYSERVER_DOMAIN_NAME}
  229. if [ -f /etc/nginx/sites-available/$KEYSERVER_DOMAIN_NAME ]; then
  230. rm -f /etc/nginx/sites-available/$KEYSERVER_DOMAIN_NAME
  231. fi
  232. if [ -d /var/www/$KEYSERVER_DOMAIN_NAME ]; then
  233. rm -rf /var/www/$KEYSERVER_DOMAIN_NAME
  234. fi
  235. function_check remove_ddns_domain
  236. remove_ddns_domain $KEYSERVER_DOMAIN_NAME
  237. remove_config_param KEYSERVER_DOMAIN_NAME
  238. remove_config_param KEYSERVER_CODE
  239. function_check remove_onion_service
  240. remove_onion_service keyserver ${KEYSERVER_ONION_PORT}
  241. remove_onion_service sks 11370 11371 11372
  242. remove_completion_param "install_keyserver"
  243. firewall_remove 11370 tcp
  244. firewall_remove 11371 tcp
  245. firewall_remove 11372 tcp
  246. sed -i '/keyserver/d' $COMPLETION_FILE
  247. sed -i '/sks onion/d' $COMPLETION_FILE
  248. if [ -d /var/lib/sks ]; then
  249. rm -rf /var/lib/sks
  250. fi
  251. }
  252. function install_interactive_keyserver {
  253. if [ ! $ONION_ONLY ]; then
  254. ONION_ONLY='no'
  255. fi
  256. if [[ $ONION_ONLY != "no" ]]; then
  257. KEYSERVER_DOMAIN_NAME='keyserver.local'
  258. write_config_param "KEYSERVER_DOMAIN_NAME" "$KEYSERVER_DOMAIN_NAME"
  259. else
  260. function_check interactive_site_details
  261. interactive_site_details "keyserver" "KEYSERVER_DOMAIN_NAME" "KEYSERVER_CODE"
  262. fi
  263. APP_INSTALLED=1
  264. }
  265. function keyserver_create_mailsync {
  266. echo $"# List of email addresses which submitted keys will be forwarded to" > /etc/sks/mailsync
  267. echo '' >> /etc/sks/mailsync
  268. chown -Rc debian-sks: /etc/sks/mailsync
  269. }
  270. function keyserver_create_membership {
  271. if [ -f /etc/sks/membership ]; then
  272. return
  273. fi
  274. systemctl stop sks
  275. echo $"# List of other $PROJECT_NAME SKS Keyservers to sync with." > /etc/sks/membership
  276. echo '#' >> /etc/sks/membership
  277. echo $"# Don't add major keyservers here, because it will take an" >> /etc/sks/membership
  278. echo $'# Infeasible amount of time to sync and backups will become' >> /etc/sks/membership
  279. echo $'# absurdly long and probably break your system. You have been warned.' >> /etc/sks/membership
  280. echo '' >> /etc/sks/membership
  281. chown -Rc debian-sks: /etc/sks/membership
  282. systemctl start sks
  283. }
  284. function keyserver_import_keys {
  285. # NOTE: this function isn't used, but kept for reference
  286. dialog --title $"Import public keys database" \
  287. --backtitle $"Freedombone Control Panel" \
  288. --defaultno \
  289. --yesno $"\nThis will download many gigabytes of data and so depending on your bandwidth it could take several days.\n\nContinue?" 10 60
  290. sel=$?
  291. case $sel in
  292. 1) return;;
  293. 255) return;;
  294. esac
  295. if [ ! -d /var/lib/sks/dump ]; then
  296. mkdir -p /var/lib/sks/dump
  297. fi
  298. cd /var/lib/sks/dump
  299. echo $'Getting keyserver dump. This may take a few days or longer, so be patient.'
  300. rm -rf /var/lib/sks/dump/*
  301. KEYSERVER_DUMP_URL="https://keyserver.mattrude.com/dump/$(date +%F)/"
  302. wget -crp -e robots=off --level=1 --cut-dirs=3 -nH \
  303. -A pgp,txt $KEYSERVER_DUMP_URL
  304. cd /var/lib/sks
  305. echo $'Building the keyserver database from the downloaded dump'
  306. keyserver_reset_database
  307. }
  308. function keyserver_sync {
  309. data=$(tempfile 2>/dev/null)
  310. trap "rm -f $data" 0 1 2 5 15
  311. dialog --backtitle $"Freedombone Control Panel" \
  312. --title $"Sync with other keyserver" \
  313. --form $"\nEnter details for the other server. Please be aware that it's not a good idea to sync with major keyservers which have exceptionally large databases. This is intended to sync with other $PROJECT_NAME systems each having a small database for a particular community." 16 60 3 \
  314. $"Domain:" 1 1 "" 1 25 32 64 \
  315. $"Port:" 2 1 "11370" 2 25 6 6 \
  316. $"Sync Email (optional):" 3 1 "pgp-public-keys@" 3 25 32 64 \
  317. 2> $data
  318. sel=$?
  319. case $sel in
  320. 1) return;;
  321. 255) return;;
  322. esac
  323. other_keyserver_domain=$(cat $data | sed -n 1p)
  324. other_keyserver_port=$(cat $data | sed -n 2p)
  325. other_keyserver_email=$(cat $data | sed -n 3p)
  326. if [[ "$other_keyserver_domain" != *'.'* ]]; then
  327. return
  328. fi
  329. if [[ "$other_keyserver_domain" == *' '* ]]; then
  330. return
  331. fi
  332. if [[ "$other_keyserver_port" == *'.'* ]]; then
  333. return
  334. fi
  335. if [[ "$other_keyserver_port" == *' '* ]]; then
  336. return
  337. fi
  338. if [ ${#other_keyserver_domain} -lt 4 ]; then
  339. return
  340. fi
  341. if [ ${#other_keyserver_port} -lt 4 ]; then
  342. return
  343. fi
  344. if [[ "$other_keyserver_email" != "pgp-public-keys@" ]]; then
  345. if [[ "$other_keyserver_email" == *"@"* ]]; then
  346. keyserver_create_mailsync
  347. if ! grep -q "$other_keyserver_email" /etc/sks/mailsync; then
  348. echo "$other_keyserver_email" >> /etc/sks/mailsync
  349. chown -Rc debian-sks: /etc/sks/mailsync
  350. fi
  351. fi
  352. fi
  353. keyserver_create_membership
  354. if grep -q "$other_keyserver_domain $other_keyserver_port" /etc/sks/membership; then
  355. return
  356. fi
  357. if grep -q "$other_keyserver_domain " /etc/sks/membership; then
  358. sed -i "s|$other_keyserver_domain .*|$other_keyserver_domain $other_keyserver_port|g" /etc/sks/membership
  359. else
  360. echo "$other_keyserver_domain $other_keyserver_port" >> /etc/sks/membership
  361. fi
  362. chown -Rc debian-sks: /etc/sks/membership
  363. systemctl restart sks
  364. dialog --title $"Sync with other keyserver" \
  365. --msgbox $"Keyserver added" 6 40
  366. }
  367. function keyserver_edit {
  368. if [ ! -f /etc/sks/membership ]; then
  369. return
  370. fi
  371. editor /etc/sks/membership
  372. chown -Rc debian-sks: /etc/sks/membership
  373. systemctl restart sks
  374. }
  375. function configure_interactive_keyserver {
  376. while true
  377. do
  378. data=$(tempfile 2>/dev/null)
  379. trap "rm -f $data" 0 1 2 5 15
  380. dialog --backtitle $"Freedombone Control Panel" \
  381. --title $"SKS Keyserver" \
  382. --radiolist $"Choose an operation:" 11 70 3 \
  383. 1 $"Sync with other keyserver" off \
  384. 2 $"Edit sync keyservers" off \
  385. 3 $"Exit" on 2> $data
  386. sel=$?
  387. case $sel in
  388. 1) return;;
  389. 255) return;;
  390. esac
  391. case $(cat $data) in
  392. 1) keyserver_sync;;
  393. 2) keyserver_edit;;
  394. 3) break;;
  395. esac
  396. done
  397. }
  398. function install_keyserver {
  399. apt-get -qy install build-essential gcc ocaml libdb-dev wget sks
  400. keyserver_reset_database
  401. sed -i 's|initstart=.*|initstart=yes|g' /etc/default/sks
  402. apt-get -qy install dirmngr
  403. systemctl restart sks
  404. if [ ! -d /var/www/$KEYSERVER_DOMAIN_NAME ]; then
  405. mkdir /var/www/$KEYSERVER_DOMAIN_NAME
  406. fi
  407. cd /var/www/$KEYSERVER_DOMAIN_NAME
  408. if [ -d /var/www/$KEYSERVER_DOMAIN_NAME/htdocs ]; then
  409. rm -rf /var/www/$KEYSERVER_DOMAIN_NAME/htdocs
  410. fi
  411. if [ -d /repos/keyserverweb ]; then
  412. mkdir htdocs
  413. cp -r -p /repos/keyserverweb/. htdocs
  414. cd htdocs
  415. git pull
  416. else
  417. git_clone $KEYSERVER_WEB_REPO htdocs
  418. fi
  419. if [ ! -d /var/www/$KEYSERVER_DOMAIN_NAME/htdocs ]; then
  420. echo $"/var/www/$KEYSERVER_DOMAIN_NAME/htdocs not found"
  421. exit 6539230
  422. fi
  423. cd /var/www/$KEYSERVER_DOMAIN_NAME/htdocs
  424. git checkout $KEYSERVER_WEB_COMMIT -b $KEYSERVER_WEB_COMMIT
  425. set_completion_param "keyserver web commit" "$KEYSERVER_WEB_COMMIT"
  426. USER_EMAIL_ADDRESS=$MY_USERNAME@$HOSTNAME
  427. GPG_ID=$(su -m root -c "gpg --list-keys $USER_EMAIL_ADDRESS | sed -n '2p' | sed 's/^[ \t]*//'" - $MY_USERNAME)
  428. if [ ! $GPG_ID ]; then
  429. echo $'No GPG ID for admin user'
  430. exit 846336
  431. fi
  432. if [ ${#GPG_ID} -lt 5 ]; then
  433. echo $'GPG ID not retrieved for admin user'
  434. exit 835292
  435. fi
  436. if [[ "$GPG_ID" == *"error"* ]]; then
  437. echo $'GPG ID not retrieved for admin user due to error'
  438. exit 74825
  439. fi
  440. sed -i "s|###ENTERPUBLICKEYHERE###|$GPG_ID|g" /var/www/$KEYSERVER_DOMAIN_NAME/htdocs/404.html
  441. sed -i "s|###ENTERPUBLICKEYHERE###|$GPG_ID|g" /var/www/$KEYSERVER_DOMAIN_NAME/htdocs/index.html
  442. sed -i "s|###ENTERNAMEHERE###|$USER_EMAIL_ADDRESS|g" /var/www/$KEYSERVER_DOMAIN_NAME/htdocs/404.html
  443. sed -i "s|###ENTERNAMEHERE###|$USER_EMAIL_ADDRESS|g" /var/www/$KEYSERVER_DOMAIN_NAME/htdocs/index.html
  444. sksconf_file=/etc/sks/sksconf
  445. sed -i "s|#hostname:.*|hostname: $KEYSERVER_DOMAIN_NAME|g" $sksconf_file
  446. sed -i "s|hostname:.*|hostname: $KEYSERVER_DOMAIN_NAME|g" $sksconf_file
  447. sed -i "s|#hkp_port:.*|hkp_port: 11373|g" $sksconf_file
  448. sed -i "s|hkp_port:.*|hkp_port: 11373|g" $sksconf_file
  449. sed -i "s|#recon_port:.*|recon_port: 11370|g" $sksconf_file
  450. sed -i "s|recon_port:.*|recon_port: 11370|g" $sksconf_file
  451. sed -i "s|#recon_address:.*|recon_address: 0.0.0.0|g" $sksconf_file
  452. sed -i "s|recon_address:.*|recon_address: 0.0.0.0|g" $sksconf_file
  453. sed -i 's|#hkp_address:.*|hkp_address: 127.0.0.1|g' $sksconf_file
  454. sed -i 's|hkp_address:.*|hkp_address: 127.0.0.1|g' $sksconf_file
  455. sed -i "s|#from_addr:.*|from_addr: \"pgp-public-keys@$DEFAULT_DOMAIN_NAME\"|g" $sksconf_file
  456. sed -i "s|from_addr:.*|from_addr: \"pgp-public-keys@$DEFAULT_DOMAIN_NAME\"|g" $sksconf_file
  457. sed -i 's|#sendmail_cmd:|sendmail_cmd:|g' $sksconf_file
  458. if ! grep -q "#disable_mailsync" $sksconf_file; then
  459. echo '#disable_mailsync:' >> $sksconf_file
  460. else
  461. sed -i 's|disable_mailsync:|#disable_mailsync:|g' $sksconf_file
  462. fi
  463. if ! grep -q "membership_reload_interval:" $sksconf_file; then
  464. echo 'membership_reload_interval: 1' >> $sksconf_file
  465. else
  466. sed -i 's|#membership_reload_interval:.*|membership_reload_interval: 1|g' $sksconf_file
  467. sed -i 's|membership_reload_interval:.*|membership_reload_interval: 1|g' $sksconf_file
  468. fi
  469. if ! grep -q "max_matches:" $sksconf_file; then
  470. echo 'max_matches: 50' >> $sksconf_file
  471. else
  472. sed -i 's|#max_matches:.*|max_matches: 50|g' $sksconf_file
  473. sed -i 's|max_matches:.*|max_matches: 50|g' $sksconf_file
  474. fi
  475. if ! grep -q "stat_hour:" $sksconf_file; then
  476. echo "stat_hour: $((1 + RANDOM % 8))" >> $sksconf_file
  477. else
  478. sed -i "s|#stat_hour:.*|stat_hour: $((1 + RANDOM % 8))|g" $sksconf_file
  479. sed -i "s|stat_hour:.*|stat_hour: $((1 + RANDOM % 8))|g" $sksconf_file
  480. fi
  481. chown debian-sks: $sksconf_file
  482. if ! grep -q "hidden_service_sks" /etc/tor/torrc; then
  483. echo 'HiddenServiceDir /var/lib/tor/hidden_service_sks/' >> /etc/tor/torrc
  484. echo "HiddenServicePort 11370 127.0.0.1:11370" >> /etc/tor/torrc
  485. echo "HiddenServicePort 11373 127.0.0.1:11371" >> /etc/tor/torrc
  486. echo "HiddenServicePort 11372 127.0.0.1:11372" >> /etc/tor/torrc
  487. echo $'Added onion site for sks'
  488. fi
  489. onion_update
  490. wait_for_onion_service 'sks'
  491. if [ ! -f /var/lib/tor/hidden_service_sks/hostname ]; then
  492. echo $'sks onion site hostname not found'
  493. exit 8352982
  494. fi
  495. SKS_ONION_HOSTNAME=$(cat /var/lib/tor/hidden_service_sks/hostname)
  496. KEYSERVER_ONION_HOSTNAME=$(add_onion_service keyserver 80 ${KEYSERVER_ONION_PORT})
  497. keyserver_nginx_site=/etc/nginx/sites-available/$KEYSERVER_DOMAIN_NAME
  498. if [[ $ONION_ONLY == "no" ]]; then
  499. # NOTE: without http active on port 80 the keyserver doesn't work
  500. # from the commandline
  501. echo 'server {' > $keyserver_nginx_site
  502. echo ' listen 80;' >> $keyserver_nginx_site
  503. echo ' listen 0.0.0.0:11371;' >> $keyserver_nginx_site
  504. echo ' listen [::]:80;' >> $keyserver_nginx_site
  505. echo " server_name $KEYSERVER_DOMAIN_NAME;" >> $keyserver_nginx_site
  506. echo '' >> $keyserver_nginx_site
  507. echo ' # Logs' >> $keyserver_nginx_site
  508. echo ' access_log /dev/null;' >> $keyserver_nginx_site
  509. echo ' error_log /dev/null;' >> $keyserver_nginx_site
  510. echo '' >> $keyserver_nginx_site
  511. echo ' # Root' >> $keyserver_nginx_site
  512. echo " root /var/www/$KEYSERVER_DOMAIN_NAME/htdocs;" >> $keyserver_nginx_site
  513. echo '' >> $keyserver_nginx_site
  514. echo ' rewrite ^/stats /pks/lookup?op=stats;' >> $keyserver_nginx_site
  515. echo ' rewrite ^/s/(.*) /pks/lookup?search=$1;' >> $keyserver_nginx_site
  516. echo ' rewrite ^/search/(.*) /pks/lookup?search=$1;' >> $keyserver_nginx_site
  517. echo ' rewrite ^/g/(.*) /pks/lookup?op=get&search=$1;' >> $keyserver_nginx_site
  518. echo ' rewrite ^/get/(.*) /pks/lookup?op=get&search=$1;' >> $keyserver_nginx_site
  519. echo ' rewrite ^/d/(.*) /pks/lookup?op=get&options=mr&search=$1;' >> $keyserver_nginx_site
  520. echo ' rewrite ^/download/(.*) /pks/lookup?op=get&options=mr&search=$1;' >> $keyserver_nginx_site
  521. echo '' >> $keyserver_nginx_site
  522. echo ' location /pks {' >> $keyserver_nginx_site
  523. echo ' proxy_pass http://127.0.0.1:11373;' >> $keyserver_nginx_site
  524. echo ' proxy_pass_header Server;' >> $keyserver_nginx_site
  525. echo " add_header Via \"1.1 $KEYSERVER_DOMAIN_NAME:11371 (nginx)\";" >> $keyserver_nginx_site
  526. echo ' proxy_ignore_client_abort on;' >> $keyserver_nginx_site
  527. echo ' client_max_body_size 8m;' >> $keyserver_nginx_site
  528. echo ' }' >> $keyserver_nginx_site
  529. echo '}' >> $keyserver_nginx_site
  530. echo '' >> $keyserver_nginx_site
  531. echo 'server {' >> $keyserver_nginx_site
  532. echo ' listen 443 ssl;' >> $keyserver_nginx_site
  533. echo ' listen 0.0.0.0:11372 ssl;' >> $keyserver_nginx_site
  534. echo ' listen [::]:443 ssl;' >> $keyserver_nginx_site
  535. echo " server_name $KEYSERVER_DOMAIN_NAME;" >> $keyserver_nginx_site
  536. echo '' >> $keyserver_nginx_site
  537. echo ' error_page 404 /404.html;' >> $keyserver_nginx_site
  538. echo '' >> $keyserver_nginx_site
  539. echo ' location ~ (.git|LICENSE|readme.md) {' >> $keyserver_nginx_site
  540. echo ' deny all;' >> $keyserver_nginx_site
  541. echo ' return 404;' >> $keyserver_nginx_site
  542. echo ' }' >> $keyserver_nginx_site
  543. echo '' >> $keyserver_nginx_site
  544. echo ' # Security' >> $keyserver_nginx_site
  545. function_check nginx_ssl
  546. nginx_ssl $KEYSERVER_DOMAIN_NAME
  547. function_check nginx_disable_sniffing
  548. nginx_disable_sniffing $KEYSERVER_DOMAIN_NAME
  549. echo ' add_header Strict-Transport-Security max-age=15768000;' >> $keyserver_nginx_site
  550. echo '' >> $keyserver_nginx_site
  551. echo ' # Logs' >> $keyserver_nginx_site
  552. echo ' access_log /dev/null;' >> $keyserver_nginx_site
  553. echo ' error_log /dev/null;' >> $keyserver_nginx_site
  554. echo '' >> $keyserver_nginx_site
  555. echo ' # Root' >> $keyserver_nginx_site
  556. echo " root /var/www/$KEYSERVER_DOMAIN_NAME/htdocs;" >> $keyserver_nginx_site
  557. echo '' >> $keyserver_nginx_site
  558. echo ' rewrite ^/stats /pks/lookup?op=stats;' >> $keyserver_nginx_site
  559. echo ' rewrite ^/s/(.*) /pks/lookup?search=$1;' >> $keyserver_nginx_site
  560. echo ' rewrite ^/search/(.*) /pks/lookup?search=$1;' >> $keyserver_nginx_site
  561. echo ' rewrite ^/g/(.*) /pks/lookup?op=get&search=$1;' >> $keyserver_nginx_site
  562. echo ' rewrite ^/get/(.*) /pks/lookup?op=get&search=$1;' >> $keyserver_nginx_site
  563. echo ' rewrite ^/d/(.*) /pks/lookup?op=get&options=mr&search=$1;' >> $keyserver_nginx_site
  564. echo ' rewrite ^/download/(.*) /pks/lookup?op=get&options=mr&search=$1;' >> $keyserver_nginx_site
  565. echo '' >> $keyserver_nginx_site
  566. echo ' location /pks {' >> $keyserver_nginx_site
  567. echo " proxy_pass http://127.0.0.1:11373;" >> $keyserver_nginx_site
  568. echo ' proxy_pass_header Server;' >> $keyserver_nginx_site
  569. echo " add_header Via \"1.1 $KEYSERVER_DOMAIN_NAME:11372 (nginx)\";" >> $keyserver_nginx_site
  570. echo ' proxy_ignore_client_abort on;' >> $keyserver_nginx_site
  571. echo ' client_max_body_size 8m;' >> $keyserver_nginx_site
  572. echo ' }' >> $keyserver_nginx_site
  573. echo '}' >> $keyserver_nginx_site
  574. echo '' >> $keyserver_nginx_site
  575. else
  576. echo -n '' > $keyserver_nginx_site
  577. fi
  578. echo 'server {' >> $keyserver_nginx_site
  579. echo " listen 127.0.0.1:$KEYSERVER_ONION_PORT default_server;" >> $keyserver_nginx_site
  580. echo " server_name $KEYSERVER_ONION_HOSTNAME;" >> $keyserver_nginx_site
  581. echo '' >> $keyserver_nginx_site
  582. echo ' error_page 404 /404.html;' >> $keyserver_nginx_site
  583. echo '' >> $keyserver_nginx_site
  584. echo ' location ~ (.git|LICENSE|readme.md) {' >> $keyserver_nginx_site
  585. echo ' deny all;' >> $keyserver_nginx_site
  586. echo ' return 404;' >> $keyserver_nginx_site
  587. echo ' }' >> $keyserver_nginx_site
  588. echo '' >> $keyserver_nginx_site
  589. function_check nginx_disable_sniffing
  590. nginx_disable_sniffing $KEYSERVER_DOMAIN_NAME
  591. echo '' >> $keyserver_nginx_site
  592. echo ' # Logs' >> $keyserver_nginx_site
  593. echo ' access_log /dev/null;' >> $keyserver_nginx_site
  594. echo ' error_log /dev/null;' >> $keyserver_nginx_site
  595. echo '' >> $keyserver_nginx_site
  596. echo ' # Root' >> $keyserver_nginx_site
  597. echo " root /var/www/$KEYSERVER_DOMAIN_NAME/mail;" >> $keyserver_nginx_site
  598. echo '' >> $keyserver_nginx_site
  599. echo ' rewrite ^/stats /pks/lookup?op=stats;' >> $keyserver_nginx_site
  600. echo ' rewrite ^/s/(.*) /pks/lookup?search=$1;' >> $keyserver_nginx_site
  601. echo ' rewrite ^/search/(.*) /pks/lookup?search=$1;' >> $keyserver_nginx_site
  602. echo ' rewrite ^/g/(.*) /pks/lookup?op=get&search=$1;' >> $keyserver_nginx_site
  603. echo ' rewrite ^/get/(.*) /pks/lookup?op=get&search=$1;' >> $keyserver_nginx_site
  604. echo ' rewrite ^/d/(.*) /pks/lookup?op=get&options=mr&search=$1;' >> $keyserver_nginx_site
  605. echo ' rewrite ^/download/(.*) /pks/lookup?op=get&options=mr&search=$1;' >> $keyserver_nginx_site
  606. echo '' >> $keyserver_nginx_site
  607. echo ' location /pks {' >> $keyserver_nginx_site
  608. echo " proxy_pass http://127.0.0.1:11373;" >> $keyserver_nginx_site
  609. echo ' proxy_pass_header Server;' >> $keyserver_nginx_site
  610. echo " add_header Via \"1.1 $KEYSERVER_DOMAIN_NAME:$KEYSERVER_ONION_PORT (nginx)\";" >> $keyserver_nginx_site
  611. echo ' proxy_ignore_client_abort on;' >> $keyserver_nginx_site
  612. echo ' client_max_body_size 8m;' >> $keyserver_nginx_site
  613. echo ' }' >> $keyserver_nginx_site
  614. echo '}' >> $keyserver_nginx_site
  615. function_check create_site_certificate
  616. if [ ! -f /etc/ssl/certs/${KEYSERVER_DOMAIN_NAME}.pem ]; then
  617. create_site_certificate $KEYSERVER_DOMAIN_NAME 'yes'
  618. fi
  619. if [ -f /etc/ssl/certs/${KEYSERVER_DOMAIN_NAME}.crt ]; then
  620. mv /etc/ssl/certs/${KEYSERVER_DOMAIN_NAME}.crt /etc/ssl/certs/${KEYSERVER_DOMAIN_NAME}.pem
  621. fi
  622. if [ -f /etc/ssl/certs/${KEYSERVER_DOMAIN_NAME}.pem ]; then
  623. chown root:root /etc/ssl/certs/${KEYSERVER_DOMAIN_NAME}.pem
  624. sed -i "s|.crt|.pem|g" /etc/nginx/sites-available/${KEYSERVER_DOMAIN_NAME}
  625. fi
  626. if [ -f /etc/ssl/private/${KEYSERVER_DOMAIN_NAME}.key ]; then
  627. chown root:root /etc/ssl/private/${KEYSERVER_DOMAIN_NAME}.key
  628. fi
  629. chown -R www-data:www-data /var/www/$KEYSERVER_DOMAIN_NAME/htdocs
  630. function_check nginx_ensite
  631. nginx_ensite $KEYSERVER_DOMAIN_NAME
  632. configure_firewall_for_keyserver
  633. # remove membership file - don't try to sync with other keyservers
  634. if [ -f /etc/sks/membership ]; then
  635. rm /etc/sks/membership
  636. fi
  637. if ! grep -q "pgp-public-keys" /etc/aliases; then
  638. echo 'pgp-public-keys: "|/usr/lib/sks/sks_add_mail /etc/sks"' >> /etc/aliases
  639. fi
  640. chown -Rc debian-sks: /etc/sks/mailsync
  641. systemctl enable sks
  642. systemctl restart sks
  643. systemctl restart nginx
  644. set_completion_param "keyserver domain" "$KEYSERVER_DOMAIN_NAME"
  645. set_completion_param "keyserver onion domain" "$KEYSERVER_ONION_HOSTNAME"
  646. set_completion_param "sks onion domain" "$SKS_ONION_HOSTNAME"
  647. APP_INSTALLED=1
  648. }
  649. # NOTE: deliberately no exit 0