freedombone-utils-web 44KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108
  1. #!/bin/bash
  2. #
  3. # .---. . .
  4. # | | |
  5. # |--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-.
  6. # | | (.-' (.-' ( | ( )| | | | )( )| | (.-'
  7. # ' ' --' --' -' - -' ' ' -' -' -' ' - --'
  8. #
  9. # Freedom in the Cloud
  10. #
  11. # Web related functions
  12. #
  13. # License
  14. # =======
  15. #
  16. # Copyright (C) 2014-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. # default search engine for command line browser
  31. DEFAULT_SEARCH='https://searx.laquadrature.net'
  32. # onion port for the default domain
  33. DEFAULT_DOMAIN_ONION_PORT=8099
  34. # Whether Let's Encrypt is enabled for all sites
  35. LETSENCRYPT_ENABLED="yes"
  36. LETSENCRYPT_SERVER='https://acme-v01.api.letsencrypt.org/directory'
  37. # list of encryption protocols
  38. SSL_PROTOCOLS="TLSv1 TLSv1.1 TLSv1.2"
  39. # Mozilla recommended default ciphers. These work better on Android
  40. # See https://wiki.mozilla.org/Security/Server_Side_TLS
  41. SSL_CIPHERS="ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS"
  42. # some mobile apps (eg. NextCloud) have not very good cipher compatibility.
  43. # These ciphers can be used for those cases
  44. SSL_CIPHERS_MOBILE="ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES128-SHA"
  45. NGINX_ENSITE_REPO="https://github.com/perusio/nginx_ensite"
  46. NGINX_ENSITE_COMMIT='fa4d72ce1c0a490442c8474e9c8dc21ed52c93d0'
  47. # memory limit for php in MB
  48. MAX_PHP_MEMORY=64
  49. # logging level for Nginx
  50. WEBSERVER_LOG_LEVEL='warn'
  51. # test a domain name to see if it's valid
  52. function validate_domain_name {
  53. # count the number of dots in the domain name
  54. dots=${TEST_DOMAIN_NAME//[^.]}
  55. no_of_dots=${#dots}
  56. if (( no_of_dots > 3 )); then
  57. TEST_DOMAIN_NAME=$"The domain $TEST_DOMAIN_NAME has too many subdomains. It should be of the type w.x.y.z, x.y.z or y.z"
  58. fi
  59. if (( no_of_dots == 0 )); then
  60. TEST_DOMAIN_NAME=$"The domain $TEST_DOMAIN_NAME has no top level domain. It should be of the type w.x.y.z, x.y.z or y.z"
  61. fi
  62. }
  63. function nginx_security_options {
  64. domain_name=$1
  65. filename=/etc/nginx/sites-available/$domain_name
  66. { echo ' add_header X-Frame-Options DENY;';
  67. echo ' add_header X-Content-Type-Options nosniff;';
  68. echo ' add_header X-XSS-Protection "1; mode=block";';
  69. echo ' add_header X-Robots-Tag none;';
  70. echo ' add_header X-Download-Options noopen;';
  71. echo ' add_header X-Permitted-Cross-Domain-Policies none;';
  72. echo ''; } >> "$filename"
  73. }
  74. function nginx_limits {
  75. domain_name=$1
  76. max_body='20m'
  77. if [ "$2" ]; then
  78. max_body=$2
  79. fi
  80. filename=/etc/nginx/sites-available/$domain_name
  81. { echo " client_max_body_size ${max_body};";
  82. echo ' client_body_buffer_size 128k;';
  83. echo '';
  84. echo ' limit_conn conn_limit_per_ip 10;';
  85. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;';
  86. echo ''; } >> "$filename"
  87. }
  88. function nginx_stapling {
  89. domain_name="$1"
  90. filename=/etc/nginx/sites-available/$domain_name
  91. { echo " ssl_stapling on;";
  92. echo ' ssl_stapling_verify on;';
  93. echo " ssl_trusted_certificate /etc/ssl/certs/${domain_name}.pem;";
  94. echo ''; } >> "$filename"
  95. }
  96. function nginx_http_redirect {
  97. # redirect port 80 to https
  98. domain_name=$1
  99. filename=/etc/nginx/sites-available/$domain_name
  100. { echo 'server {';
  101. echo ' listen 80;';
  102. echo ' listen [::]:80;';
  103. echo " server_name ${domain_name};";
  104. echo " root /var/www/${domain_name}/htdocs;";
  105. echo ' access_log /dev/null;';
  106. echo " error_log /dev/null;"; } > "$filename"
  107. function_check nginx_limits
  108. nginx_limits "$domain_name"
  109. if [ ${#2} -gt 0 ]; then
  110. echo " $2;" >> "$filename"
  111. fi
  112. { echo " rewrite ^ https://\$server_name\$request_uri? permanent;";
  113. echo '}';
  114. echo ''; } >> "$filename"
  115. }
  116. function nginx_compress {
  117. domain_name=$1
  118. filename=/etc/nginx/sites-available/$domain_name
  119. { echo ' gzip on;';
  120. echo ' gzip_min_length 1000;';
  121. echo ' gzip_proxied expired no-cache no-store private auth;';
  122. echo ' gzip_types text/plain application/xml;'; } >> "$filename"
  123. }
  124. function nginx_ssl {
  125. # creates the SSL/TLS section for a website
  126. domain_name=$1
  127. mobile_ciphers=$2
  128. filename=/etc/nginx/sites-available/$domain_name
  129. { echo ' ssl_stapling off;';
  130. echo ' ssl_stapling_verify off;';
  131. echo ' ssl on;';
  132. echo " ssl_certificate /etc/letsencrypt/live/${domain_name}/fullchain.pem;";
  133. echo " ssl_certificate_key /etc/letsencrypt/live/${domain_name}/privkey.pem;";
  134. echo " ssl_dhparam /etc/ssl/certs/${domain_name}.dhparam;";
  135. echo '';
  136. echo ' ssl_session_cache builtin:1000 shared:SSL:10m;';
  137. echo ' ssl_session_timeout 60m;';
  138. echo ' ssl_prefer_server_ciphers on;';
  139. echo " ssl_protocols $SSL_PROTOCOLS;"; } >> "$filename"
  140. if [ "$mobile_ciphers" ]; then
  141. echo " # Mobile compatible ciphers" >> "$filename"
  142. echo " ssl_ciphers '$SSL_CIPHERS_MOBILE';" >> "$filename"
  143. else
  144. echo " ssl_ciphers '$SSL_CIPHERS';" >> "$filename"
  145. fi
  146. echo " add_header Content-Security-Policy \"default-src https:; script-src https: 'unsafe-inline'; style-src https: 'unsafe-inline'\";" >> "$filename"
  147. #nginx_stapling $1
  148. }
  149. # check an individual domain name
  150. function test_domain_name {
  151. if [ "$1" ]; then
  152. TEST_DOMAIN_NAME=$1
  153. if [[ $TEST_DOMAIN_NAME != 'ttrss' ]]; then
  154. function_check validate_domain_name
  155. validate_domain_name
  156. if [[ "$TEST_DOMAIN_NAME" != "$1" ]]; then
  157. echo $"Invalid domain name $TEST_DOMAIN_NAME"
  158. exit 8528
  159. fi
  160. fi
  161. fi
  162. }
  163. # Checks whether certificates were generated for the given hostname
  164. function check_certificates {
  165. if [ ! "$1" ]; then
  166. echo $'No certificate name provided'
  167. exit 3568736585683
  168. fi
  169. USE_LETSENCRYPT='no'
  170. if [ "$2" ]; then
  171. USE_LETSENCRYPT="$2"
  172. fi
  173. if [[ $USE_LETSENCRYPT == 'no' || "$ONION_ONLY" != 'no' ]]; then
  174. if [ ! -f "/etc/ssl/private/${1}.key" ]; then
  175. echo $"Private certificate for ${CHECK_HOSTNAME} was not created"
  176. exit 63959
  177. fi
  178. if [ ! -f "/etc/ssl/certs/${1}.crt" ]; then
  179. echo $"Public certificate for ${CHECK_HOSTNAME} was not created"
  180. exit 7679
  181. fi
  182. if grep -q "${1}.pem" "/etc/nginx/sites-available/${1}"; then
  183. sed -i "s|${1}.pem|${1}.crt|g" "/etc/nginx/sites-available/${1}"
  184. fi
  185. else
  186. if [ ! -f "/etc/letsencrypt/live/${1}/privkey.pem" ]; then
  187. echo $"Private certificate for ${CHECK_HOSTNAME} was not created"
  188. exit 6282
  189. fi
  190. if [ ! -f "/etc/letsencrypt/live/${1}/fullchain.pem" ]; then
  191. echo $"Public certificate for ${CHECK_HOSTNAME} was not created"
  192. exit 5328
  193. fi
  194. if grep -q "${1}.crt" "/etc/nginx/sites-available/${1}"; then
  195. sed -i "s|${1}.crt|${1}.pem|g" "/etc/nginx/sites-available/${1}"
  196. fi
  197. fi
  198. if [ ! -f "/etc/ssl/certs/${1}.dhparam" ]; then
  199. echo $"DiffieHellman parameters for ${CHECK_HOSTNAME} were not created"
  200. exit 5989
  201. fi
  202. }
  203. function cert_exists {
  204. cert_type='dhparam'
  205. if [ "$2" ]; then
  206. cert_type="$2"
  207. fi
  208. if [ -f "/etc/ssl/certs/${1}.${cert_type}" ]; then
  209. echo "1"
  210. else
  211. if [ -f "/etc/letsencrypt/live/${1}/fullchain.${cert_type}" ]; then
  212. echo "1"
  213. else
  214. echo "0"
  215. fi
  216. fi
  217. }
  218. function create_self_signed_cert {
  219. if [ ! "${SITE_DOMAIN_NAME}" ]; then
  220. echo $'No site domain specified for self signed cert'
  221. exit 4638565385
  222. fi
  223. "${PROJECT_NAME}-addcert" -h "${SITE_DOMAIN_NAME}" --dhkey "${DH_KEYLENGTH}"
  224. function_check check_certificates
  225. check_certificates "${SITE_DOMAIN_NAME}"
  226. }
  227. function create_letsencrypt_cert {
  228. if [ ! "${SITE_DOMAIN_NAME}" ]; then
  229. echo $'No site domain specified for letsencrypt cert'
  230. exit 246824624
  231. fi
  232. if ! "${PROJECT_NAME}-addcert" -e "${SITE_DOMAIN_NAME}" -s "${LETSENCRYPT_SERVER}" --dhkey "${DH_KEYLENGTH}" --email "${MY_EMAIL_ADDRESS}"; then
  233. if [[ ${NO_SELF_SIGNED} == 'no' ]]; then
  234. echo $"Lets Encrypt failed for ${SITE_DOMAIN_NAME}, so try making a self-signed cert"
  235. "${PROJECT_NAME}-addcert" -h "${SITE_DOMAIN_NAME}" --dhkey "${DH_KEYLENGTH}"
  236. function_check check_certificates
  237. CHECK_HOSTNAME="${SITE_DOMAIN_NAME}"
  238. check_certificates "${SITE_DOMAIN_NAME}"
  239. else
  240. echo $"Lets Encrypt failed for $SITE_DOMAIN_NAME"
  241. if [ -f "/etc/nginx/sites-available/$SITE_DOMAIN_NAME" ]; then
  242. nginx_dissite "$SITE_DOMAIN_NAME"
  243. systemctl restart nginx
  244. fi
  245. exit 682529
  246. fi
  247. return
  248. fi
  249. function_check check_certificates
  250. CHECK_HOSTNAME="${SITE_DOMAIN_NAME}"
  251. check_certificates "${SITE_DOMAIN_NAME}" 'yes'
  252. }
  253. function create_site_certificate {
  254. SITE_DOMAIN_NAME="$1"
  255. # if yes then only "valid" certs are allowed, not self-signed
  256. NO_SELF_SIGNED='no'
  257. if [ "$2" ]; then
  258. NO_SELF_SIGNED="$2"
  259. fi
  260. if [[ $ONION_ONLY == "no" ]]; then
  261. if [[ "$(cert_exists "${SITE_DOMAIN_NAME}")" == "0" ]]; then
  262. if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
  263. create_self_signed_cert
  264. else
  265. create_letsencrypt_cert
  266. fi
  267. else
  268. if [[ $LETSENCRYPT_ENABLED == "yes" ]]; then
  269. if [[ "$(cert_exists "${SITE_DOMAIN_NAME}" pem)" == "0" ]]; then
  270. create_letsencrypt_cert
  271. fi
  272. fi
  273. fi
  274. fi
  275. }
  276. # script to automatically renew any Let's Encrypt certificates
  277. function letsencrypt_renewals {
  278. if [[ $ONION_ONLY != "no" ]]; then
  279. return
  280. fi
  281. renewals_script=/tmp/renewals_letsencrypt
  282. renewals_retry_script=/tmp/renewals_retry_letsencrypt
  283. renewal_failure_msg=$'The certificate for $LETSENCRYPT_DOMAIN could not be renewed'
  284. renewal_email_title=$'${PROJECT_NAME} Lets Encrypt certificate renewal'
  285. # the main script tries to renew once per month
  286. { echo '#!/bin/bash';
  287. echo '';
  288. echo "PROJECT_NAME='${PROJECT_NAME}'";
  289. echo "COMPLETION_FILE=\$HOME/\${PROJECT_NAME}-completed.txt";
  290. echo '';
  291. echo 'if [ -d /etc/letsencrypt ]; then';
  292. echo ' if [ -f ~/letsencrypt_failed ]; then';
  293. echo ' rm ~/letsencrypt_failed';
  294. echo ' fi';
  295. echo -n " ADMIN_USERNAME=\$(cat \$COMPLETION_FILE | grep \"Admin user\" | ";
  296. echo -n "awk -F ':' '{print ";
  297. echo -n "\$2";
  298. echo "}')";
  299. echo " ADMIN_EMAIL_ADDRESS=\$ADMIN_USERNAME@\$HOSTNAME";
  300. echo ' for d in /etc/letsencrypt/live/*/ ; do';
  301. echo -n " LETSENCRYPT_DOMAIN=\$(echo \"\$d\" | ";
  302. echo -n "awk -F '/' '{print ";
  303. echo -n "\$5";
  304. echo "}')";
  305. echo " if [ -f /etc/nginx/sites-available/\$LETSENCRYPT_DOMAIN ]; then";
  306. echo " \${PROJECT_NAME}-renew-cert -h \$LETSENCRYPT_DOMAIN -p letsencrypt";
  307. echo ' if [ ! "$?" = "0" ]; then';
  308. echo " echo \"${renewal_failure_msg}\" > ~/temp_renewletsencrypt.txt";
  309. echo ' echo "" >> ~/temp_renewletsencrypt.txt';
  310. echo " \${PROJECT_NAME}-renew-cert -h \$LETSENCRYPT_DOMAIN -p letsencrypt 2>> ~/temp_renewletsencrypt.txt";
  311. echo -n " cat ~/temp_renewletsencrypt.txt | mail -s \"${renewal_email_title}\" ";
  312. echo "\$ADMIN_EMAIL_ADDRESS";
  313. echo ' rm ~/temp_renewletsencrypt.txt';
  314. echo ' if [ ! -f ~/letsencrypt_failed ]; then';
  315. echo ' touch ~/letsencrypt_failed';
  316. echo ' fi';
  317. echo ' fi';
  318. echo ' fi';
  319. echo ' done';
  320. echo 'fi'; } > "$renewals_script"
  321. chmod +x "$renewals_script"
  322. if [ ! -f /etc/cron.monthly/letsencrypt ]; then
  323. cp $renewals_script /etc/cron.monthly/letsencrypt
  324. else
  325. HASH1=$(sha256sum $renewals_script | awk -F ' ' '{print $1}')
  326. HASH2=$(sha256sum /etc/cron.monthly/letsencrypt | awk -F ' ' '{print $1}')
  327. if [[ "$HASH1" != "$HASH2" ]]; then
  328. cp $renewals_script /etc/cron.monthly/letsencrypt
  329. fi
  330. fi
  331. rm $renewals_script
  332. # a secondary script keeps trying to renew after a failure
  333. { echo '#!/bin/bash';
  334. echo '';
  335. echo "PROJECT_NAME='${PROJECT_NAME}'";
  336. echo "COMPLETION_FILE=\$HOME/\${PROJECT_NAME}-completed.txt";
  337. echo '';
  338. echo 'if [ -d /etc/letsencrypt ]; then';
  339. echo ' if [ -f ~/letsencrypt_failed ]; then';
  340. echo ' rm ~/letsencrypt_failed';
  341. echo -n " ADMIN_USERNAME=\$(cat \$COMPLETION_FILE | grep \"Admin user\" | ";
  342. echo -n "awk -F ':' '{print ";
  343. echo -n "\$2";
  344. echo "}')";
  345. echo " ADMIN_EMAIL_ADDRESS=\$ADMIN_USERNAME@\$HOSTNAME";
  346. echo ' for d in /etc/letsencrypt/live/*/ ; do';
  347. echo -n " LETSENCRYPT_DOMAIN=\$(echo \"\$d\" | ";
  348. echo -n "awk -F '/' '{print ";
  349. echo -n "\$5";
  350. echo "}')";
  351. echo " if [ -f /etc/nginx/sites-available/\$LETSENCRYPT_DOMAIN ]; then";
  352. echo " \${PROJECT_NAME}-renew-cert -h \$LETSENCRYPT_DOMAIN -p letsencrypt";
  353. echo ' if [ ! "$?" = "0" ]; then';
  354. echo " echo \"${renewal_failure_msg}\" > ~/temp_renewletsencrypt.txt";
  355. echo ' echo "" >> ~/temp_renewletsencrypt.txt';
  356. echo " \${PROJECT_NAME}-renew-cert -h \$LETSENCRYPT_DOMAIN -p letsencrypt 2>> ~/temp_renewletsencrypt.txt";
  357. echo -n " cat ~/temp_renewletsencrypt.txt | mail -s \"${renewal_email_title}\" ";
  358. echo "\$ADMIN_EMAIL_ADDRESS";
  359. echo ' rm ~/temp_renewletsencrypt.txt';
  360. echo ' if [ ! -f ~/letsencrypt_failed ]; then';
  361. echo ' touch ~/letsencrypt_failed';
  362. echo ' fi';
  363. echo ' fi';
  364. echo ' fi';
  365. echo ' done';
  366. echo ' fi';
  367. echo 'fi'; } > "$renewals_retry_script"
  368. chmod +x "$renewals_retry_script"
  369. if [ ! -f /etc/cron.daily/letsencrypt ]; then
  370. cp $renewals_retry_script /etc/cron.daily/letsencrypt
  371. else
  372. HASH1=$(sha256sum $renewals_retry_script | awk -F ' ' '{print $1}')
  373. HASH2=$(sha256sum /etc/cron.daily/letsencrypt | awk -F ' ' '{print $1}')
  374. if [[ "$HASH1" != "$HASH2" ]]; then
  375. cp $renewals_retry_script /etc/cron.daily/letsencrypt
  376. fi
  377. fi
  378. rm $renewals_retry_script
  379. }
  380. function configure_php {
  381. sed -i "s/memory_limit =.*/memory_limit = ${MAX_PHP_MEMORY}M/g" /etc/php/7.0/fpm/php.ini
  382. sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php/7.0/fpm/php.ini
  383. sed -i "s/memory_limit =.*/memory_limit = ${MAX_PHP_MEMORY}M/g" /etc/php/7.0/cli/php.ini
  384. sed -i "s/upload_max_filesize =.*/upload_max_filesize = 50M/g" /etc/php/7.0/fpm/php.ini
  385. sed -i "s/upload_max_filesize =.*/upload_max_filesize = 50M/g" /etc/php/7.0/cli/php.ini
  386. sed -i "s/post_max_size =.*/post_max_size = 50M/g" /etc/php/7.0/fpm/php.ini
  387. }
  388. function install_web_server_access_control {
  389. if [ ! -f /etc/pam.d/nginx ]; then
  390. { echo '#%PAM-1.0';
  391. echo '@include common-auth';
  392. echo '@include common-account';
  393. echo '@include common-session'; } > /etc/pam.d/nginx
  394. fi
  395. }
  396. function install_dynamicdns {
  397. if [[ $SYSTEM_TYPE == "mesh"* ]]; then
  398. return
  399. fi
  400. if [[ $ONION_ONLY != "no" ]]; then
  401. return
  402. fi
  403. CURR_INADYN_COMMIT=$(get_completion_param "inadyn commit")
  404. if [[ "${CURR_INADYN_COMMIT}" == "${INADYN_COMMIT}" ]]; then
  405. return
  406. fi
  407. # update to the next commit
  408. function_check set_repo_commit
  409. set_repo_commit "$INSTALL_DIR/inadyn" "inadyn commit" "$INADYN_COMMIT" "$INADYN_REPO"
  410. if [[ $(is_completed "${FUNCNAME[0]}") == "1" ]]; then
  411. return
  412. fi
  413. # Here we compile from source because the current package
  414. # doesn't support https, which could result in passwords
  415. # being leaked
  416. # Debian version 1.99.4-1
  417. # https version 1.99.8
  418. apt-get -yq install build-essential curl libgnutls28-dev automake1.11
  419. if [ ! -d "$INSTALL_DIR/inadyn" ]; then
  420. if [ -d /repos/inadyn ]; then
  421. mkdir "$INSTALL_DIR/inadyn"
  422. cp -r -p /repos/inadyn/. "$INSTALL_DIR/inadyn"
  423. cd "$INSTALL_DIR/inadyn" || exit 2462874684
  424. git pull
  425. else
  426. git_clone "$INADYN_REPO" "$INSTALL_DIR/inadyn"
  427. fi
  428. fi
  429. if [ ! -d "$INSTALL_DIR/inadyn" ]; then
  430. echo 'inadyn repo not cloned'
  431. echo -n | openssl s_client -showcerts -connect github.com:443 -CApath /etc/ssl/certs
  432. exit 6785
  433. fi
  434. cd "$INSTALL_DIR/inadyn" || exit 246824684
  435. git checkout "$INADYN_COMMIT" -b "$INADYN_COMMIT"
  436. set_completion_param "inadyn commit" "$INADYN_COMMIT"
  437. #./autogen.sh
  438. if ! ./configure; then
  439. exit 74890
  440. fi
  441. if ! USE_OPENSSL=1 make; then
  442. exit 74858
  443. fi
  444. if ! make install; then
  445. exit 3785
  446. fi
  447. # create an unprivileged user
  448. #chmod 600 /etc/shadow
  449. #chmod 600 /etc/gshadow
  450. #useradd -r -s /bin/false debian-inadyn
  451. #chmod 0000 /etc/shadow
  452. #chmod 0000 /etc/gshadow
  453. # create a configuration file
  454. { echo 'background';
  455. echo 'verbose 1';
  456. echo 'period 300';
  457. echo 'startup-delay 60';
  458. echo 'cache-dir /run/inadyn';
  459. echo 'logfile /dev/null'; } > /etc/inadyn.conf
  460. chmod 600 /etc/inadyn.conf
  461. { echo '[Unit]';
  462. echo 'Description=inadyn (DynDNS updater)';
  463. echo 'After=network.target';
  464. echo '';
  465. echo '[Service]';
  466. echo 'ExecStart=/usr/local/sbin/inadyn --config /etc/inadyn.conf';
  467. echo 'Restart=always';
  468. echo 'Type=forking';
  469. echo '';
  470. echo '[Install]';
  471. echo 'WantedBy=multi-user.target'; } > /etc/systemd/system/inadyn.service
  472. systemctl enable inadyn
  473. systemctl start inadyn
  474. systemctl daemon-reload
  475. mark_completed "${FUNCNAME[0]}"
  476. }
  477. function update_default_search_engine {
  478. for d in /home/*/ ; do
  479. USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
  480. if [[ $(is_valid_user "$USERNAME") == "1" ]]; then
  481. if ! grep -q "WWW_HOME" "/home/$USERNAME/.bashrc"; then
  482. if ! grep -q 'controluser' "/home/$USERNAME/.bashrc"; then
  483. if ! grep -q 'export WWW_HOME=' "/home/$USERNAME/.bashrc"; then
  484. echo "export WWW_HOME=$DEFAULT_SEARCH" >> "/home/$USERNAME/.bashrc"
  485. else
  486. sed -i "s|export WWW_HOME=.*|export WWW_HOME=$DEFAULT_SEARCH|g" "/home/$USERNAME/.bashrc"
  487. fi
  488. else
  489. if ! grep -q 'export WWW_HOME=' "/home/$USERNAME/.bashrc"; then
  490. sed -i "/controluser/i export WWW_HOME=$DEFAULT_SEARCH" "/home/$USERNAME/.bashrc"
  491. else
  492. sed -i "s|export WWW_HOME=.*|export WWW_HOME=$DEFAULT_SEARCH|g" "/home/$USERNAME/.bashrc"
  493. fi
  494. fi
  495. fi
  496. fi
  497. done
  498. }
  499. function install_command_line_browser {
  500. if [[ $(is_completed "${FUNCNAME[0]}") == "1" ]]; then
  501. return
  502. fi
  503. apt-get -yq install elinks
  504. update_default_search_engine
  505. mark_completed "${FUNCNAME[0]}"
  506. }
  507. function mesh_web_server {
  508. if [ -d /etc/apache2 ]; then
  509. # shellcheck disable=SC2154
  510. chroot "$rootdir" apt-get -yq remove --purge apache2
  511. chroot "$rootdir" rm -rf /etc/apache2
  512. fi
  513. chroot "$rootdir" apt-get -yq install nginx
  514. if [ ! -d "$rootdir/etc/nginx" ]; then
  515. echo $'Unable to install web server'
  516. exit 346825
  517. fi
  518. }
  519. function install_web_server {
  520. if [ "$INSTALLING_MESH" ]; then
  521. mesh_web_server
  522. return
  523. fi
  524. # update to the next commit
  525. function_check set_repo_commit
  526. set_repo_commit "$INSTALL_DIR/nginx_ensite" "nginx-ensite commit" "$NGINX_ENSITE_COMMIT" $NGINX_ENSITE_REPO
  527. if [[ $(is_completed "${FUNCNAME[0]}") == "1" ]]; then
  528. return
  529. fi
  530. # remove apache
  531. apt-get -yq remove --purge apache2
  532. if [ -d /etc/apache2 ]; then
  533. rm -rf /etc/apache2
  534. fi
  535. # install nginx
  536. apt-get -yq install nginx
  537. apt-get -yq install php-fpm git
  538. # Turn off logs by default
  539. sed -i 's|access_log.*|access_log = /dev/null;|g' /etc/nginx/nginx.conf
  540. sed -i 's|error_log.*|error_log = /dev/null;|g' /etc/nginx/nginx.conf
  541. # limit the number of php processes
  542. sed -i 's/; process.max =.*/process.max = 32/g' /etc/php/7.0/fpm/php-fpm.conf
  543. #sed -i 's/;process_control_timeout =.*/process_control_timeout = 300/g' /etc/php/7.0/fpm/php-fpm.conf
  544. sed -i 's|;systemd_interval.*|systemd_interval = 10|g' /etc/php/7.0/fpm/php-fpm.conf
  545. sed -i 's|;emergency_restart_threshold.*|emergency_restart_threshold = 2|g' /etc/php/7.0/fpm/php-fpm.conf
  546. sed -i 's|emergency_restart_threshold.*|emergency_restart_threshold = 2|g' /etc/php/7.0/fpm/php-fpm.conf
  547. sed -i 's|;emergency_restart_interval.*|emergency_restart_interval = 1m|g' /etc/php/7.0/fpm/php-fpm.conf
  548. sed -i 's|emergency_restart_interval.*|emergency_restart_interval = 1m|g' /etc/php/7.0/fpm/php-fpm.conf
  549. sed -i 's|;process_control_timeout.*|process_control_timeout = 10s|g' /etc/php/7.0/fpm/php-fpm.conf
  550. sed -i 's|process_control_timeout.*|process_control_timeout = 10s|g' /etc/php/7.0/fpm/php-fpm.conf
  551. if ! grep -q "pm.max_children" /etc/php/7.0/fpm/php-fpm.conf; then
  552. { echo 'pm = static';
  553. echo 'pm.max_children = 10';
  554. echo 'pm.start_servers = 2';
  555. echo 'pm.min_spare_servers = 2';
  556. echo 'pm.max_spare_servers = 5';
  557. echo 'pm.max_requests = 10'; } >> /etc/php/7.0/fpm/php-fpm.conf
  558. fi
  559. if ! grep -q "request_terminate_timeout" /etc/php/7.0/fpm/php-fpm.conf; then
  560. echo 'request_terminate_timeout = 30' >> /etc/php/7.0/fpm/php-fpm.conf
  561. else
  562. sed -i 's|request_terminate_timeout =.*|request_terminate_timeout = 30|g' >> /etc/php/7.0/fpm/php-fpm.conf
  563. fi
  564. sed -i 's|max_execution_time =.*|max_execution_time = 30|g' /etc/php/7.0/fpm/php.ini
  565. if [ ! -d /etc/nginx ]; then
  566. echo $"ERROR: nginx does not appear to have installed. $CHECK_MESSAGE"
  567. exit 51
  568. fi
  569. # Nginx settings
  570. { echo 'user www-data;';
  571. #echo "worker_processes; $CPU_CORES";
  572. echo 'pid /run/nginx.pid;';
  573. echo '';
  574. echo 'events {';
  575. echo ' worker_connections 50;';
  576. echo ' # multi_accept on;';
  577. echo '}';
  578. echo '';
  579. echo 'http {';
  580. echo ' # limit the number of connections per single IP';
  581. echo " limit_conn_zone \$binary_remote_addr zone=conn_limit_per_ip:10m;";
  582. echo '';
  583. echo ' # limit the number of requests for a given session';
  584. echo " limit_req_zone \$binary_remote_addr zone=req_limit_per_ip:10m rate=140r/s;";
  585. echo '';
  586. echo ' # if the request body size is more than the buffer size, then the entire (or partial) request body is written into a temporary file';
  587. echo ' client_body_buffer_size 128k;';
  588. echo '';
  589. echo ' # headerbuffer size for the request header from client, its set for testing purpose';
  590. echo ' client_header_buffer_size 3m;';
  591. echo '';
  592. echo ' # maximum number and size of buffers for large headers to read from client request';
  593. echo ' large_client_header_buffers 4 256k;';
  594. echo '';
  595. echo ' # read timeout for the request body from client, its set for testing purpose';
  596. echo ' client_body_timeout 3m;';
  597. echo '';
  598. echo ' # how long to wait for the client to send a request header, its set for testing purpose';
  599. echo ' client_header_timeout 3m;';
  600. echo '';
  601. echo ' ##';
  602. echo ' # Basic Settings';
  603. echo ' ##';
  604. echo '';
  605. echo ' sendfile on;';
  606. echo ' tcp_nopush on;';
  607. echo ' tcp_nodelay on;';
  608. echo ' keepalive_timeout 65;';
  609. echo ' types_hash_max_size 2048;';
  610. echo ' server_tokens off;';
  611. echo '';
  612. echo ' # server_names_hash_bucket_size 64;';
  613. echo ' # server_name_in_redirect off;';
  614. echo '';
  615. echo ' include /etc/nginx/mime.types;';
  616. echo ' default_type application/octet-stream;';
  617. echo '';
  618. echo ' ##';
  619. echo ' # Logging Settings';
  620. echo ' ##';
  621. echo '';
  622. echo ' access_log /dev/null;';
  623. echo ' error_log /dev/null;';
  624. echo '';
  625. echo ' ###';
  626. echo ' # Gzip Settings';
  627. echo ' ##';
  628. echo ' gzip on;';
  629. echo ' gzip_disable "msie6";';
  630. echo '';
  631. echo ' # gzip_vary on;';
  632. echo ' # gzip_proxied any;';
  633. echo ' # gzip_comp_level 6;';
  634. echo ' # gzip_buffers 16 8k;';
  635. echo ' # gzip_http_version 1.1;';
  636. echo ' # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;';
  637. echo '';
  638. echo ' ##';
  639. echo ' # Virtual Host Configs';
  640. echo ' ##';
  641. echo '';
  642. echo ' include /etc/nginx/conf.d/*.conf;';
  643. echo ' include /etc/nginx/sites-enabled/*;';
  644. echo '}'; } > /etc/nginx/nginx.conf
  645. # install a script to easily enable and disable nginx virtual hosts
  646. if [ ! -d "$INSTALL_DIR" ]; then
  647. mkdir "$INSTALL_DIR"
  648. fi
  649. cd "$INSTALL_DIR" || exit 2798462846827
  650. function_check git_clone
  651. git_clone "$NGINX_ENSITE_REPO" "$INSTALL_DIR/nginx_ensite"
  652. cd "$INSTALL_DIR/nginx_ensite" || exit 2468748223
  653. git checkout "$NGINX_ENSITE_COMMIT" -b "$NGINX_ENSITE_COMMIT"
  654. set_completion_param "nginx-ensite commit" "$NGINX_ENSITE_COMMIT"
  655. make install
  656. nginx_dissite default
  657. function_check configure_firewall_for_web_access
  658. configure_firewall_for_web_access
  659. mark_completed "${FUNCNAME[0]}"
  660. }
  661. function remove_certs {
  662. domain_name=$1
  663. if [ ! "$domain_name" ]; then
  664. return
  665. fi
  666. if [ -f "/etc/ssl/certs/${domain_name}.dhparam" ]; then
  667. rm "/etc/ssl/certs/${domain_name}.dhparam"
  668. fi
  669. if [ -f "/etc/ssl/certs/${domain_name}.pem" ]; then
  670. rm "/etc/ssl/certs/${domain_name}.pem"
  671. fi
  672. if [ -f "/etc/ssl/certs/${domain_name}.crt" ]; then
  673. rm "/etc/ssl/certs/${domain_name}.crt"
  674. fi
  675. if [ -f "/etc/ssl/private/${domain_name}.key" ]; then
  676. rm "/etc/ssl/private/${domain_name}.key"
  677. fi
  678. }
  679. function configure_firewall_for_web_access {
  680. if [[ $(is_completed "${FUNCNAME[0]}") == "1" ]]; then
  681. return
  682. fi
  683. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  684. # docker does its own firewalling
  685. return
  686. fi
  687. if [[ $ONION_ONLY != "no" ]]; then
  688. return
  689. fi
  690. firewall_add HTTP 80 tcp
  691. firewall_add HTTPS 443 tcp
  692. mark_completed "${FUNCNAME[0]}"
  693. }
  694. function update_default_domain {
  695. echo $'Updating default domain'
  696. if [[ $ONION_ONLY == 'no' ]]; then
  697. if [ -f /etc/mumble-server.ini ]; then
  698. if [ ! -f "/etc/letsencrypt/live/${DEFAULT_DOMAIN_NAME}/fullchain.pem" ]; then
  699. if ! grep -q "mumble.pem" /etc/mumble-server.ini; then
  700. sed -i 's|sslCert=.*|sslCert=/var/lib/mumble-server/mumble.pem|g' /etc/mumble-server.ini
  701. sed -i 's|sslKey=.*|sslKey=/var/lib/mumble-server/mumble.key|g' /etc/mumble-server.ini
  702. systemctl restart mumble
  703. fi
  704. else
  705. if ! grep -q "${DEFAULT_DOMAIN_NAME}/fullchain.pem" /etc/mumble-server.ini; then
  706. usermod -a -G ssl-cert mumble-server
  707. sed -i "s|sslCert=.*|sslCert=/etc/letsencrypt/live/${DEFAULT_DOMAIN_NAME}/fullchain.pem|g" /etc/mumble-server.ini
  708. sed -i "s|sslKey=.*|sslKey=/etc/letsencrypt/live/${DEFAULT_DOMAIN_NAME}/privkey.pem|g" /etc/mumble-server.ini
  709. systemctl restart mumble
  710. fi
  711. fi
  712. fi
  713. if [ -d /etc/prosody ]; then
  714. if [ ! -d /etc/prosody/certs ]; then
  715. mkdir /etc/prosody/certs
  716. fi
  717. cp /etc/ssl/private/xmpp* /etc/prosody/certs
  718. cp /etc/ssl/certs/xmpp* /etc/prosody/certs
  719. if [ -f "/etc/letsencrypt/live/${DEFAULT_DOMAIN_NAME}/fullchain.pem" ]; then
  720. usermod -a -G ssl-cert prosody
  721. if grep -q "/etc/prosody/certs/xmpp.key" /etc/prosody/conf.avail/xmpp.cfg.lua; then
  722. sed -i "s|/etc/prosody/certs/xmpp.key|/etc/letsencrypt/live/${DEFAULT_DOMAIN_NAME}/privkey.pem|g" /etc/prosody/conf.avail/xmpp.cfg.lua
  723. fi
  724. if grep -q "/etc/prosody/certs/xmpp.crt" /etc/prosody/conf.avail/xmpp.cfg.lua; then
  725. sed -i "s|/etc/prosody/certs/xmpp.crt|/etc/letsencrypt/live/${DEFAULT_DOMAIN_NAME}/fullchain.pem|g" /etc/prosody/conf.avail/xmpp.cfg.lua
  726. fi
  727. if grep -q "/etc/prosody/certs/xmpp.key" /etc/prosody/prosody.cfg.lua; then
  728. sed -i "s|/etc/prosody/certs/xmpp.key|/etc/letsencrypt/live/${DEFAULT_DOMAIN_NAME}/privkey.pem|g" /etc/prosody/prosody.cfg.lua
  729. fi
  730. if grep -q "/etc/prosody/certs/xmpp.crt" /etc/prosody/prosody.cfg.lua; then
  731. sed -i "s|/etc/prosody/certs/xmpp.crt|/etc/letsencrypt/live/${DEFAULT_DOMAIN_NAME}/fullchain.pem|g" /etc/prosody/prosody.cfg.lua
  732. fi
  733. if grep -q "/etc/prosody/certs/${DEFAULT_DOMAIN_NAME}.key" /etc/prosody/conf.avail/xmpp.cfg.lua; then
  734. sed -i "s|/etc/prosody/certs/${DEFAULT_DOMAIN_NAME}.key|/etc/letsencrypt/live/${DEFAULT_DOMAIN_NAME}/privkey.pem|g" /etc/prosody/conf.avail/xmpp.cfg.lua
  735. fi
  736. if grep -q "/etc/prosody/certs/${DEFAULT_DOMAIN_NAME}.pem" /etc/prosody/conf.avail/xmpp.cfg.lua; then
  737. sed -i "s|/etc/prosody/certs/${DEFAULT_DOMAIN_NAME}.pem|/etc/letsencrypt/live/${DEFAULT_DOMAIN_NAME}/fullchain.pem|g" /etc/prosody/conf.avail/xmpp.cfg.lua
  738. fi
  739. if grep -q "/etc/prosody/certs/${DEFAULT_DOMAIN_NAME}.key" /etc/prosody/prosody.cfg.lua; then
  740. sed -i "s|/etc/prosody/certs/${DEFAULT_DOMAIN_NAME}.key|/etc/letsencrypt/live/${DEFAULT_DOMAIN_NAME}/privkey.pem|g" /etc/prosody/prosody.cfg.lua
  741. fi
  742. if grep -q "/etc/prosody/certs/${DEFAULT_DOMAIN_NAME}.pem" /etc/prosody/prosody.cfg.lua; then
  743. sed -i "s|/etc/prosody/certs/${DEFAULT_DOMAIN_NAME}.pem|/etc/letsencrypt/live/${DEFAULT_DOMAIN_NAME}/fullchain.pem|g" /etc/prosody/prosody.cfg.lua
  744. fi
  745. fi
  746. chown -R prosody:default /etc/prosody
  747. chmod -R 700 /etc/prosody/certs/*
  748. chmod 600 /etc/prosody/prosody.cfg.lua
  749. if [ -d "$INSTALL_DIR/prosody-modules" ]; then
  750. cp -r "$INSTALL_DIR/prosody-modules/"* /var/lib/prosody/prosody-modules/
  751. cp -r "$INSTALL_DIR/prosody-modules/"* /usr/lib/prosody/modules/
  752. fi
  753. chown -R prosody:prosody /var/lib/prosody/prosody-modules
  754. chown -R prosody:prosody /usr/lib/prosody/modules
  755. systemctl reload prosody
  756. fi
  757. if [ -d /home/znc/.znc ]; then
  758. echo $'znc found'
  759. if [ -f "/etc/letsencrypt/live/${DEFAULT_DOMAIN_NAME}/fullchain.pem" ]; then
  760. pkill znc
  761. cat "/etc/ssl/certs/${DEFAULT_DOMAIN_NAME}.pem" "/etc/ssl/private/${DEFAULT_DOMAIN_NAME}.key" > /home/znc/.znc/znc.pem
  762. chown znc:znc /home/znc/.znc/znc.pem
  763. chmod 700 /home/znc/.znc/znc.pem
  764. sed -i "s|CertFile =.*|CertFile = /etc/letsencrypt/live/${DEFAULT_DOMAIN_NAME}/fullchain.pem" /etc/ngircd/ngircd.conf
  765. sed -i "s|DHFile =.*|DHFile = /etc/ssl/certs/${DEFAULT_DOMAIN_NAME}.dhparam" /etc/ngircd/ngircd.conf
  766. sed -i "s|KeyFile =.*|KeyFile = /etc/letsencrypt/live/${DEFAULT_DOMAIN_NAME}/privkey.pem" /etc/ngircd/ngircd.conf
  767. echo $'irc certificates updated'
  768. systemctl restart ngircd
  769. su -c 'znc' - znc
  770. fi
  771. fi
  772. if [ ${#DEFAULT_DOMAIN_NAME} -gt 0 ]; then
  773. if [ -f "/etc/letsencrypt/live/${DEFAULT_DOMAIN_NAME}/fullchain.pem" ]; then
  774. if [ -d /etc/dovecot ]; then
  775. if ! grep -q "ssl_cert = </etc/letsencrypt/live/${DEFAULT_DOMAIN_NAME}/fullchain.pem" /etc/dovecot/conf.d/10-ssl.conf; then
  776. sed -i "s|#ssl_cert =.*|ssl_cert = </etc/letsencrypt/live/${DEFAULT_DOMAIN_NAME}/fullchain.pem|g" /etc/dovecot/conf.d/10-ssl.conf
  777. sed -i "s|ssl_cert =.*|ssl_cert = </etc/letsencrypt/live/${DEFAULT_DOMAIN_NAME}/fullchain.pem|g" /etc/dovecot/conf.d/10-ssl.conf
  778. systemctl restart dovecot
  779. fi
  780. fi
  781. if [ -d /etc/exim4 ]; then
  782. # Unfortunately there doesn't appear to be any other way than copying certs here
  783. cp "/etc/letsencrypt/live/${DEFAULT_DOMAIN_NAME}/{fullchain,privkey}.pem" /etc/exim4/
  784. chown root:Debian-exim /etc/exim4/*.pem
  785. chmod 640 /etc/exim4/*.pem
  786. sed -i "s|MAIN_TLS_CERTIFICATE =.*|MAIN_TLS_CERTIFICATE = /etc/exim4/fullchain.pem|g" /etc/exim4/conf.d/main/03_exim4-config_tlsoptions
  787. sed -i "s|MAIN_TLS_CERTIFICATE =.*|MAIN_TLS_CERTIFICATE = /etc/exim4/fullchain.pem|g" /etc/exim4/exim4.conf.template
  788. sed -i "s|MAIN_TLS_PRIVATEKEY =.*|MAIN_TLS_PRIVATEKEY = /etc/exim4/privkey.pem|g" /etc/exim4/conf.d/main/03_exim4-config_tlsoptions
  789. sed -i "s|MAIN_TLS_PRIVATEKEY =.*|MAIN_TLS_PRIVATEKEY = /etc/exim4/privkey.pem|g" /etc/exim4/exim4.conf.template
  790. systemctl restart exim4
  791. fi
  792. fi
  793. fi
  794. fi
  795. }
  796. function create_default_web_site {
  797. if [ ! -f "/etc/nginx/sites-available/${DEFAULT_DOMAIN_NAME}" ]; then
  798. # create a web site for the default domain
  799. if [ ! -d "/var/www/${DEFAULT_DOMAIN_NAME}/htdocs" ]; then
  800. mkdir -p "/var/www/${DEFAULT_DOMAIN_NAME}/htdocs"
  801. if [ -d "/root/${PROJECT_NAME}" ]; then
  802. cd "/root/${PROJECT_NAME}/website" || exit 24687246468
  803. ./deploy.sh EN "/var/www/${DEFAULT_DOMAIN_NAME}/htdocs"
  804. else
  805. if [ -d "/home/${MY_USERNAME}/${PROJECT_NAME}" ]; then
  806. cd "/home/${MY_USERNAME}/${PROJECT_NAME}" || exit 2462874624
  807. ./deploy.sh EN "/var/www/${DEFAULT_DOMAIN_NAME}/htdocs"
  808. fi
  809. fi
  810. fi
  811. # add a config for the default domain
  812. nginx_site=/etc/nginx/sites-available/$DEFAULT_DOMAIN_NAME
  813. if [[ $ONION_ONLY == "no" ]]; then
  814. function_check nginx_http_redirect
  815. nginx_http_redirect "$DEFAULT_DOMAIN_NAME"
  816. { echo 'server {';
  817. echo ' listen 443 ssl;';
  818. echo ' #listen [::]:443 ssl;';
  819. echo " server_name $DEFAULT_DOMAIN_NAME;";
  820. echo '';
  821. echo ' # Security'; } >> "$nginx_site"
  822. function_check nginx_ssl
  823. nginx_ssl "$DEFAULT_DOMAIN_NAME" mobile
  824. function_check nginx_security_options
  825. nginx_security_options "$DEFAULT_DOMAIN_NAME"
  826. { echo ' add_header Strict-Transport-Security max-age=15768000;';
  827. echo '';
  828. echo ' # Logs';
  829. echo ' access_log /dev/null;';
  830. echo ' error_log /dev/null;';
  831. echo '';
  832. echo ' # Root';
  833. echo " root /var/www/$DEFAULT_DOMAIN_NAME/htdocs;";
  834. echo '';
  835. echo ' # Index';
  836. echo ' index index.html;';
  837. echo '';
  838. echo ' # Location';
  839. echo ' location / {'; } >> "$nginx_site"
  840. function_check nginx_limits
  841. nginx_limits "$DEFAULT_DOMAIN_NAME" '15m'
  842. { echo ' }';
  843. echo '';
  844. echo ' # Restrict access that is unnecessary anyway';
  845. echo ' location ~ /\.(ht|git) {';
  846. echo ' deny all;';
  847. echo ' }';
  848. echo '}'; } >> "$nginx_site"
  849. else
  850. echo -n '' > "$nginx_site"
  851. fi
  852. { echo 'server {';
  853. echo " listen 127.0.0.1:$DEFAULT_DOMAIN_ONION_PORT default_server;";
  854. echo " server_name $DEFAULT_DOMAIN_NAME;";
  855. echo ''; } >> "$nginx_site"
  856. function_check nginx_security_options
  857. nginx_security_options "$DEFAULT_DOMAIN_NAME"
  858. { echo '';
  859. echo ' # Logs';
  860. echo ' access_log /dev/null;';
  861. echo ' error_log /dev/null;';
  862. echo '';
  863. echo ' # Root';
  864. echo " root /var/www/$DEFAULT_DOMAIN_NAME/htdocs;";
  865. echo '';
  866. echo ' # Location';
  867. echo ' location / {'; } >> "$nginx_site"
  868. function_check nginx_limits
  869. nginx_limits "$DEFAULT_DOMAIN_NAME" '15m'
  870. { echo ' }';
  871. echo '';
  872. echo ' # Restrict access that is unnecessary anyway';
  873. echo ' location ~ /\.(ht|git) {';
  874. echo ' deny all;';
  875. echo ' }';
  876. echo '}'; } >> "$nginx_site"
  877. if [ ! -f "/etc/ssl/certs/${DEFAULT_DOMAIN_NAME}.pem" ]; then
  878. function_check create_site_certificate
  879. create_site_certificate "$DEFAULT_DOMAIN_NAME" 'yes'
  880. fi
  881. nginx_ensite "$DEFAULT_DOMAIN_NAME"
  882. fi
  883. }
  884. function install_composer {
  885. # curl -sS https://getcomposer.org/installer | php
  886. if [ -f "${HOME}/${PROJECT_NAME}/image_build/composer_install" ]; then
  887. php < "${HOME}/${PROJECT_NAME}/image_build/composer_install"
  888. else
  889. if [ -f "/home/$MY_USERNAME/${PROJECT_NAME}/image_build/composer_install" ]; then
  890. php < "/home/$MY_USERNAME/${PROJECT_NAME}/image_build/composer_install"
  891. fi
  892. fi
  893. if [ -f composer.phar ]; then
  894. cp composer.phar composer
  895. fi
  896. if ! php composer.phar install; then
  897. echo $'Unable to run composer install'
  898. exit 7252198
  899. fi
  900. }
  901. function email_disable_chunking {
  902. if [ -f /etc/exim4/conf.d/main/04_exim4-config_chunking ]; then
  903. return
  904. fi
  905. echo "chunking_advertise_hosts =" > /etc/exim4/conf.d/main/04_exim4-config_chunking
  906. update-exim4.conf
  907. dpkg-reconfigure --frontend noninteractive exim4-config
  908. systemctl restart exim4
  909. }
  910. function email_update_onion_domain {
  911. email_hostname='/var/lib/tor/hidden_service_email/hostname'
  912. cp $email_hostname /etc/skel/.email_onion_domain
  913. for d in /home/*/ ; do
  914. USERNAME=$(echo "$d" | awk -F '/' '{print $3}')
  915. if [[ $(is_valid_user "$USERNAME") == "1" ]]; then
  916. cp $email_hostname "/home/$USERNAME/.email_onion_domain"
  917. chown "$USERNAME":"$USERNAME" "/home/$USERNAME/.email_onion_domain"
  918. fi
  919. done
  920. }
  921. function email_install_tls {
  922. tls_config_file=/etc/exim4/conf.d/main/03_exim4-config_tlsoptions
  923. tls_auth_config_file=/etc/exim4/conf.d/auth/30_exim4-config_examples
  924. email_config_changed=
  925. if [ ! -f $tls_config_file ]; then
  926. tls_config_file=/etc/exim4/exim4.conf.template
  927. tls_auth_config_file=$tls_config_file
  928. fi
  929. if [ ! -f /etc/ssl/certs/exim.dhparam ]; then
  930. "${PROJECT_NAME}-addcert" -h exim --dhkey "$DH_KEYLENGTH"
  931. CHECK_HOSTNAME=exim
  932. check_certificates exim
  933. cp /etc/ssl/certs/exim.dhparam /etc/exim4
  934. chown root:Debian-exim /etc/exim4/exim.dhparam
  935. chmod 640 /etc/exim4/exim.key /etc/exim4/exim.crt /etc/exim4/exim.dhparam
  936. email_config_changed=1
  937. fi
  938. if ! grep -q 'MAIN_TLS_ENABLE = true' $tls_config_file; then
  939. sed -i "/.ifdef MAIN_HARDCODE_PRIMARY_HOSTNAME/i\\MAIN_HARDCODE_PRIMARY_HOSTNAME =\\nMAIN_TLS_ENABLE = true" "$tls_config_file"
  940. email_config_changed=1
  941. fi
  942. if ! grep -q "tls_on_connect_ports=465" $tls_config_file; then
  943. sed -i '/SSL configuration for exim/i\tls_on_connect_ports=465' $tls_config_file
  944. email_config_changed=1
  945. fi
  946. if grep -q '# login_saslauthd_server' $tls_auth_config_file; then
  947. sed -i '/login_saslauthd_server/,/.endif/ s/# *//' $tls_auth_config_file
  948. email_config_changed=1
  949. fi
  950. if [ -f "/etc/ssl/certs/${DEFAULT_DOMAIN_NAME}.pem" ]; then
  951. cp "/etc/letsencrypt/live/${DEFAULT_DOMAIN_NAME}/fullchain.pem" /etc/exim4/
  952. chown root:Debian-exim /etc/exim4/*.pem
  953. chmod 640 /etc/exim4/*.pem
  954. if ! grep -q "MAIN_TLS_CERTIFICATE = /etc/exim4/fullchain.pem" $tls_config_file; then
  955. sed -i "/.ifdef MAIN_TLS_CERTKEY/i\\MAIN_TLS_CERTIFICATE = /etc/exim4/fullchain.pem" $tls_config_file
  956. email_config_changed=1
  957. fi
  958. fi
  959. if [ -f "/etc/ssl/private/${DEFAULT_DOMAIN_NAME}.key" ]; then
  960. cp "/etc/letsencrypt/live/${DEFAULT_DOMAIN_NAME}/privkey.pem" /etc/exim4/
  961. chown root:Debian-exim /etc/exim4/*.pem
  962. chmod 640 /etc/exim4/*.pem
  963. if ! grep -q "MAIN_TLS_PRIVATEKEY = /etc/exim4/privkey.pem" $tls_config_file; then
  964. sed -i "/.ifndef MAIN_TLS_PRIVATEKEY/i\\MAIN_TLS_PRIVATEKEY = /etc/exim4/privkey.pem" $tls_config_file
  965. email_config_changed=1
  966. fi
  967. fi
  968. if ! grep -q "SMTPLISTENEROPTIONS='-oX 465:25:587" /etc/default/exim4; then
  969. sed -i "s|SMTPLISTENEROPTIONS=.*|SMTPLISTENEROPTIONS='-oX 465:25:587 -oP /var/run/exim4/exim.pid'|g" /etc/default/exim4
  970. email_config_changed=1
  971. fi
  972. if [ $email_config_changed ]; then
  973. systemctl restart saslauthd
  974. systemctl restart exim4
  975. fi
  976. }
  977. function install_web_local_user_interface {
  978. # TODO
  979. # This is intended as a placeholder for a potential local web user interface
  980. # similar to Plinth or the yunohost admin interface
  981. local_hostname=$(grep 'host-name' /etc/avahi/avahi-daemon.conf | awk -F '=' '{print $2}').local
  982. mkdir -p "/var/www/${local_hostname}/htdocs"
  983. { echo '<html>';
  984. echo ' <body>';
  985. echo " This is a test on $local_hostname";
  986. echo ' </body>';
  987. echo '</html>'; } > "/var/www/${local_hostname}/htdocs/index.html"
  988. chown -R www-data:www-data "/var/www/${local_hostname}/htdocs"
  989. nginx_file=/etc/nginx/sites-available/$local_hostname
  990. { echo 'server {';
  991. echo ' listen 80;';
  992. echo ' listen [::]:80;';
  993. echo " server_name ${local_hostname};";
  994. echo " root /var/www/${local_hostname}/htdocs;";
  995. echo ' index index.html;';
  996. echo '}'; } > "$nginx_file"
  997. nginx_ensite "$local_hostname"
  998. }
  999. # NOTE: deliberately no exit 0