freedombone-app-keyserver 31KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874
  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-2018 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 keyserver_watchdog {
  54. ADMIN_USERNAME=$(grep "Admin user" "$COMPLETION_FILE" | awk -F ':' '{print $2}')
  55. ADMIN_EMAIL_ADDRESS=${ADMIN_USERNAME}@${HOSTNAME}
  56. keyserver_size_warning=$"The SKS keyserver database is getting large. Check that you aren't being spammed"
  57. keyserver_disabled_warning=$"The SKS keyserver has been disabled because it is getting too large. This is to prevent flooding attacks from crashing the server. You may need to restore the keyserver from backup."
  58. keyserver_mail_subject_line=$"${PROJECT_NAME} keyserver warning"
  59. keyserver_mail_subject_line_disabled=$"${PROJECT_NAME} keyserver disabled"
  60. read_config_param KEYSERVER_DOMAIN_NAME
  61. # check database size hourly
  62. keyserver_watchdog_script=/tmp/keyserver-watchdog
  63. { echo '#!/bin/bash';
  64. echo "dirsize=\$(du /var/lib/sks/DB | awk -F ' ' '{print \$1}')";
  65. echo "if [ \$dirsize -gt 450000 ]; then";
  66. echo " echo \"$keyserver_size_warning\" | mail -s \"$keyserver_mail_subject_line\" $ADMIN_EMAIL_ADDRESS";
  67. echo " if [ \$dirsize -gt 500000 ]; then";
  68. echo " nginx_dissite $KEYSERVER_DOMAIN_NAME";
  69. echo ' systemctl stop sks';
  70. echo ' systemctl disable sks';
  71. echo " echo \"$keyserver_disabled_warning\" | mail -s \"$keyserver_mail_subject_line_disabled\" $ADMIN_EMAIL_ADDRESS";
  72. echo ' fi';
  73. echo 'fi'; } > $keyserver_watchdog_script
  74. chmod +x $keyserver_watchdog_script
  75. if [ ! -f /etc/cron.hourly/keyserver-watchdog ]; then
  76. cp $keyserver_watchdog_script /etc/cron.hourly/keyserver-watchdog
  77. else
  78. HASH1=$(sha256sum $keyserver_watchdog_script | awk -F ' ' '{print $1}')
  79. HASH2=$(sha256sum /etc/cron.hourly/keyserver-watchdog | awk -F ' ' '{print $1}')
  80. if [[ "$HASH1" != "$HASH2" ]]; then
  81. cp $keyserver_watchdog_script /etc/cron.hourly/keyserver-watchdog
  82. fi
  83. fi
  84. rm $keyserver_watchdog_script
  85. }
  86. function configure_firewall_for_keyserver {
  87. if [[ $ONION_ONLY != "no" ]]; then
  88. return
  89. fi
  90. firewall_add keyserver 11370 tcp
  91. firewall_add keyserver 11371 tcp
  92. firewall_add keyserver 11372 tcp
  93. mark_completed "${FUNCNAME[0]}"
  94. }
  95. function keyserver_reset_database {
  96. if [ -d /var/lib/sks/DB ]; then
  97. rm -rf /var/lib/sks/DB
  98. fi
  99. sks build
  100. chown -Rc debian-sks: /var/lib/sks
  101. systemctl restart sks
  102. }
  103. function logging_on_keyserver {
  104. echo -n ''
  105. }
  106. function logging_off_keyserver {
  107. echo -n ''
  108. }
  109. function reconfigure_keyserver {
  110. echo -n ''
  111. }
  112. function upgrade_keyserver {
  113. keyserver_watchdog
  114. CURR_KEYSERVER_WEB_COMMIT=$(get_completion_param "keyserver web commit")
  115. if [[ "$CURR_KEYSERVER_WEB_COMMIT" == "$KEYSERVER_WEB_COMMIT" ]]; then
  116. return
  117. fi
  118. if grep -q "keyserver domain" "$COMPLETION_FILE"; then
  119. KEYSERVER_DOMAIN_NAME=$(get_completion_param "keyserver domain")
  120. fi
  121. # update to the next commit
  122. function_check set_repo_commit
  123. set_repo_commit "/var/www/$KEYSERVER_DOMAIN_NAME/htdocs" "keyserver web commit" "$KEYSERVER_WEB_COMMIT" $KEYSERVER_WEB_REPO
  124. read_config_param MY_USERNAME
  125. USER_EMAIL_ADDRESS="$MY_USERNAME@$HOSTNAME"
  126. GPG_ID=$(su -m root -c "gpg --list-keys \"$USER_EMAIL_ADDRESS\" | sed -n '2p' | sed 's/^[ \\t]*//'" - "$MY_USERNAME")
  127. if [ ! "$GPG_ID" ]; then
  128. echo $'No GPG ID for admin user'
  129. exit 846336
  130. fi
  131. if [ ${#GPG_ID} -lt 5 ]; then
  132. echo $'GPG ID not retrieved for admin user'
  133. exit 835292
  134. fi
  135. if [[ "$GPG_ID" == *"error"* ]]; then
  136. echo $'GPG ID not retrieved for admin user due to error'
  137. exit 74825
  138. fi
  139. sed -i "s|###ENTERPUBLICKEYHERE###|$GPG_ID|g" "/var/www/$KEYSERVER_DOMAIN_NAME/htdocs/404.html"
  140. sed -i "s|###ENTERPUBLICKEYHERE###|$GPG_ID|g" "/var/www/$KEYSERVER_DOMAIN_NAME/htdocs/index.html"
  141. sed -i "s|###ENTERNAMEHERE###|$USER_EMAIL_ADDRESS|g" "/var/www/$KEYSERVER_DOMAIN_NAME/htdocs/404.html"
  142. sed -i "s|###ENTERNAMEHERE###|$USER_EMAIL_ADDRESS|g" "/var/www/$KEYSERVER_DOMAIN_NAME/htdocs/index.html"
  143. chown -R www-data:www-data "/var/www/$KEYSERVER_DOMAIN_NAME/htdocs"
  144. }
  145. function backup_local_keyserver {
  146. # remove any unused log files
  147. cd /var/lib/sks/DB || exit 2468245
  148. db_archive -d
  149. source_directory=/etc/sks
  150. if [ -d $source_directory ]; then
  151. systemctl stop sks
  152. dest_directory=keyserverconfig
  153. function_check backup_directory_to_usb
  154. backup_directory_to_usb $source_directory $dest_directory
  155. systemctl start sks
  156. fi
  157. if [[ "$(check_keyserver_directory_size)" != "0" ]]; then
  158. echo $'WARNING: Keyserver database size is too large to backup'
  159. return
  160. fi
  161. source_directory=/var/lib/sks/DB
  162. if [ -d $source_directory ]; then
  163. systemctl stop sks
  164. dest_directory=keyserver
  165. function_check backup_directory_to_usb
  166. backup_directory_to_usb $source_directory $dest_directory
  167. systemctl start sks
  168. fi
  169. }
  170. function restore_local_keyserver {
  171. if [ ! -d /var/lib/sks/DB ]; then
  172. return
  173. fi
  174. echo $"Restoring SKS Keyserver"
  175. systemctl stop sks
  176. temp_restore_dir=/root/tempkeyserverconfig
  177. function_check restore_directory_from_usb
  178. restore_directory_from_usb $temp_restore_dir keyserverconfig
  179. if [ -d $temp_restore_dir/etc/sks ]; then
  180. cp -r $temp_restore_dir/etc/sks/* /etc/sks/
  181. else
  182. cp -r $temp_restore_dir/* /etc/sks/
  183. fi
  184. rm -rf $temp_restore_dir
  185. chown -Rc debian-sks: /etc/sks/sksconf
  186. chown -Rc debian-sks: /etc/sks/mailsync
  187. temp_restore_dir=/root/tempkeyserver
  188. function_check restore_directory_from_usb
  189. restore_directory_from_usb $temp_restore_dir keyserver
  190. mv /var/lib/sks/DB /var/lib/sks/DB_prev
  191. if [ -d $temp_restore_dir/var/lib/sks/DB ]; then
  192. cp -r $temp_restore_dir/var/lib/sks/DB /var/lib/sks/DB
  193. else
  194. if [ ! -d /var/lib/sks/DB ]; then
  195. mkdir /var/lib/sks/DB
  196. fi
  197. cp -r $temp_restore_dir/* /var/lib/sks/DB
  198. fi
  199. # shellcheck disable=SC2181
  200. if [ ! "$?" = "0" ]; then
  201. # restore the old database
  202. rm -rf /var/lib/sks/DB
  203. mv /var/lib/sks/DB_prev /var/lib/sks/DB
  204. rm -rf $temp_restore_dir
  205. function_check set_user_permissions
  206. set_user_permissions
  207. function_check backup_unmount_drive
  208. backup_unmount_drive
  209. exit 5627294
  210. fi
  211. rm -rf $temp_restore_dir
  212. chown -Rc debian-sks: /var/lib/sks
  213. # remove the old database
  214. rm -rf /var/lib/sks/DB_prev
  215. systemctl enable sks
  216. systemctl start sks
  217. nginx_ensite "$KEYSERVER_DOMAIN_NAME"
  218. }
  219. function backup_remote_keyserver {
  220. # remove any unused log files
  221. cd /var/lib/sks/DB || exit 734624
  222. db_archive -d
  223. source_directory=/etc/sks
  224. if [ -d $source_directory ]; then
  225. systemctl stop sks
  226. dest_directory=keyserverconfig
  227. function_check backup_directory_to_friend
  228. backup_directory_to_friend $source_directory $dest_directory
  229. systemctl start sks
  230. fi
  231. if [[ "$(check_keyserver_directory_size)" != "0" ]]; then
  232. echo $'WARNING: Keyserver database size is too large to backup'
  233. return
  234. fi
  235. source_directory=/var/lib/sks/DB
  236. if [ -d $source_directory ]; then
  237. systemctl stop sks
  238. dest_directory=keyserver
  239. function_check backup_directory_to_friend
  240. backup_directory_to_friend $source_directory $dest_directory
  241. systemctl start sks
  242. fi
  243. }
  244. function restore_remote_keyserver {
  245. if [ ! -d /var/lib/sks/DB ]; then
  246. return
  247. fi
  248. echo $"Restoring SKS Keyserver"
  249. systemctl stop sks
  250. temp_restore_dir=/root/tempkeyserverconfig
  251. function_check restore_directory_from_friend
  252. restore_directory_from_friend $temp_restore_dir keyserverconfig
  253. if [ -d $temp_restore_dir/etc/sks ]; then
  254. cp -r $temp_restore_dir/etc/sks/* /etc/sks/
  255. else
  256. cp -r $temp_restore_dir/* /etc/sks/
  257. fi
  258. rm -rf $temp_restore_dir
  259. chown -Rc debian-sks: /etc/sks/sksconf
  260. chown -Rc debian-sks: /etc/sks/mailsync
  261. temp_restore_dir=/root/tempkeyserver
  262. function_check restore_directory_from_friend
  263. restore_directory_from_friend $temp_restore_dir keyserver
  264. mv /var/lib/sks/DB /var/lib/sks/DB_prev
  265. if [ -d $temp_restore_dir/var/lib/sks/DB ]; then
  266. cp -r $temp_restore_dir/var/lib/sks/DB /var/lib/sks/DB
  267. else
  268. if [ ! -d /var/lib/sks/DB ]; then
  269. mkdir /var/lib/sks/DB
  270. fi
  271. cp -r $temp_restore_dir/* /var/lib/sks/DB
  272. fi
  273. # shellcheck disable=SC2181
  274. if [ ! "$?" = "0" ]; then
  275. # restore the old database
  276. rm -rf /var/lib/sks/DB
  277. mv /var/lib/sks/DB_prev /var/lib/sks/DB
  278. rm -rf $temp_restore_dir
  279. function_check set_user_permissions
  280. set_user_permissions
  281. return
  282. fi
  283. rm -rf $temp_restore_dir
  284. chown -Rc debian-sks: /var/lib/sks
  285. # remove the old database
  286. rm -rf /var/lib/sks/DB_prev
  287. systemctl enable sks
  288. systemctl start sks
  289. nginx_ensite "$KEYSERVER_DOMAIN_NAME"
  290. }
  291. function remove_keyserver {
  292. systemctl stop sks
  293. if [ -f /etc/cron.hourly/keyserver-watchdog ]; then
  294. rm /etc/cron.hourly/keyserver-watchdog
  295. fi
  296. apt-get -qy remove sks dirmngr
  297. read_config_param "KEYSERVER_DOMAIN_NAME"
  298. nginx_dissite "$KEYSERVER_DOMAIN_NAME"
  299. remove_certs "${KEYSERVER_DOMAIN_NAME}"
  300. if [ -f "/etc/nginx/sites-available/$KEYSERVER_DOMAIN_NAME" ]; then
  301. rm -f "/etc/nginx/sites-available/$KEYSERVER_DOMAIN_NAME"
  302. fi
  303. if [ -d "/var/www/$KEYSERVER_DOMAIN_NAME" ]; then
  304. rm -rf "/var/www/$KEYSERVER_DOMAIN_NAME"
  305. fi
  306. function_check remove_ddns_domain
  307. remove_ddns_domain "$KEYSERVER_DOMAIN_NAME"
  308. remove_config_param KEYSERVER_DOMAIN_NAME
  309. remove_config_param KEYSERVER_CODE
  310. function_check remove_onion_service
  311. remove_onion_service keyserver "${KEYSERVER_ONION_PORT}"
  312. remove_onion_service sks 11370 11371 11372
  313. remove_completion_param "install_keyserver"
  314. firewall_remove 11370 tcp
  315. firewall_remove 11371 tcp
  316. firewall_remove 11372 tcp
  317. sed -i '/keyserver/d' "$COMPLETION_FILE"
  318. sed -i '/sks onion/d' "$COMPLETION_FILE"
  319. if [ -d /var/lib/sks ]; then
  320. rm -rf /var/lib/sks
  321. fi
  322. }
  323. function install_interactive_keyserver {
  324. if [ ! "$ONION_ONLY" ]; then
  325. ONION_ONLY='no'
  326. fi
  327. if [[ $ONION_ONLY != "no" ]]; then
  328. KEYSERVER_DOMAIN_NAME='keyserver.local'
  329. write_config_param "KEYSERVER_DOMAIN_NAME" "$KEYSERVER_DOMAIN_NAME"
  330. else
  331. function_check interactive_site_details
  332. interactive_site_details "keyserver" "KEYSERVER_DOMAIN_NAME" "KEYSERVER_CODE"
  333. fi
  334. APP_INSTALLED=1
  335. }
  336. function keyserver_create_mailsync {
  337. echo $"# List of email addresses which submitted keys will be forwarded to" > /etc/sks/mailsync
  338. echo '' >> /etc/sks/mailsync
  339. chown -Rc debian-sks: /etc/sks/mailsync
  340. }
  341. function keyserver_create_membership {
  342. if [ -f /etc/sks/membership ]; then
  343. return
  344. fi
  345. systemctl stop sks
  346. { echo $"# List of other $PROJECT_NAME SKS Keyservers to sync with.";
  347. echo '#';
  348. echo $"# Don't add major keyservers here, because it will take an";
  349. echo $'# Infeasible amount of time to sync and backups will become';
  350. echo $'# absurdly long and probably break your system. You have been warned.';
  351. echo ''; } > /etc/sks/membership
  352. chown -Rc debian-sks: /etc/sks/membership
  353. systemctl start sks
  354. }
  355. function keyserver_import_keys {
  356. # NOTE: this function isn't used, but kept for reference
  357. dialog --title $"Import public keys database" \
  358. --backtitle $"Freedombone Control Panel" \
  359. --defaultno \
  360. --yesno $"\\nThis will download many gigabytes of data and so depending on your bandwidth it could take several days.\\n\\nContinue?" 10 60
  361. sel=$?
  362. case $sel in
  363. 1) return;;
  364. 255) return;;
  365. esac
  366. if [ ! -d /var/lib/sks/dump ]; then
  367. mkdir -p /var/lib/sks/dump
  368. fi
  369. cd /var/lib/sks/dump || exit 59242684
  370. echo $'Getting keyserver dump. This may take a few days or longer, so be patient.'
  371. rm -rf /var/lib/sks/dump/*
  372. KEYSERVER_DUMP_URL="https://keyserver.mattrude.com/dump/$(date +%F)/"
  373. wget -crp -e robots=off --level=1 --cut-dirs=3 -nH \
  374. -A pgp,txt "$KEYSERVER_DUMP_URL"
  375. cd /var/lib/sks || exit 936572424
  376. echo $'Building the keyserver database from the downloaded dump'
  377. keyserver_reset_database
  378. }
  379. function keyserver_sync {
  380. data=$(mktemp 2>/dev/null)
  381. dialog --backtitle $"Freedombone Control Panel" \
  382. --title $"Sync with other keyserver" \
  383. --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 \
  384. $"Domain:" 1 1 "" 1 25 32 64 \
  385. $"Port:" 2 1 "11370" 2 25 6 6 \
  386. $"Sync Email (optional):" 3 1 "pgp-public-keys@" 3 25 32 64 \
  387. 2> "$data"
  388. sel=$?
  389. case $sel in
  390. 1) rm -f "$data"
  391. return;;
  392. 255) rm -f "$data"
  393. return;;
  394. esac
  395. other_keyserver_domain=$(sed -n 1p < "$data")
  396. other_keyserver_port=$(sed -n 2p < "$data")
  397. other_keyserver_email=$(sed -n 3p < "$data")
  398. rm -f "$data"
  399. if [[ "$other_keyserver_domain" != *'.'* ]]; then
  400. return
  401. fi
  402. if [[ "$other_keyserver_domain" == *' '* ]]; then
  403. return
  404. fi
  405. if [[ "$other_keyserver_port" == *'.'* ]]; then
  406. return
  407. fi
  408. if [[ "$other_keyserver_port" == *' '* ]]; then
  409. return
  410. fi
  411. if [ ${#other_keyserver_domain} -lt 4 ]; then
  412. return
  413. fi
  414. if [ ${#other_keyserver_port} -lt 4 ]; then
  415. return
  416. fi
  417. # Warn if trying to sync
  418. if [[ "$other_keyserver_domain" == *"sks-keyservers.net" || "$other_keyserver_domain" == *"gnupg.net" || "$other_keyserver_domain" == *"pgp.com" || "$other_keyserver_domain" == *"pgp.mit.edu" || "$other_keyserver_domain" == *"the.earth.li" || "$other_keyserver_domain" == *"mayfirst.org" || "$other_keyserver_domain" == *"ubuntu.com" ]]; then
  419. dialog --title $"Sync with other keyserver" \
  420. --msgbox $"\\nDon't try to sync with the major keyservers. Your system will be overloaded with an infeasible database size." 8 60
  421. return
  422. fi
  423. if [[ "$other_keyserver_email" != "pgp-public-keys@" ]]; then
  424. if [[ "$other_keyserver_email" == *"@"* ]]; then
  425. if [[ "$other_keyserver_email" == *"."* ]]; then
  426. keyserver_create_mailsync
  427. if ! grep -q "$other_keyserver_email" /etc/sks/mailsync; then
  428. echo "$other_keyserver_email" >> /etc/sks/mailsync
  429. chown -Rc debian-sks: /etc/sks/mailsync
  430. fi
  431. else
  432. dialog --title $"Sync with other keyserver" \
  433. --msgbox $"Email doesn't look right: $other_keyserver_email" 6 60
  434. return
  435. fi
  436. fi
  437. fi
  438. keyserver_create_membership
  439. if grep -q "$other_keyserver_domain $other_keyserver_port" /etc/sks/membership; then
  440. return
  441. fi
  442. if grep -q "$other_keyserver_domain " /etc/sks/membership; then
  443. sed -i "s|$other_keyserver_domain .*|$other_keyserver_domain $other_keyserver_port|g" /etc/sks/membership
  444. else
  445. echo "$other_keyserver_domain $other_keyserver_port" >> /etc/sks/membership
  446. fi
  447. chown -Rc debian-sks: /etc/sks/membership
  448. systemctl restart sks
  449. dialog --title $"Sync with other keyserver" \
  450. --msgbox $"Keyserver added" 6 40
  451. }
  452. function keyserver_edit {
  453. if [ ! -f /etc/sks/membership ]; then
  454. return
  455. fi
  456. editor /etc/sks/membership
  457. chown -Rc debian-sks: /etc/sks/membership
  458. systemctl restart sks
  459. }
  460. function keyserver_remove_key {
  461. data=$(mktemp 2>/dev/null)
  462. dialog --title $"Remove a key" \
  463. --backtitle $"Freedombone Control Panel" \
  464. --inputbox $"Enter the ID of the key which you wish to remove:" 12 60 2>"$data"
  465. sel=$?
  466. case $sel in
  467. 0)
  468. remove_key_id=$(<"$data")
  469. if [ ${#remove_key_id} -gt 8 ]; then
  470. sks drop "$remove_key_id"
  471. dialog --title $"Remove a key" \
  472. --msgbox $"The key was removed" 6 40
  473. fi
  474. ;;
  475. esac
  476. rm -f "$data"
  477. }
  478. function configure_interactive_keyserver {
  479. while true
  480. do
  481. data=$(mktemp 2>/dev/null)
  482. dialog --backtitle $"Freedombone Control Panel" \
  483. --title $"SKS Keyserver" \
  484. --radiolist $"Choose an operation:" 12 70 4 \
  485. 1 $"Remove a key" off \
  486. 2 $"Sync with other keyserver" off \
  487. 3 $"Edit sync keyservers" off \
  488. 4 $"Exit" on 2> "$data"
  489. sel=$?
  490. case $sel in
  491. 1) rm -f "$data"
  492. return;;
  493. 255) rm -f "$data"
  494. return;;
  495. esac
  496. case $(cat "$data") in
  497. 1) keyserver_remove_key;;
  498. 2) keyserver_sync;;
  499. 3) keyserver_edit;;
  500. 4) rm -f "$data"
  501. break;;
  502. esac
  503. rm -f "$data"
  504. done
  505. }
  506. function install_keyserver {
  507. apt-get -qy install build-essential gcc ocaml libdb-dev wget sks
  508. keyserver_reset_database
  509. sed -i 's|initstart=.*|initstart=yes|g' /etc/default/sks
  510. apt-get -qy install dirmngr
  511. systemctl restart sks
  512. if [ ! -d /var/www/$KEYSERVER_DOMAIN_NAME ]; then
  513. mkdir /var/www/$KEYSERVER_DOMAIN_NAME
  514. fi
  515. cd "/var/www/$KEYSERVER_DOMAIN_NAME" || exit 25427642847
  516. if [ -d /var/www/$KEYSERVER_DOMAIN_NAME/htdocs ]; then
  517. rm -rf /var/www/$KEYSERVER_DOMAIN_NAME/htdocs
  518. fi
  519. if [ -d /repos/keyserverweb ]; then
  520. mkdir htdocs
  521. cp -r -p /repos/keyserverweb/. htdocs
  522. cd htdocs || exit 379584659
  523. git pull
  524. else
  525. git_clone $KEYSERVER_WEB_REPO htdocs
  526. fi
  527. if [ ! -d /var/www/$KEYSERVER_DOMAIN_NAME/htdocs ]; then
  528. echo $"/var/www/$KEYSERVER_DOMAIN_NAME/htdocs not found"
  529. exit 6539230
  530. fi
  531. cd "/var/www/$KEYSERVER_DOMAIN_NAME/htdocs" || exit 264824528
  532. git checkout $KEYSERVER_WEB_COMMIT -b $KEYSERVER_WEB_COMMIT
  533. set_completion_param "keyserver web commit" "$KEYSERVER_WEB_COMMIT"
  534. USER_EMAIL_ADDRESS=$MY_USERNAME@$HOSTNAME
  535. GPG_ID=$(su -m root -c "gpg --list-keys \"$USER_EMAIL_ADDRESS\" | sed -n '2p' | sed 's/^[ \\t]*//'" - "$MY_USERNAME")
  536. if [ ! "$GPG_ID" ]; then
  537. echo $'No GPG ID for admin user'
  538. exit 846336
  539. fi
  540. if [ ${#GPG_ID} -lt 5 ]; then
  541. echo $'GPG ID not retrieved for admin user'
  542. exit 835292
  543. fi
  544. if [[ "$GPG_ID" == *"error"* ]]; then
  545. echo $'GPG ID not retrieved for admin user due to error'
  546. exit 74825
  547. fi
  548. sed -i "s|###ENTERPUBLICKEYHERE###|$GPG_ID|g" /var/www/$KEYSERVER_DOMAIN_NAME/htdocs/404.html
  549. sed -i "s|###ENTERPUBLICKEYHERE###|$GPG_ID|g" /var/www/$KEYSERVER_DOMAIN_NAME/htdocs/index.html
  550. sed -i "s|###ENTERNAMEHERE###|$USER_EMAIL_ADDRESS|g" /var/www/$KEYSERVER_DOMAIN_NAME/htdocs/404.html
  551. sed -i "s|###ENTERNAMEHERE###|$USER_EMAIL_ADDRESS|g" /var/www/$KEYSERVER_DOMAIN_NAME/htdocs/index.html
  552. sksconf_file=/etc/sks/sksconf
  553. sed -i "s|#hostname:.*|hostname: $KEYSERVER_DOMAIN_NAME|g" $sksconf_file
  554. sed -i "s|hostname:.*|hostname: $KEYSERVER_DOMAIN_NAME|g" $sksconf_file
  555. sed -i "s|#hkp_port:.*|hkp_port: 11373|g" $sksconf_file
  556. sed -i "s|hkp_port:.*|hkp_port: 11373|g" $sksconf_file
  557. sed -i "s|#recon_port:.*|recon_port: 11370|g" $sksconf_file
  558. sed -i "s|recon_port:.*|recon_port: 11370|g" $sksconf_file
  559. sed -i "s|#recon_address:.*|recon_address: 0.0.0.0|g" $sksconf_file
  560. sed -i "s|recon_address:.*|recon_address: 0.0.0.0|g" $sksconf_file
  561. sed -i 's|#hkp_address:.*|hkp_address: 127.0.0.1|g' $sksconf_file
  562. sed -i 's|hkp_address:.*|hkp_address: 127.0.0.1|g' $sksconf_file
  563. sed -i "s|#from_addr:.*|from_addr: \"pgp-public-keys@$DEFAULT_DOMAIN_NAME\"|g" $sksconf_file
  564. sed -i "s|from_addr:.*|from_addr: \"pgp-public-keys@$DEFAULT_DOMAIN_NAME\"|g" $sksconf_file
  565. sed -i 's|#sendmail_cmd:|sendmail_cmd:|g' $sksconf_file
  566. if ! grep -q "#disable_mailsync" $sksconf_file; then
  567. echo '#disable_mailsync:' >> $sksconf_file
  568. else
  569. sed -i 's|disable_mailsync:|#disable_mailsync:|g' $sksconf_file
  570. fi
  571. if ! grep -q "membership_reload_interval:" $sksconf_file; then
  572. echo 'membership_reload_interval: 1' >> $sksconf_file
  573. else
  574. sed -i 's|#membership_reload_interval:.*|membership_reload_interval: 1|g' $sksconf_file
  575. sed -i 's|membership_reload_interval:.*|membership_reload_interval: 1|g' $sksconf_file
  576. fi
  577. if ! grep -q "max_matches:" $sksconf_file; then
  578. echo 'max_matches: 50' >> $sksconf_file
  579. else
  580. sed -i 's|#max_matches:.*|max_matches: 50|g' $sksconf_file
  581. sed -i 's|max_matches:.*|max_matches: 50|g' $sksconf_file
  582. fi
  583. if ! grep -q "stat_hour:" $sksconf_file; then
  584. echo "stat_hour: $((1 + RANDOM % 8))" >> $sksconf_file
  585. else
  586. sed -i "s|#stat_hour:.*|stat_hour: $((1 + RANDOM % 8))|g" $sksconf_file
  587. sed -i "s|stat_hour:.*|stat_hour: $((1 + RANDOM % 8))|g" $sksconf_file
  588. fi
  589. if ! grep -q "disable_log_diffs:" $sksconf_file; then
  590. echo "disable_log_diffs:" >> $sksconf_file
  591. else
  592. sed -i "s|#disable_log_diffs:.*|disable_log_diffs:|g" $sksconf_file
  593. sed -i "s|disable_log_diffs:.*|disable_log_diffs:|g" $sksconf_file
  594. fi
  595. if ! grep -q "debuglevel:" $sksconf_file; then
  596. echo "debuglevel: 0" >> $sksconf_file
  597. else
  598. sed -i "s|#debuglevel:.*|debuglevel: 0|g" $sksconf_file
  599. sed -i "s|debuglevel:.*|debuglevel: 0|g" $sksconf_file
  600. fi
  601. chown debian-sks: $sksconf_file
  602. if ! grep -q "hidden_service_sks" /etc/tor/torrc; then
  603. { echo 'HiddenServiceDir /var/lib/tor/hidden_service_sks/';
  604. echo 'HiddenServiceVersion 3';
  605. echo "HiddenServicePort 11370 127.0.0.1:11370";
  606. echo "HiddenServicePort 11373 127.0.0.1:11371";
  607. echo "HiddenServicePort 11372 127.0.0.1:11372"; } >> /etc/tor/torrc
  608. echo $'Added onion site for sks'
  609. fi
  610. onion_update
  611. wait_for_onion_service 'sks'
  612. if [ ! -f /var/lib/tor/hidden_service_sks/hostname ]; then
  613. echo $'sks onion site hostname not found'
  614. exit 8352982
  615. fi
  616. SKS_ONION_HOSTNAME=$(cat /var/lib/tor/hidden_service_sks/hostname)
  617. KEYSERVER_ONION_HOSTNAME=$(add_onion_service keyserver 80 ${KEYSERVER_ONION_PORT})
  618. keyserver_nginx_site=/etc/nginx/sites-available/$KEYSERVER_DOMAIN_NAME
  619. if [[ $ONION_ONLY == "no" ]]; then
  620. # NOTE: without http active on port 80 the keyserver doesn't work
  621. # from the commandline
  622. { echo 'server {';
  623. echo ' listen 80;';
  624. echo ' listen 0.0.0.0:11371;';
  625. echo ' listen [::]:80;';
  626. echo " server_name $KEYSERVER_DOMAIN_NAME;";
  627. echo '';
  628. echo ' # Logs';
  629. echo ' access_log /dev/null;';
  630. echo ' error_log /dev/null;';
  631. echo '';
  632. echo ' # Root';
  633. echo " root /var/www/$KEYSERVER_DOMAIN_NAME/htdocs;";
  634. echo '';
  635. echo ' rewrite ^/stats /pks/lookup?op=stats;';
  636. echo " rewrite ^/s/(.*) /pks/lookup?search=\$1;";
  637. echo " rewrite ^/search/(.*) /pks/lookup?search=\$1;";
  638. echo " rewrite ^/g/(.*) /pks/lookup?op=get&search=\$1;";
  639. echo " rewrite ^/get/(.*) /pks/lookup?op=get&search=\$1;";
  640. echo " rewrite ^/d/(.*) /pks/lookup?op=get&options=mr&search=\$1;";
  641. echo " rewrite ^/download/(.*) /pks/lookup?op=get&options=mr&search=\$1;";
  642. echo '';
  643. echo ' location / {'; } > $keyserver_nginx_site
  644. function_check nginx_limits
  645. nginx_limits "$KEYSERVER_DOMAIN_NAME" '128k'
  646. { echo ' }';
  647. echo '';
  648. echo ' location /pks {';
  649. echo ' proxy_pass http://127.0.0.1:11373;';
  650. echo ' proxy_pass_header Server;';
  651. echo " add_header Via \"1.1 $KEYSERVER_DOMAIN_NAME:11371 (nginx)\";";
  652. echo ' proxy_ignore_client_abort on;';
  653. echo ' client_max_body_size 8m;';
  654. echo ' client_body_buffer_size 128k;';
  655. echo ' }';
  656. echo '}';
  657. echo '';
  658. echo 'server {';
  659. echo ' listen 443 ssl;';
  660. echo ' listen 0.0.0.0:11372 ssl;';
  661. echo ' #listen [::]:443 ssl;';
  662. echo " server_name $KEYSERVER_DOMAIN_NAME;";
  663. echo '';
  664. echo ' error_page 404 /404.html;';
  665. echo '';
  666. echo ' location ~ (.git|LICENSE|readme.md) {';
  667. echo ' deny all;';
  668. echo ' return 404;';
  669. echo ' }';
  670. echo '';
  671. echo ' # Security'; } >> $keyserver_nginx_site
  672. function_check nginx_ssl
  673. nginx_ssl $KEYSERVER_DOMAIN_NAME
  674. function_check nginx_security_options
  675. nginx_security_options $KEYSERVER_DOMAIN_NAME
  676. { echo ' add_header Strict-Transport-Security max-age=15768000;';
  677. echo '';
  678. echo ' # Logs';
  679. echo ' access_log /dev/null;';
  680. echo ' error_log /dev/null;';
  681. echo '';
  682. echo ' # Root';
  683. echo " root /var/www/$KEYSERVER_DOMAIN_NAME/htdocs;";
  684. echo '';
  685. echo ' rewrite ^/stats /pks/lookup?op=stats;';
  686. echo " rewrite ^/s/(.*) /pks/lookup?search=\$1;";
  687. echo " rewrite ^/search/(.*) /pks/lookup?search=\$1;";
  688. echo " rewrite ^/g/(.*) /pks/lookup?op=get&search=\$1;";
  689. echo " rewrite ^/get/(.*) /pks/lookup?op=get&search=\$1;";
  690. echo " rewrite ^/d/(.*) /pks/lookup?op=get&options=mr&search=\$1;";
  691. echo " rewrite ^/download/(.*) /pks/lookup?op=get&options=mr&search=\$1;";
  692. echo '';
  693. echo ' location / {'; } >> $keyserver_nginx_site
  694. function_check nginx_limits
  695. nginx_limits $KEYSERVER_DOMAIN_NAME '128k'
  696. { echo ' }';
  697. echo '';
  698. echo ' location /pks {';
  699. echo " proxy_pass http://127.0.0.1:11373;";
  700. echo ' proxy_pass_header Server;';
  701. echo " add_header Via \"1.1 $KEYSERVER_DOMAIN_NAME:11372 (nginx)\";";
  702. echo ' proxy_ignore_client_abort on;';
  703. echo ' client_max_body_size 8m;';
  704. echo ' client_body_buffer_size 128k;';
  705. echo ' }';
  706. echo '}';
  707. echo ''; } >> $keyserver_nginx_site
  708. else
  709. echo -n '' > $keyserver_nginx_site
  710. fi
  711. { echo 'server {';
  712. echo " listen 127.0.0.1:$KEYSERVER_ONION_PORT default_server;";
  713. echo " server_name $KEYSERVER_ONION_HOSTNAME;";
  714. echo '';
  715. echo ' error_page 404 /404.html;';
  716. echo '';
  717. echo ' location ~ (.git|LICENSE|readme.md) {';
  718. echo ' deny all;';
  719. echo ' return 404;';
  720. echo ' }';
  721. echo ''; } >> $keyserver_nginx_site
  722. function_check nginx_security_options
  723. nginx_security_options $KEYSERVER_DOMAIN_NAME
  724. { echo '';
  725. echo ' # Logs';
  726. echo ' access_log /dev/null;';
  727. echo ' error_log /dev/null;';
  728. echo '';
  729. echo ' # Root';
  730. echo " root /var/www/$KEYSERVER_DOMAIN_NAME/mail;";
  731. echo '';
  732. echo ' rewrite ^/stats /pks/lookup?op=stats;';
  733. echo " rewrite ^/s/(.*) /pks/lookup?search=\$1;";
  734. echo " rewrite ^/search/(.*) /pks/lookup?search=\$1;";
  735. echo " rewrite ^/g/(.*) /pks/lookup?op=get&search=\$1;";
  736. echo " rewrite ^/get/(.*) /pks/lookup?op=get&search=\$1;";
  737. echo " rewrite ^/d/(.*) /pks/lookup?op=get&options=mr&search=\$1;";
  738. echo " rewrite ^/download/(.*) /pks/lookup?op=get&options=mr&search=\$1;";
  739. echo '';
  740. echo ' location / {'; } >> $keyserver_nginx_site
  741. function_check nginx_limits
  742. nginx_limits $KEYSERVER_DOMAIN_NAME '128k'
  743. { echo ' }';
  744. echo '';
  745. echo ' location /pks {';
  746. echo " proxy_pass http://127.0.0.1:11373;";
  747. echo ' proxy_pass_header Server;';
  748. echo " add_header Via \"1.1 $KEYSERVER_DOMAIN_NAME:$KEYSERVER_ONION_PORT (nginx)\";";
  749. echo ' proxy_ignore_client_abort on;';
  750. echo ' client_max_body_size 8m;';
  751. echo ' client_body_buffer_size 128k;';
  752. echo ' }';
  753. echo '}'; } >> $keyserver_nginx_site
  754. function_check create_site_certificate
  755. if [ ! -f /etc/ssl/certs/${KEYSERVER_DOMAIN_NAME}.pem ]; then
  756. create_site_certificate $KEYSERVER_DOMAIN_NAME 'yes'
  757. fi
  758. if [ -f /etc/ssl/certs/${KEYSERVER_DOMAIN_NAME}.crt ]; then
  759. mv /etc/ssl/certs/${KEYSERVER_DOMAIN_NAME}.crt /etc/ssl/certs/${KEYSERVER_DOMAIN_NAME}.pem
  760. fi
  761. if [ -f /etc/ssl/certs/${KEYSERVER_DOMAIN_NAME}.pem ]; then
  762. chown root:root /etc/ssl/certs/${KEYSERVER_DOMAIN_NAME}.pem
  763. sed -i "s|.crt|.pem|g" /etc/nginx/sites-available/${KEYSERVER_DOMAIN_NAME}
  764. fi
  765. if [ -f /etc/ssl/private/${KEYSERVER_DOMAIN_NAME}.key ]; then
  766. chown root:root /etc/ssl/private/${KEYSERVER_DOMAIN_NAME}.key
  767. fi
  768. chown -R www-data:www-data /var/www/$KEYSERVER_DOMAIN_NAME/htdocs
  769. function_check nginx_ensite
  770. nginx_ensite $KEYSERVER_DOMAIN_NAME
  771. configure_firewall_for_keyserver
  772. # remove membership file - don't try to sync with other keyservers
  773. if [ -f /etc/sks/membership ]; then
  774. rm /etc/sks/membership
  775. fi
  776. if ! grep -q "pgp-public-keys" /etc/aliases; then
  777. echo 'pgp-public-keys: "|/usr/lib/sks/sks_add_mail /etc/sks"' >> /etc/aliases
  778. fi
  779. chown -Rc debian-sks: /etc/sks/mailsync
  780. systemctl enable sks
  781. systemctl restart sks
  782. systemctl restart nginx
  783. set_completion_param "keyserver domain" "$KEYSERVER_DOMAIN_NAME"
  784. set_completion_param "keyserver onion domain" "$KEYSERVER_ONION_HOSTNAME"
  785. set_completion_param "sks onion domain" "$SKS_ONION_HOSTNAME"
  786. keyserver_watchdog
  787. APP_INSTALLED=1
  788. }
  789. # NOTE: deliberately no exit 0