freedombone-app-keyserver 31KB

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