#!/bin/sh
#
# This file is part of OpenMediaVault.
#
# @license   http://www.gnu.org/licenses/gpl.html GPL Version 3
# @author    Volker Theile <volker.theile@openmediavault.org>
# @copyright Copyright (c) 2009-2015 Volker Theile
#
# OpenMediaVault is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
#
# OpenMediaVault is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with OpenMediaVault. If not, see <http://www.gnu.org/licenses/>.

# Documentation/Howto:
# http://doc.owncloud.org/server/6.0/admin_manual/installation/installation_source.html
# http://www.howtoforge.com/running-owncloud-5.0-on-nginx-lemp-on-debian-wheezy
# http://tech-blog.clericare.com/2013/08/how-to-deploy-owncloud-with-postgresql.html
# http://stackoverflow.com/questions/21645068/nginx-and-owncloud-in-subfolder

set -e

. /etc/default/openmediavault
. /usr/share/openmediavault/scripts/helper-functions

OMV_SSL_CERTIFICATE_DIR=${OMV_SSL_CERTIFICATE_DIR:-"/etc/ssl"}
OMV_SSL_CERTIFICATE_PREFIX=${OMV_SSL_CERTIFICATE_PREFIX:-"openmediavault-"}

OMV_NGINX_SITE_WEBGUI_INCLUDE_DIR=${OMV_NGINX_SITE_WEBGUI_INCLUDE_DIR:-"/etc/nginx/openmediavault-webgui.d"}

OMV_NGINX_SITE_OWNCLOUD_CONFIG=${OMV_NGINX_SITE_OWNCLOUD_CONFIG:-"/etc/nginx/sites-enabled/openmediavault-owncloud"}
OMV_NGINX_SITE_OWNCLOUD_DOCUMENTROOT=${OMV_NGINX_SITE_OWNCLOUD_DOCUMENTROOT:-"/var/www/owncloud"}
OMV_NGINX_SITE_OWNCLOUD_LOG_DIR=${OMV_NGINX_SITE_OWNCLOUD_LOG_DIR:-"/var/log/nginx"}
OMV_NGINX_SITE_OWNCLOUD_LOGLEVEL=${OMV_NGINX_SITE_OWNCLOUD_LOGLEVEL:-"error"}
OMV_NGINX_SITE_OWNCLOUD_SERVERNAME=${OMV_NGINX_SITE_OWNCLOUD_SERVERNAME:-"owncloud"}
OMV_NGINX_SITE_OWNCLOUD_REDIRECT_CONFIG=${OMV_NGINX_SITE_OWNCLOUD_REDIRECT_CONFIG:-"${OMV_NGINX_SITE_WEBGUI_INCLUDE_DIR}/owncloud.conf"}

