freedombone-utils-web 44KB

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