freedombone-utils-web 43KB

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