aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--.docker/nginx.conf43
-rw-r--r--.dockerignore11
-rw-r--r--.htaccess2
-rw-r--r--assets/vintage/css/shaarli.css61
-rw-r--r--doc/md/Docker.md7
-rw-r--r--doc/md/Server-configuration.md42
-rw-r--r--docker-compose.yml9
-rw-r--r--tpl/vintage/daily.html8
-rw-r--r--tpl/vintage/editlink.html32
-rw-r--r--tpl/vintage/page.header.html24
10 files changed, 163 insertions, 76 deletions
diff --git a/.docker/nginx.conf b/.docker/nginx.conf
index 023f52c1..30810a87 100644
--- a/.docker/nginx.conf
+++ b/.docker/nginx.conf
@@ -17,27 +17,13 @@ http {
17 index index.html index.php; 17 index index.html index.php;
18 18
19 server { 19 server {
20 listen 80; 20 listen 80;
21 root /var/www/shaarli; 21 root /var/www/shaarli;
22 22
23 access_log /var/log/nginx/shaarli.access.log; 23 access_log /var/log/nginx/shaarli.access.log;
24 error_log /var/log/nginx/shaarli.error.log; 24 error_log /var/log/nginx/shaarli.error.log;
25 25
26 location ~ /\. { 26 location ~* \.(?:ico|css|js|gif|jpe?g|png|ttf|oet|woff2?)$ {
27 # deny access to dotfiles
28 access_log off;
29 log_not_found off;
30 deny all;
31 }
32
33 location ~ ~$ {
34 # deny access to temp editor files, e.g. "script.php~"
35 access_log off;
36 log_not_found off;
37 deny all;
38 }
39
40 location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
41 # cache static assets 27 # cache static assets
42 expires max; 28 expires max;
43 add_header Pragma public; 29 add_header Pragma public;
@@ -49,30 +35,25 @@ http {
49 alias /var/www/shaarli/images/favicon.ico; 35 alias /var/www/shaarli/images/favicon.ico;
50 } 36 }
51 37
38 location /doc/html/ {
39 default_type "text/html";
40 try_files $uri $uri/ $uri.html =404;
41 }
42
52 location / { 43 location / {
53 # Slim - rewrite URLs 44 # Slim - rewrite URLs & do NOT serve static files through this location
54 try_files $uri /index.php$is_args$args; 45 try_files _ /index.php$is_args$args;
55 } 46 }
56 47
57 location ~ (index)\.php$ { 48 location ~ index\.php$ {
58 # Slim - split URL path into (script_filename, path_info) 49 # Slim - split URL path into (script_filename, path_info)
59 try_files $uri =404; 50 try_files $uri =404;
60 fastcgi_split_path_info ^(.+\.php)(/.+)$; 51 fastcgi_split_path_info ^(index.php)(/.+)$;
61 52
62 # filter and proxy PHP requests to PHP-FPM 53 # filter and proxy PHP requests to PHP-FPM
63 fastcgi_pass unix:/var/run/php-fpm.sock; 54 fastcgi_pass unix:/var/run/php-fpm.sock;
64 fastcgi_index index.php; 55 fastcgi_index index.php;
65 include fastcgi.conf; 56 include fastcgi.conf;
66 } 57 }
67
68 location ~ /doc/ {
69 default_type "text/html";
70 try_files $uri $uri/ $uri.html =404;
71 }
72
73 location ~ \.php$ {
74 # deny access to all other PHP scripts
75 deny all;
76 }
77 } 58 }
78} 59}
diff --git a/.dockerignore b/.dockerignore
index 96fd31c5..19fd87a5 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -2,8 +2,16 @@
2.dev 2.dev
3.git 3.git
4.github 4.github
5.gitattributes
6.gitignore
7.travis.yml
5tests 8tests
6 9
10# Docker related resources are not needed inside the container
11.dockerignore
12Dockerfile
13Dockerfile.armhf
14
7# Docker Compose resources 15# Docker Compose resources
8docker-compose.yml 16docker-compose.yml
9 17
@@ -13,6 +21,9 @@ data/*
13pagecache/* 21pagecache/*
14tmp/* 22tmp/*
15 23
24# Shaarli's docs are created during the build
25doc/html/
26
16# Eclipse project files 27# Eclipse project files
17.settings 28.settings
18.buildpath 29.buildpath
diff --git a/.htaccess b/.htaccess
index 25fcfb03..9d1522df 100644
--- a/.htaccess
+++ b/.htaccess
@@ -13,7 +13,7 @@ RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
13# Alternative (if the 2 lines above don't work) 13# Alternative (if the 2 lines above don't work)
14# SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0 14# SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0
15 15
16# REST API 16# Slim URL Redirection
17# Ionos Hosting needs RewriteBase / 17# Ionos Hosting needs RewriteBase /
18# RewriteBase / 18# RewriteBase /
19RewriteCond %{REQUEST_FILENAME} !-f 19RewriteCond %{REQUEST_FILENAME} !-f
diff --git a/assets/vintage/css/shaarli.css b/assets/vintage/css/shaarli.css
index 1688dce0..33e178af 100644
--- a/assets/vintage/css/shaarli.css
+++ b/assets/vintage/css/shaarli.css
@@ -1122,6 +1122,16 @@ ul.errors {
1122 float: left; 1122 float: left;
1123} 1123}
1124 1124
1125ul.warnings {
1126 color: orange;
1127 float: left;
1128}
1129
1130ul.successes {
1131 color: green;
1132 float: left;
1133}
1134
1125#pluginsadmin { 1135#pluginsadmin {
1126 width: 80%; 1136 width: 80%;
1127 padding: 20px 0 0 20px; 1137 padding: 20px 0 0 20px;
@@ -1248,3 +1258,54 @@ ul.errors {
1248 width: 0%; 1258 width: 0%;
1249 height: 10px; 1259 height: 10px;
1250} 1260}
1261
1262.loading-input {
1263 position: relative;
1264}
1265
1266@keyframes around {
1267 0% {
1268 transform: rotate(0deg);
1269 }
1270
1271 100% {
1272 transform: rotate(360deg);
1273 }
1274}
1275
1276.loading-input .icon-container {
1277 position: absolute;
1278 right: 60px;
1279 top: calc(50% - 10px);
1280}
1281
1282.loading-input .loader {
1283 position: relative;
1284 height: 20px;
1285 width: 20px;
1286 display: inline-block;
1287 animation: around 5.4s infinite;
1288}
1289
1290.loading-input .loader::after,
1291.loading-input .loader::before {
1292 content: "";
1293 background: #eee;
1294 position: absolute;
1295 display: inline-block;
1296 width: 100%;
1297 height: 100%;
1298 border-width: 2px;
1299 border-color: #333 #333 transparent transparent;
1300 border-style: solid;
1301 border-radius: 20px;
1302 box-sizing: border-box;
1303 top: 0;
1304 left: 0;
1305 animation: around 0.7s ease-in-out infinite;
1306}
1307
1308.loading-input .loader::after {
1309 animation: around 0.7s ease-in-out 0.1s infinite;
1310 background: transparent;
1311}
diff --git a/doc/md/Docker.md b/doc/md/Docker.md
index c152fe92..fc406c00 100644
--- a/doc/md/Docker.md
+++ b/doc/md/Docker.md
@@ -1,3 +1,4 @@
1
1# Docker 2# Docker
2 3
3[Docker](https://docs.docker.com/get-started/overview/) is an open platform for developing, shipping, and running applications 4[Docker](https://docs.docker.com/get-started/overview/) is an open platform for developing, shipping, and running applications
@@ -113,9 +114,11 @@ $ mkdir shaarli && cd shaarli
113# Download the latest version of Shaarli's docker-compose.yml 114# Download the latest version of Shaarli's docker-compose.yml
114$ curl -L https://raw.githubusercontent.com/shaarli/Shaarli/latest/docker-compose.yml -o docker-compose.yml 115$ curl -L https://raw.githubusercontent.com/shaarli/Shaarli/latest/docker-compose.yml -o docker-compose.yml
115# Create the .env file and fill in your VPS and domain information 116# Create the .env file and fill in your VPS and domain information
116# (replace <MY_SHAARLI_DOMAIN> and <MY_CONTACT_EMAIL> with your actual information) 117# (replace <shaarli.mydomain.org>, <admin@mydomain.org> and <latest> with your actual information)
117$ echo 'SHAARLI_VIRTUAL_HOST=shaarli.mydomain.org' > .env 118$ echo 'SHAARLI_VIRTUAL_HOST=shaarli.mydomain.org' > .env
118$ echo 'SHAARLI_LETSENCRYPT_EMAIL=admin@mydomain.org' >> .env 119$ echo 'SHAARLI_LETSENCRYPT_EMAIL=admin@mydomain.org' >> .env
120# Available Docker tags can be found at https://hub.docker.com/r/shaarli/shaarli/tags
121$ echo 'SHAARLI_DOCKER_TAG=latest' >> .env
119# Pull the Docker images 122# Pull the Docker images
120$ docker-compose pull 123$ docker-compose pull
121# Run! 124# Run!
@@ -224,4 +227,4 @@ $ docker system prune
224- [docker pull](https://docs.docker.com/engine/reference/commandline/pull/) 227- [docker pull](https://docs.docker.com/engine/reference/commandline/pull/)
225- [docker run](https://docs.docker.com/engine/reference/commandline/run/) 228- [docker run](https://docs.docker.com/engine/reference/commandline/run/)
226- [docker-compose logs](https://docs.docker.com/compose/reference/logs/) 229- [docker-compose logs](https://docs.docker.com/compose/reference/logs/)
227- Træfik: [Getting Started](https://docs.traefik.io/), [Docker backend](https://docs.traefik.io/configuration/backends/docker/), [Let's Encrypt](https://docs.traefik.io/user-guide/docker-and-lets-encrypt/), [Docker image](https://hub.docker.com/_/traefik/) \ No newline at end of file 230- Træfik: [Getting Started](https://docs.traefik.io/), [Docker backend](https://docs.traefik.io/configuration/backends/docker/), [Let's Encrypt](https://docs.traefik.io/user-guide/docker-and-lets-encrypt/), [Docker image](https://hub.docker.com/_/traefik/)
diff --git a/doc/md/Server-configuration.md b/doc/md/Server-configuration.md
index 4e74d80b..a49b6033 100644
--- a/doc/md/Server-configuration.md
+++ b/doc/md/Server-configuration.md
@@ -193,19 +193,24 @@ sudo nano /etc/apache2/sites-available/shaarli.mydomain.org.conf
193 Require all granted 193 Require all granted
194 </Directory> 194 </Directory>
195 195
196 <LocationMatch "/\."> 196 # BE CAREFUL: directives order matter!
197 # Prevent accessing dotfiles
198 RedirectMatch 404 ".*"
199 </LocationMatch>
200 197
201 <LocationMatch "\.(?:ico|css|js|gif|jpe?g|png)$"> 198 <FilesMatch ".*\.(?!(ico|css|js|gif|jpe?g|png|ttf|oet|woff2?)$)[^\.]*$">
199 Require all denied
200 </FilesMatch>
201
202 <Files "index.php">
203 Require all granted
204 </Files>
205
206 <FilesMatch "\.(?:ico|css|js|gif|jpe?g|png|ttf|oet|woff2)$">
202 # allow client-side caching of static files 207 # allow client-side caching of static files
203 Header set Cache-Control "max-age=2628000, public, must-revalidate, proxy-revalidate" 208 Header set Cache-Control "max-age=2628000, public, must-revalidate, proxy-revalidate"
204 </LocationMatch> 209 </FilesMatch>
210
205 211
206 # serve the Shaarli favicon from its custom location 212 # serve the Shaarli favicon from its custom location
207 Alias favicon.ico /var/www/shaarli.mydomain.org/images/favicon.ico 213 Alias favicon.ico /var/www/shaarli.mydomain.org/images/favicon.ico
208
209</VirtualHost> 214</VirtualHost>
210``` 215```
211 216
@@ -296,7 +301,7 @@ server {
296 location / { 301 location / {
297 # default index file when no file URI is requested 302 # default index file when no file URI is requested
298 index index.php; 303 index index.php;
299 try_files $uri /index.php$is_args$args; 304 try_files _ /index.php$is_args$args;
300 } 305 }
301 306
302 location ~ (index)\.php$ { 307 location ~ (index)\.php$ {
@@ -309,23 +314,7 @@ server {
309 include fastcgi.conf; 314 include fastcgi.conf;
310 } 315 }
311 316
312 location ~ \.php$ { 317 location ~ /doc/html/ {
313 # deny access to all other PHP scripts
314 # disable this if you host other PHP applications on the same virtualhost
315 deny all;
316 }
317
318 location ~ /\. {
319 # deny access to dotfiles
320 deny all;
321 }
322
323 location ~ ~$ {
324 # deny access to temp editor files, e.g. "script.php~"
325 deny all;
326 }
327
328 location ~ /doc/ {
329 default_type "text/html"; 318 default_type "text/html";
330 try_files $uri $uri/ $uri.html =404; 319 try_files $uri $uri/ $uri.html =404;
331 } 320 }
@@ -336,13 +325,12 @@ server {
336 } 325 }
337 326
338 # allow client-side caching of static files 327 # allow client-side caching of static files
339 location ~* \.(?:ico|css|js|gif|jpe?g|png)$ { 328 location ~* \.(?:ico|css|js|gif|jpe?g|png|ttf|oet|woff2?)$ {
340 expires max; 329 expires max;
341 add_header Cache-Control "public, must-revalidate, proxy-revalidate"; 330 add_header Cache-Control "public, must-revalidate, proxy-revalidate";
342 # HTTP 1.0 compatibility 331 # HTTP 1.0 compatibility
343 add_header Pragma public; 332 add_header Pragma public;
344 } 333 }
345
346} 334}
347``` 335```
348 336
diff --git a/docker-compose.yml b/docker-compose.yml
index a3de4b1c..4ebae447 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -2,12 +2,13 @@
2# Shaarli - Docker Compose example configuration 2# Shaarli - Docker Compose example configuration
3# 3#
4# See: 4# See:
5# - https://shaarli.readthedocs.io/en/master/docker/shaarli-images/ 5# - https://shaarli.readthedocs.io/en/master/Docker/#docker-compose
6# - https://shaarli.readthedocs.io/en/master/guides/install-shaarli-with-debian9-and-docker/
7# 6#
8# Environment variables: 7# Environment variables:
9# - SHAARLI_VIRTUAL_HOST Fully Qualified Domain Name for the Shaarli instance 8# - SHAARLI_VIRTUAL_HOST Fully Qualified Domain Name for the Shaarli instance
10# - SHAARLI_LETSENCRYPT_EMAIL Contact email for certificate renewal 9# - SHAARLI_LETSENCRYPT_EMAIL Contact email for certificate renewal
10# - SHAARLI_DOCKER_TAG Shaarli docker tag to use
11# See: https://hub.docker.com/r/shaarli/shaarli/tags
11version: '3' 12version: '3'
12 13
13networks: 14networks:
@@ -20,7 +21,7 @@ volumes:
20 21
21services: 22services:
22 shaarli: 23 shaarli:
23 image: shaarli/shaarli:master 24 image: shaarli/shaarli:${SHAARLI_DOCKER_TAG}
24 build: ./ 25 build: ./
25 networks: 26 networks:
26 - http-proxy 27 - http-proxy
@@ -40,7 +41,7 @@ services:
40 - "--entrypoints=Name:https Address::443 TLS" 41 - "--entrypoints=Name:https Address::443 TLS"
41 - "--retry" 42 - "--retry"
42 - "--docker" 43 - "--docker"
43 - "--docker.domain=docker.localhost" 44 - "--docker.domain=${SHAARLI_VIRTUAL_HOST}"
44 - "--docker.exposedbydefault=true" 45 - "--docker.exposedbydefault=true"
45 - "--docker.watch=true" 46 - "--docker.watch=true"
46 - "--acme" 47 - "--acme"
diff --git a/tpl/vintage/daily.html b/tpl/vintage/daily.html
index 74f6cdc7..28ba9f90 100644
--- a/tpl/vintage/daily.html
+++ b/tpl/vintage/daily.html
@@ -14,9 +14,9 @@
14 14
15 <div class="dailyAbout"> 15 <div class="dailyAbout">
16 All links of one day<br>in a single page.<br> 16 All links of one day<br>in a single page.<br>
17 {if="$previousday"} <a href="{$base_path}/daily&amp;day={$previousday}"><b>&lt;</b>Previous day</a>{else}<b>&lt;</b>Previous day{/if} 17 {if="$previousday"} <a href="{$base_path}/daily?day={$previousday}"><b>&lt;</b>Previous day</a>{else}<b>&lt;</b>Previous day{/if}
18 - 18 -
19 {if="$nextday"}<a href="{$base_path}/daily&amp;day={$nextday}">Next day<b>&gt;</b></a>{else}Next day<b>&gt;</b>{/if} 19 {if="$nextday"}<a href="{$base_path}/daily?day={$nextday}">Next day<b>&gt;</b></a>{else}Next day<b>&gt;</b>{/if}
20 <br> 20 <br>
21 21
22 {loop="$daily_about_plugin"} 22 {loop="$daily_about_plugin"}
@@ -52,13 +52,13 @@
52 {$link=$value} 52 {$link=$value}
53 <div class="dailyEntry"> 53 <div class="dailyEntry">
54 <div class="dailyEntryPermalink"> 54 <div class="dailyEntryPermalink">
55 <a href="{$base_path}/?{$value.shorturl}"> 55 <a href="{$base_path}/shaare/{$value.shorturl}">
56 <img src="{$asset_path}/img/squiggle.png#" width="25" height="26" title="permalink" alt="permalink"> 56 <img src="{$asset_path}/img/squiggle.png#" width="25" height="26" title="permalink" alt="permalink">
57 </a> 57 </a>
58 </div> 58 </div>
59 {if="!$hide_timestamps || $is_logged_in"} 59 {if="!$hide_timestamps || $is_logged_in"}
60 <div class="dailyEntryLinkdate"> 60 <div class="dailyEntryLinkdate">
61 <a href="{$base_path}/?{$value.shorturl}">{function="strftime('%c', $link.timestamp)"}</a> 61 <a href="{$base_path}/shaare/{$value.shorturl}">{function="strftime('%c', $link.timestamp)"}</a>
62 </div> 62 </div>
63 {/if} 63 {/if}
64 {if="$link.tags"} 64 {if="$link.tags"}
diff --git a/tpl/vintage/editlink.html b/tpl/vintage/editlink.html
index eb8807b5..343418bc 100644
--- a/tpl/vintage/editlink.html
+++ b/tpl/vintage/editlink.html
@@ -6,6 +6,7 @@
6{if="$link.title==''"}onload="document.linkform.lf_title.focus();" 6{if="$link.title==''"}onload="document.linkform.lf_title.focus();"
7{elseif="$link.description==''"}onload="document.linkform.lf_description.focus();" 7{elseif="$link.description==''"}onload="document.linkform.lf_description.focus();"
8{else}onload="document.linkform.lf_tags.focus();"{/if} > 8{else}onload="document.linkform.lf_tags.focus();"{/if} >
9{$asyncLoadClass=$link_is_new && $async_metadata && empty($link.title) ? 'loading-input' : ''}
9<div id="pageheader"> 10<div id="pageheader">
10 {include="page.header"} 11 {include="page.header"}
11 <div id="shaarli_title"><a href="{$titleLink}">{$shaarlititle}</a></div> 12 <div id="shaarli_title"><a href="{$titleLink}">{$shaarlititle}</a></div>
@@ -14,12 +15,29 @@
14 {if="isset($link.id)"} 15 {if="isset($link.id)"}
15 <input type="hidden" name="lf_id" value="{$link.id}"> 16 <input type="hidden" name="lf_id" value="{$link.id}">
16 {/if} 17 {/if}
17 <label for="lf_url"><i>URL</i></label><br><input type="text" name="lf_url" id="lf_url" value="{$link.url}" class="lf_input"><br> 18 <label for="lf_url"><i>URL</i></label><br><input type="text" name="lf_url" id="lf_url" value="{$link.url}" class="lf_input">
18 <label for="lf_title"><i>Title</i></label><br><input type="text" name="lf_title" id="lf_title" value="{$link.title}" class="lf_input"><br> 19 <label for="lf_title"><i>Title</i></label>
19 <label for="lf_description"><i>Description</i></label><br><textarea name="lf_description" id="lf_description" rows="4" cols="25">{$link.description}</textarea><br> 20 <div class="{$asyncLoadClass}">
20 <label for="lf_tags"><i>Tags</i></label><br> 21 <input type="text" name="lf_title" id="lf_title" value="{$link.title}" class="lf_input">
21 <input type="text" name="lf_tags" id="lf_tags" value="{$link.tags}" class="lf_input" 22 <div class="icon-container">
22 data-list="{loop="$tags"}{$key}, {/loop}" data-multiple autocomplete="off" ><br> 23 <i class="loader"></i>
24 </div>
25 </div>
26 <label for="lf_description"><i>Description</i></label>
27 <div class="{if="$retrieve_description"}{$asyncLoadClass}{/if}">
28 <textarea name="lf_description" id="lf_description" rows="4" cols="25">{$link.description}</textarea>
29 <div class="icon-container">
30 <i class="loader"></i>
31 </div>
32 </div>
33 <label for="lf_tags"><i>Tags</i></label>
34 <div class="{if="$retrieve_description"}{$asyncLoadClass}{/if}">
35 <input type="text" name="lf_tags" id="lf_tags" value="{$link.tags}" class="lf_input"
36 data-list="{loop="$tags"}{$key}, {/loop}" data-multiple autocomplete="off" >
37 <div class="icon-container">
38 <i class="loader"></i>
39 </div>
40 </div>
23 41
24 {if="$formatter==='markdown'"} 42 {if="$formatter==='markdown'"}
25 <div class="md_help"> 43 <div class="md_help">
@@ -56,5 +74,5 @@
56 </div> 74 </div>
57</div> 75</div>
58{include="page.footer"} 76{include="page.footer"}
59</body> 77{if="$link_is_new && $async_metadata"}<script src="{$asset_path}/js/metadata.min.js?v={$version_hash}#"></script>{/if}</body>
60</html> 78</html>
diff --git a/tpl/vintage/page.header.html b/tpl/vintage/page.header.html
index 0a33523b..64d7f656 100644
--- a/tpl/vintage/page.header.html
+++ b/tpl/vintage/page.header.html
@@ -54,6 +54,30 @@
54 </ul> 54 </ul>
55{/if} 55{/if}
56 56
57{if="!empty($global_errors)"}
58 <ul class="errors">
59 {loop="$global_errors"}
60 <li>{$value}</li>
61 {/loop}
62 </ul>
63{/if}
64
65{if="!empty($global_warnings)"}
66 <ul class="warnings">
67 {loop="$global_warnings"}
68 <li>{$value}</li>
69 {/loop}
70 </ul>
71{/if}
72
73{if="!empty($global_successes)"}
74 <ul class="successes">
75 {loop="$global_successes"}
76 <li>{$value}</li>
77 {/loop}
78 </ul>
79{/if}
80
57<div class="clear"></div> 81<div class="clear"></div>
58 82
59 83