Ver código fonte

Merge pull request #9972 from overleaf/jpa-fix-rate-limited-output-download

[server-ce] serve output files via nginx

GitOrigin-RevId: 0ba3b27f85f928b1d95646e663dfa42a22a9f832
Timothée Alby 3 anos atrás
pai
commit
1ae3061f16

+ 1 - 0
server-ce/Dockerfile

@@ -38,6 +38,7 @@ ADD server-ce/runit /etc/service
 # ---------------
 ADD server-ce/nginx/nginx.conf.template /etc/nginx/templates/nginx.conf.template
 ADD server-ce/nginx/sharelatex.conf /etc/nginx/sites-enabled/sharelatex.conf
+ADD server-ce/nginx/clsi-nginx.conf /etc/nginx/sites-enabled/clsi-nginx.conf
 
 
 # Configure log rotation

+ 53 - 0
server-ce/nginx/clsi-nginx.conf

@@ -0,0 +1,53 @@
+# keep in sync with clsi-startup.sh files
+# keep in sync with clsi/nginx.conf
+# Changes to the above:
+#  - added debug header
+#  - remove CORS rules, Server-CE/Server-Pro runs behind a single origin
+#  - change /output path to /var/lib/sharelatex/data/output
+
+server {
+  # Extra header for debugging.
+  add_header 'X-Served-By' 'clsi-nginx' always;
+
+  # Security-Headers
+  add_header 'X-Content-Type-Options' 'nosniff' always;
+  add_header 'X-Download-Options' 'noopen' always;
+  add_header 'X-Frame-Options' 'SAMEORIGIN' always;
+  add_header 'X-XSS-Protection' '1; mode=block' always;
+
+  listen 8080;
+  server_name clsi-nginx;
+  server_tokens off;
+  access_log off;
+  # Ignore symlinks possibly created by users
+  disable_symlinks on;
+  # enable compression for tex auxiliary files, but not for pdf files
+  gzip on;
+  gzip_types text/plain;
+  gzip_proxied any;
+  types {
+      text/plain log blg aux stdout stderr;
+      application/pdf pdf;
+  }
+  # handle output files for specific users
+  location ~ ^/project/([0-9a-f]+)/user/([0-9a-f]+)/build/([0-9a-f-]+)/output/output\.([a-z]+)$ {
+    alias /var/lib/sharelatex/data/output/$1-$2/generated-files/$3/output.$4;
+  }
+  # handle output files for anonymous users
+  location ~ ^/project/([0-9a-f]+)/build/([0-9a-f-]+)/output/output\.([a-z]+)$ {
+    alias /var/lib/sharelatex/data/output/$1/generated-files/$2/output.$3;
+  }
+
+  # PDF range for specific users
+  location ~ ^/project/([0-9a-f]+)/user/([0-9a-f]+)/content/([0-9a-f-]+/[0-9a-f]+)$ {
+    # Cache for one day
+    expires 1d;
+    alias /var/lib/sharelatex/data/output/$1-$2/content/$3;
+  }
+  # PDF range for anonymous users
+  location ~ ^/project/([0-9a-f]+)/content/([0-9a-f-]+/[0-9a-f]+)$ {
+    # Cache for one day
+    expires 1d;
+    alias /var/lib/sharelatex/data/output/$1/content/$2;
+  }
+}

+ 1 - 0
server-ce/nginx/nginx.conf.template

@@ -44,6 +44,7 @@ http {
 
 	gzip on;
 	gzip_disable "msie6";
+	gzip_proxied any; # allow upstream server to compress.
 
 	client_max_body_size 50m;
 

+ 21 - 0
server-ce/nginx/sharelatex.conf

@@ -40,4 +40,25 @@ server {
 	location /img {
 		expires 1y;
 	}
+
+  # handle output files for specific users
+  location ~ ^/project/([0-9a-f]+)/user/([0-9a-f]+)/build/([0-9a-f-]+)/output/output\.([a-z]+)$ {
+		proxy_pass http://127.0.0.1:8080; # clsi-nginx.conf
+		proxy_http_version 1.1;
+  }
+  # handle output files for anonymous users
+  location ~ ^/project/([0-9a-f]+)/build/([0-9a-f-]+)/output/output\.([a-z]+)$ {
+		proxy_pass http://127.0.0.1:8080; # clsi-nginx.conf
+		proxy_http_version 1.1;
+  }
+  # PDF range for specific users
+  location ~ ^/project/([0-9a-f]+)/user/([0-9a-f]+)/content/([0-9a-f-]+/[0-9a-f]+)$ {
+		proxy_pass http://127.0.0.1:8080; # clsi-nginx.conf
+		proxy_http_version 1.1;
+  }
+  # PDF range for anonymous users
+  location ~ ^/project/([0-9a-f]+)/content/([0-9a-f-]+/[0-9a-f]+)$ {
+		proxy_pass http://127.0.0.1:8080; # clsi-nginx.conf
+		proxy_http_version 1.1;
+  }
 }

+ 3 - 0
services/clsi/nginx.conf

@@ -1,4 +1,7 @@
 # keep in sync with clsi-startup.sh files
+# keep in sync with server-ce/nginx/clsi-nginx.conf
+# Changes to the above:
+#  - added debug header
 
 server {
   # Extra header for dev-env.

+ 6 - 2
services/web/frontend/js/features/pdf-preview/components/pdf-file-list.js

@@ -10,12 +10,16 @@ function PdfFileList({ fileList }) {
     return null
   }
 
+  function basename(file) {
+    return file.path.split('/').pop()
+  }
+
   return (
     <>
       <MenuItem header>{t('other_output_files')}</MenuItem>
 
       {fileList.top.map(file => (
-        <MenuItem download href={file.url} key={file.path}>
+        <MenuItem download={basename(file)} href={file.url} key={file.path}>
           <b>{file.path}</b>
         </MenuItem>
       ))}
@@ -25,7 +29,7 @@ function PdfFileList({ fileList }) {
       )}
 
       {fileList.other.map(file => (
-        <MenuItem download href={file.url} key={file.path}>
+        <MenuItem download={basename(file)} href={file.url} key={file.path}>
           <b>{file.path}</b>
         </MenuItem>
       ))}