rm -f ${OMV_NGINX_SITE_OWNCLOUD_CONFIG}
rm -f ${OMV_NGINX_SITE_OWNCLOUD_REDIRECT_CONFIG}
[ "$(omv_config_get "//services/owncloud/enable")" = "0" ] && exit 0

# Get the configured location of the data directory.
sfref=$(omv_config_get "//services/owncloud/sharedfolderref")
datadirectory=$(omv_get_sharedfolder_path "${sfref}")

# Create '/etc/nginx/sites-enabled/openmediavault-owncloud' file.
xmlstarlet sel -t -m "//services/owncloud" \
  -o "server {" -n \
  -v "concat('    listen [::]:',port,' default_server ipv6only=off ssl deferred;')" -n \
  -v "concat('    ssl_certificate ${OMV_SSL_CERTIFICATE_DIR}/certs/${OMV_SSL_CERTIFICATE_PREFIX}',sslcertificateref,'.crt;')" -n \
  -v "concat('    ssl_certificate_key ${OMV_SSL_CERTIFICATE_DIR}/private/${OMV_SSL_CERTIFICATE_PREFIX}',sslcertificateref,'.key;')" -n \
  -o "    server_name ${OMV_NGINX_SITE_OWNCLOUD_SERVERNAME};" -n \
  -o "    root ${OMV_NGINX_SITE_OWNCLOUD_DOCUMENTROOT};" -n \
  -o "    index index.php;" -n \
  -o "    autoindex off;" -n \
  -o "    server_tokens off;" -n \
  -o "    sendfile on;" -n \
  -o "    large_client_header_buffers 4 32k;" -n \
  -o "    client_max_body_size 10G;" -n \
  -o "    error_log ${OMV_NGINX_SITE_OWNCLOUD_LOG_DIR}/${OMV_NGINX_SITE_OWNCLOUD_SERVERNAME}_error.log ${OMV_NGINX_SITE_OWNCLOUD_LOGLEVEL};" -n \
  -o "    access_log ${OMV_NGINX_SITE_OWNCLOUD_LOG_DIR}/${OMV_NGINX_SITE_OWNCLOUD_SERVERNAME}_access.log combined;" -n \
  -o "    rewrite ^/caldav(.*)$ /remote.php/caldav\$1 redirect;" -n \
  -o "    rewrite ^/carddav(.*)$ /remote.php/carddav\$1 redirect;" -n \
  -o "    rewrite ^/webdav(.*)$ /remote.php/webdav\$1 redirect;" -n \
  -o "    error_page 403 /core/templates/403.php;" -n \
  -o "    error_page 404 /core/templates/404.php;" -n \
  -o "    location = /robots.txt {" -n \
  -o "        allow all;" -n \
  -o "        log_not_found off;" -n \
  -o "        access_log off;" -n \
  -o "    }" -n \
  -o "    location ~ ^/(data|config|\.ht|db_structure\.xml|README) {" -n \
  -o "        deny all;" -n \
  -o "    }" -n \
  -o "    location / {" -n \
  -o "        # The following 2 rules are only needed with webfinger" -n \
  -o "        rewrite ^/.well-known/host-meta /public.php?service=host-meta last;" -n \
  -o "        rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;" -n \
  -o "        rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;" -n \
  -o "        rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;" -n \
  -o "        rewrite ^(/core/doc/[^\/]+/)$ \$1/index.html;" -n \
  -o "        try_files \$uri \$uri/ index.php;" -n \
  -o "    }" -n \
  -o "    location ~ ^(.+?\.php)(/.*)?$ {" -n \
  -o "        try_files \$1 = 404;" -n \
  -o "        include fastcgi_params;" -n \
  -o "        fastcgi_param SCRIPT_FILENAME \$document_root\$1;" -n \
  -o "        fastcgi_param PATH_INFO \$2;" -n \
  -o "        fastcgi_param HTTPS on;" -n \
  -o "        fastcgi_param PHP_VALUE \"upload_tmp_dir = $datadirectory\";" -n \
  -o "        fastcgi_pass unix:/var/run/php5-fpm-openmediavault-owncloud.sock;" -n \
  -o "        fastcgi_buffers 64 4K;" -n \
  -o "    }" -n \
  -o "    location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {" -n \
  -o "        expires 30d;" -n \
  -o "        access_log off;" -n \
  -o "    }" -n \
  -o "    # PFS (Perfect Forward Secrecy)" -n \
  -o "    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;" -n \
  -o "    ssl_prefer_server_ciphers on;" -n \
  -o "    ssl_ciphers EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS;" -n \
  -o "}" \
  ${OMV_CONFIG_FILE} | xmlstarlet unesc > ${OMV_NGINX_SITE_OWNCLOUD_CONFIG}

# Create '/etc/nginx/openmediavault-webgui.d/owncloud.conf' file.
xmlstarlet sel -t -m "//services/owncloud" \
  -o "location /owncloud {" -n \
  -v "concat('    return 301 https://\$host:',port,';')" -n \
  -o "}" \
  ${OMV_CONFIG_FILE} | xmlstarlet unesc > ${OMV_NGINX_SITE_OWNCLOUD_REDIRECT_CONFIG}
