chore: add dist_docserver_book as submodule and link to resources
							
								
								
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							
							
						
						| @ -1,3 +1,6 @@ | |||||||
| [submodule "pasetoken"] | [submodule "pasetoken"] | ||||||
| 	path = pasetoken | 	path = pasetoken | ||||||
| 	url = ssh://git@clrepo.tls13.io:9623/develop/pasetoken.git | 	url = ssh://git@clrepo.tls13.io:9623/develop/pasetoken.git | ||||||
|  | [submodule "dist_docserver_book"] | ||||||
|  | 	path = dist_docserver_book | ||||||
|  | 	url = ssh://git@clrepo.tls13.io:9623/develop/dist_docserver_book.git | ||||||
|  | |||||||
							
								
								
									
										1
									
								
								dist_docserver_book
									
									
									
									
									
										Submodule
									
								
							
							
								
								
								
								
								
								
									
									
								
							
						
						| @ -0,0 +1 @@ | |||||||
|  | Subproject commit 2ce6cc991af4fce6b4a3b99a016a8a547e04213d | ||||||
							
								
								
									
										1
									
								
								resources/sitehome_model/docserver
									
									
									
									
									
										Symbolic link
									
								
							
							
						
						| @ -0,0 +1 @@ | |||||||
|  | ../../dist_docserver_book/docserver | ||||||
| @ -1 +0,0 @@ | |||||||
| This file makes sure that Github Pages doesn't process mdBook's output. |  | ||||||
| @ -1 +0,0 @@ | |||||||
| cl |  | ||||||
| Before Width: | Height: | Size: 434 KiB | 
| @ -1,212 +0,0 @@ | |||||||
| <!DOCTYPE HTML> |  | ||||||
| <html lang="en" class="sidebar-visible no-js light"> |  | ||||||
|     <head> |  | ||||||
|         <!-- Book generated using mdBook --> |  | ||||||
|         <meta charset="UTF-8"> |  | ||||||
|         <title>Users Admin - Doc Server</title> |  | ||||||
|         <base href="/docserver/"> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <!-- Custom HTML head --> |  | ||||||
|          |  | ||||||
|         <meta name="description" content="Doc Server"> |  | ||||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> |  | ||||||
|         <meta name="theme-color" content="#ffffff" /> |  | ||||||
| 
 |  | ||||||
|         <link rel="icon" href="/docserver/favicon.svg"> |  | ||||||
|         <link rel="shortcut icon" href="/docserver/favicon.png"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/variables.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/general.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/chrome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/print.css" media="print"> |  | ||||||
| 
 |  | ||||||
|         <!-- Fonts --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/FontAwesome/css/font-awesome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/fonts/fonts.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Highlight.js Stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/highlight.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/tomorrow-night.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/ayu-highlight.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom theme stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/custom.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/mdbook-admonish.css"> |  | ||||||
| 
 |  | ||||||
|     </head> |  | ||||||
|     <body> |  | ||||||
|     <div id="body-container"> |  | ||||||
|         <!-- Provide site root to javascript --> |  | ||||||
|         <script> |  | ||||||
|             var path_to_root = "/docserver/"; |  | ||||||
|             var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light"; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Work around some values being stored in localStorage wrapped in quotes --> |  | ||||||
|         <script> |  | ||||||
|             try { |  | ||||||
|                 var theme = localStorage.getItem('mdbook-theme'); |  | ||||||
|                 var sidebar = localStorage.getItem('mdbook-sidebar'); |  | ||||||
| 
 |  | ||||||
|                 if (theme.startsWith('"') && theme.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (sidebar.startsWith('"') && sidebar.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); |  | ||||||
|                 } |  | ||||||
|             } catch (e) { } |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Set the theme before any content is loaded, prevents flash --> |  | ||||||
|         <script> |  | ||||||
|             var theme; |  | ||||||
|             try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } |  | ||||||
|             if (theme === null || theme === undefined) { theme = default_theme; } |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             html.classList.remove('no-js') |  | ||||||
|             html.classList.remove('light') |  | ||||||
|             html.classList.add(theme); |  | ||||||
|             html.classList.add('js'); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Hide / unhide sidebar before it is displayed --> |  | ||||||
|         <script> |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             var sidebar = null; |  | ||||||
|             if (document.body.clientWidth >= 1080) { |  | ||||||
|                 try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } |  | ||||||
|                 sidebar = sidebar || 'visible'; |  | ||||||
|             } else { |  | ||||||
|                 sidebar = 'hidden'; |  | ||||||
|             } |  | ||||||
|             html.classList.remove('sidebar-visible'); |  | ||||||
|             html.classList.add("sidebar-" + sidebar); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <nav id="sidebar" class="sidebar" aria-label="Table of contents"> |  | ||||||
|             <div class="sidebar-scrollbox"> |  | ||||||
|                 <ol class="chapter"><li class="chapter-item "><a href="/docserver/introduction.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li class="chapter-item "><a href="/docserver/index.html"><strong aria-hidden="true">2.</strong> What is this ?</a></li><li class="chapter-item "><a href="/docserver/features.html"><strong aria-hidden="true">3.</strong> Features</a></li><li class="chapter-item "><a href="/docserver/howto.html"><strong aria-hidden="true">4.</strong> How to</a></li><li class="chapter-item "><a href="/docserver/quick-start.html"><strong aria-hidden="true">5.</strong> Quick Start</a></li><li class="spacer"></li><li class="chapter-item affix "><li class="part-title">Server and Content</li><li class="chapter-item "><a href="/docserver/one_server.html"><strong aria-hidden="true">6.</strong> One web server instance</a></li><li class="chapter-item "><a href="/docserver/server_modes.html"><strong aria-hidden="true">7.</strong> Server modes</a></li><li class="chapter-item "><a href="/docserver/static_content.html"><strong aria-hidden="true">8.</strong> Static contents</a></li><li class="chapter-item "><a href="/docserver/url_path.html"><strong aria-hidden="true">9.</strong> url_path prefix</a></li><li class="chapter-item "><a href="/docserver/protect_access.html"><strong aria-hidden="true">10.</strong> Protect access</a></li><li class="chapter-item affix "><li class="part-title">Users and Policies</li><li class="chapter-item "><a href="/docserver/users.html"><strong aria-hidden="true">11.</strong> Users</a></li><li class="chapter-item "><a href="/docserver/users_sql.html"><strong aria-hidden="true">12.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/users_file_storage.html"><strong aria-hidden="true">13.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/roles.html"><strong aria-hidden="true">14.</strong> Roles</a></li><li class="chapter-item "><a href="/docserver/auths.html"><strong aria-hidden="true">15.</strong> Users auths</a></li><li class="chapter-item "><a href="/docserver/policies.html"><strong aria-hidden="true">16.</strong> Access policies</a></li><li class="chapter-item expanded "><a href="/docserver/adminusers.html" class="active"><strong aria-hidden="true">17.</strong> Users Admin</a></li><li class="chapter-item affix "><li class="part-title">Sessions</li><li class="chapter-item "><a href="/docserver/sessions.html"><strong aria-hidden="true">18.</strong> Session data</a></li><li class="chapter-item "><a href="/docserver/pasetoken.html"><strong aria-hidden="true">19.</strong> Pasetoken</a></li><li class="chapter-item "><a href="/docserver/sessions_sql.html"><strong aria-hidden="true">20.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/sessions_file_storage.html"><strong aria-hidden="true">21.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/cookie.html"><strong aria-hidden="true">22.</strong> Cookie set</a></li><li class="chapter-item affix "><li class="part-title">Logs and Trace</li><li class="chapter-item "><a href="/docserver/trace.html"><strong aria-hidden="true">23.</strong> Traced</a></li><li class="chapter-item "><a href="/docserver/logs.html"><strong aria-hidden="true">24.</strong> Sessions logs</a></li><li class="chapter-item affix "><li class="part-title">Configuration</li><li class="chapter-item "><a href="/docserver/configuration.html"><strong aria-hidden="true">25.</strong> Configurable service</a></li><li class="chapter-item "><a href="/docserver/settings.html"><strong aria-hidden="true">26.</strong> Config settings</a></li><li class="spacer"></li></ol> |  | ||||||
|             </div> |  | ||||||
|             <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> |  | ||||||
|         </nav> |  | ||||||
| 
 |  | ||||||
|         <div id="page-wrapper" class="page-wrapper"> |  | ||||||
| 
 |  | ||||||
|             <div class="page"> |  | ||||||
|                                 <div id="menu-bar-hover-placeholder"></div> |  | ||||||
|                 <div id="menu-bar" class="menu-bar sticky bordered"> |  | ||||||
|                     <div class="left-buttons"> |  | ||||||
|                         <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> |  | ||||||
|                             <i class="fa fa-bars"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="sidebar-toggle" onclick="location.href='/'" class="icon-button" type="button" title="Home" aria-label="Home" aria-controls=""> |  | ||||||
|                             <i class="fa fa-home"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> |  | ||||||
|                             <i class="fa fa-paint-brush"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> |  | ||||||
|                         </ul> |  | ||||||
|                         <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> |  | ||||||
|                             <i class="fa fa-search"></i> |  | ||||||
|                         </button> |  | ||||||
|                     </div> |  | ||||||
| 
 |  | ||||||
|                     <h1 class="menu-title">Doc Server</h1> |  | ||||||
| 
 |  | ||||||
|                     <div class="right-buttons"> |  | ||||||
|                         <a href="/docserver/print.html" title="Print this book" aria-label="Print this book"> |  | ||||||
|                             <i id="print-button" class="fa fa-print"></i> |  | ||||||
|                         </a> |  | ||||||
|                         <a href="/logout" title="Sing out" aria-label="Sign out"> |  | ||||||
|                             <i id="logout-button" class="fa fa-sign-out"></i> |  | ||||||
|                         </a> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div id="search-wrapper" class="hidden"> |  | ||||||
|                     <form id="searchbar-outer" class="searchbar-outer"> |  | ||||||
|                         <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> |  | ||||||
|                     </form> |  | ||||||
|                     <div id="searchresults-outer" class="searchresults-outer hidden"> |  | ||||||
|                         <div id="searchresults-header" class="searchresults-header"></div> |  | ||||||
|                         <ul id="searchresults"> |  | ||||||
|                         </ul> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> |  | ||||||
|                 <script> |  | ||||||
|                     document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); |  | ||||||
|                     document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); |  | ||||||
|                     Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { |  | ||||||
|                         link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); |  | ||||||
|                     }); |  | ||||||
|                 </script> |  | ||||||
| 
 |  | ||||||
|                 <div id="content" class="content"> |  | ||||||
|                     <main> |  | ||||||
|                         <h1 id="users-admin"><a class="header" href="#users-admin">Users Admin</a></h1> |  | ||||||
| 
 |  | ||||||
|                     </main> |  | ||||||
| 
 |  | ||||||
|                     <nav class="nav-wrapper" aria-label="Page navigation"> |  | ||||||
|                         <!-- Mobile navigation buttons --> |  | ||||||
|                             <a rel="prev" href="policies.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                                 <i class="fa fa-angle-left"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                             <a rel="next" href="sessions.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                                 <i class="fa fa-angle-right"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                         <div style="clear: both"></div> |  | ||||||
|                     </nav> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
| 
 |  | ||||||
|             <nav class="nav-wide-wrapper" aria-label="Page navigation"> |  | ||||||
|                     <a rel="prev" href="policies.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                         <i class="fa fa-angle-left"></i> |  | ||||||
|                     </a> |  | ||||||
| 
 |  | ||||||
|                     <a rel="next" href="sessions.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                         <i class="fa fa-angle-right"></i> |  | ||||||
|                     </a> |  | ||||||
|             </nav> |  | ||||||
| 
 |  | ||||||
|         </div> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <script> |  | ||||||
|             window.playground_copyable = true; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/ace.js"></script> |  | ||||||
|         <script src="/docserver/editor.js"></script> |  | ||||||
|         <script src="/docserver/mode-rust.js"></script> |  | ||||||
|         <script src="/docserver/theme-dawn.js"></script> |  | ||||||
|         <script src="/docserver/theme-tomorrow_night.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/elasticlunr.min.js"></script> |  | ||||||
|         <script src="/docserver/mark.min.js"></script> |  | ||||||
|         <script src="/docserver/searcher.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/clipboard.min.js"></script> |  | ||||||
|         <script src="/docserver/highlight.js"></script> |  | ||||||
|         <script src="/docserver/book.js"></script> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom JS scripts --> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     </div> |  | ||||||
|     </body> |  | ||||||
| </html> |  | ||||||
| @ -1,12 +0,0 @@ | |||||||
| li.part-title { padding-left: 0.5em; } |  | ||||||
| .navy .chapter li.part-title { background: #353f62; } |  | ||||||
| .light .chapter li.part-title { background: #9c9cf9; } |  | ||||||
| .coal .chapter li.part-title { background: #121516; } |  | ||||||
| .ayu .chapter li.part-title { background: #333334; } |  | ||||||
| .rust .chapter li.part-title { background: #6b4438; } |  | ||||||
| .cell24 {  width: 2rem; height: 4rem; } |  | ||||||
| 
 |  | ||||||
| .logo { width: 300px; height: 300px; } |  | ||||||
| .box { display: flex; align-items: center; justify-content: center; } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| @ -1,353 +0,0 @@ | |||||||
| @charset "UTF-8"; |  | ||||||
| :root { |  | ||||||
|   --md-admonition-icon--note: |  | ||||||
|     url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25z'/></svg>"); |  | ||||||
|   --md-admonition-icon--abstract: |  | ||||||
|     url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M17 9H7V7h10m0 6H7v-2h10m-3 6H7v-2h7M12 3a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m7 0h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z'/></svg>"); |  | ||||||
|   --md-admonition-icon--info: |  | ||||||
|     url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M13 9h-2V7h2m0 10h-2v-6h2m-1-9A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2z'/></svg>"); |  | ||||||
|   --md-admonition-icon--tip: |  | ||||||
|     url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M17.66 11.2c-.23-.3-.51-.56-.77-.82-.67-.6-1.43-1.03-2.07-1.66C13.33 7.26 13 4.85 13.95 3c-.95.23-1.78.75-2.49 1.32-2.59 2.08-3.61 5.75-2.39 8.9.04.1.08.2.08.33 0 .22-.15.42-.35.5-.23.1-.47.04-.66-.12a.58.58 0 0 1-.14-.17c-1.13-1.43-1.31-3.48-.55-5.12C5.78 10 4.87 12.3 5 14.47c.06.5.12 1 .29 1.5.14.6.41 1.2.71 1.73 1.08 1.73 2.95 2.97 4.96 3.22 2.14.27 4.43-.12 6.07-1.6 1.83-1.66 2.47-4.32 1.53-6.6l-.13-.26c-.21-.46-.77-1.26-.77-1.26m-3.16 6.3c-.28.24-.74.5-1.1.6-1.12.4-2.24-.16-2.9-.82 1.19-.28 1.9-1.16 2.11-2.05.17-.8-.15-1.46-.28-2.23-.12-.74-.1-1.37.17-2.06.19.38.39.76.63 1.06.77 1 1.98 1.44 2.24 2.8.04.14.06.28.06.43.03.82-.33 1.72-.93 2.27z'/></svg>"); |  | ||||||
|   --md-admonition-icon--success: |  | ||||||
|     url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='m9 20.42-6.21-6.21 2.83-2.83L9 14.77l9.88-9.89 2.83 2.83L9 20.42z'/></svg>"); |  | ||||||
|   --md-admonition-icon--question: |  | ||||||
|     url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='m15.07 11.25-.9.92C13.45 12.89 13 13.5 13 15h-2v-.5c0-1.11.45-2.11 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41a2 2 0 0 0-2-2 2 2 0 0 0-2 2H8a4 4 0 0 1 4-4 4 4 0 0 1 4 4 3.2 3.2 0 0 1-.93 2.25M13 19h-2v-2h2M12 2A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10c0-5.53-4.5-10-10-10z'/></svg>"); |  | ||||||
|   --md-admonition-icon--warning: |  | ||||||
|     url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M13 14h-2V9h2m0 9h-2v-2h2M1 21h22L12 2 1 21z'/></svg>"); |  | ||||||
|   --md-admonition-icon--failure: |  | ||||||
|     url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M20 6.91 17.09 4 12 9.09 6.91 4 4 6.91 9.09 12 4 17.09 6.91 20 12 14.91 17.09 20 20 17.09 14.91 12 20 6.91z'/></svg>"); |  | ||||||
|   --md-admonition-icon--danger: |  | ||||||
|     url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M11 15H6l7-14v8h5l-7 14v-8z'/></svg>"); |  | ||||||
|   --md-admonition-icon--bug: |  | ||||||
|     url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a5.985 5.985 0 0 0-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6.002 6.002 0 0 0-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20V8z'/></svg>"); |  | ||||||
|   --md-admonition-icon--example: |  | ||||||
|     url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M7 13v-2h14v2H7m0 6v-2h14v2H7M7 7V5h14v2H7M3 8V5H2V4h2v4H3m-1 9v-1h3v4H2v-1h2v-.5H3v-1h1V17H2m2.25-7a.75.75 0 0 1 .75.75c0 .2-.08.39-.21.52L3.12 13H5v1H2v-.92L4 11H2v-1h2.25z'/></svg>"); |  | ||||||
|   --md-admonition-icon--quote: |  | ||||||
|     url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M14 17h3l2-4V7h-6v6h3M6 17h3l2-4V7H5v6h3l-2 4z'/></svg>"); |  | ||||||
|   --md-details-icon: |  | ||||||
|     url("data:image/svg+xml;charset=utf-8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M8.59 16.58 13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.42Z'/></svg>"); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| :is(.admonition) { |  | ||||||
|   display: flow-root; |  | ||||||
|   margin: 1.5625em 0; |  | ||||||
|   padding: 0 1.2rem; |  | ||||||
|   color: var(--fg); |  | ||||||
|   page-break-inside: avoid; |  | ||||||
|   background-color: var(--bg); |  | ||||||
|   border: 0 solid black; |  | ||||||
|   border-inline-start-width: 0.4rem; |  | ||||||
|   border-radius: 0.2rem; |  | ||||||
|   box-shadow: 0 0.2rem 1rem rgba(0, 0, 0, 0.05), 0 0 0.1rem rgba(0, 0, 0, 0.1); |  | ||||||
| } |  | ||||||
| @media print { |  | ||||||
|   :is(.admonition) { |  | ||||||
|     box-shadow: none; |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| :is(.admonition) > * { |  | ||||||
|   box-sizing: border-box; |  | ||||||
| } |  | ||||||
| :is(.admonition) :is(.admonition) { |  | ||||||
|   margin-top: 1em; |  | ||||||
|   margin-bottom: 1em; |  | ||||||
| } |  | ||||||
| :is(.admonition) > .tabbed-set:only-child { |  | ||||||
|   margin-top: 0; |  | ||||||
| } |  | ||||||
| html :is(.admonition) > :last-child { |  | ||||||
|   margin-bottom: 1.2rem; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| a.admonition-anchor-link { |  | ||||||
|   display: none; |  | ||||||
|   position: absolute; |  | ||||||
|   left: -1.2rem; |  | ||||||
|   padding-right: 1rem; |  | ||||||
| } |  | ||||||
| a.admonition-anchor-link:link, a.admonition-anchor-link:visited { |  | ||||||
|   color: var(--fg); |  | ||||||
| } |  | ||||||
| a.admonition-anchor-link:link:hover, a.admonition-anchor-link:visited:hover { |  | ||||||
|   text-decoration: none; |  | ||||||
| } |  | ||||||
| a.admonition-anchor-link::before { |  | ||||||
|   content: "§"; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| :is(.admonition-title, summary) { |  | ||||||
|   position: relative; |  | ||||||
|   min-height: 4rem; |  | ||||||
|   margin-block: 0; |  | ||||||
|   margin-inline: -1.6rem -1.2rem; |  | ||||||
|   padding-block: 0.8rem; |  | ||||||
|   padding-inline: 4.4rem 1.2rem; |  | ||||||
|   font-weight: 700; |  | ||||||
|   background-color: rgba(68, 138, 255, 0.1); |  | ||||||
|   display: flex; |  | ||||||
| } |  | ||||||
| :is(.admonition-title, summary) p { |  | ||||||
|   margin: 0; |  | ||||||
| } |  | ||||||
| html :is(.admonition-title, summary):last-child { |  | ||||||
|   margin-bottom: 0; |  | ||||||
| } |  | ||||||
| :is(.admonition-title, summary)::before { |  | ||||||
|   position: absolute; |  | ||||||
|   top: 0.625em; |  | ||||||
|   inset-inline-start: 1.6rem; |  | ||||||
|   width: 2rem; |  | ||||||
|   height: 2rem; |  | ||||||
|   background-color: #448aff; |  | ||||||
|   mask-image: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"></svg>'); |  | ||||||
|   -webkit-mask-image: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"></svg>'); |  | ||||||
|   mask-repeat: no-repeat; |  | ||||||
|   -webkit-mask-repeat: no-repeat; |  | ||||||
|   mask-size: contain; |  | ||||||
|   -webkit-mask-size: contain; |  | ||||||
|   content: ""; |  | ||||||
| } |  | ||||||
| :is(.admonition-title, summary):hover a.admonition-anchor-link { |  | ||||||
|   display: initial; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| details.admonition > summary.admonition-title::after { |  | ||||||
|   position: absolute; |  | ||||||
|   top: 0.625em; |  | ||||||
|   inset-inline-end: 1.6rem; |  | ||||||
|   height: 2rem; |  | ||||||
|   width: 2rem; |  | ||||||
|   background-color: currentcolor; |  | ||||||
|   mask-image: var(--md-details-icon); |  | ||||||
|   -webkit-mask-image: var(--md-details-icon); |  | ||||||
|   mask-repeat: no-repeat; |  | ||||||
|   -webkit-mask-repeat: no-repeat; |  | ||||||
|   mask-size: contain; |  | ||||||
|   -webkit-mask-size: contain; |  | ||||||
|   content: ""; |  | ||||||
|   transform: rotate(0deg); |  | ||||||
|   transition: transform 0.25s; |  | ||||||
| } |  | ||||||
| details[open].admonition > summary.admonition-title::after { |  | ||||||
|   transform: rotate(90deg); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| :is(.admonition):is(.note) { |  | ||||||
|   border-color: #448aff; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| :is(.note) > :is(.admonition-title, summary) { |  | ||||||
|   background-color: rgba(68, 138, 255, 0.1); |  | ||||||
| } |  | ||||||
| :is(.note) > :is(.admonition-title, summary)::before { |  | ||||||
|   background-color: #448aff; |  | ||||||
|   mask-image: var(--md-admonition-icon--note); |  | ||||||
|   -webkit-mask-image: var(--md-admonition-icon--note); |  | ||||||
|   mask-repeat: no-repeat; |  | ||||||
|   -webkit-mask-repeat: no-repeat; |  | ||||||
|   mask-size: contain; |  | ||||||
|   -webkit-mask-repeat: no-repeat; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| :is(.admonition):is(.abstract, .summary, .tldr) { |  | ||||||
|   border-color: #00b0ff; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| :is(.abstract, .summary, .tldr) > :is(.admonition-title, summary) { |  | ||||||
|   background-color: rgba(0, 176, 255, 0.1); |  | ||||||
| } |  | ||||||
| :is(.abstract, .summary, .tldr) > :is(.admonition-title, summary)::before { |  | ||||||
|   background-color: #00b0ff; |  | ||||||
|   mask-image: var(--md-admonition-icon--abstract); |  | ||||||
|   -webkit-mask-image: var(--md-admonition-icon--abstract); |  | ||||||
|   mask-repeat: no-repeat; |  | ||||||
|   -webkit-mask-repeat: no-repeat; |  | ||||||
|   mask-size: contain; |  | ||||||
|   -webkit-mask-repeat: no-repeat; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| :is(.admonition):is(.info, .todo) { |  | ||||||
|   border-color: #00b8d4; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| :is(.info, .todo) > :is(.admonition-title, summary) { |  | ||||||
|   background-color: rgba(0, 184, 212, 0.1); |  | ||||||
| } |  | ||||||
| :is(.info, .todo) > :is(.admonition-title, summary)::before { |  | ||||||
|   background-color: #00b8d4; |  | ||||||
|   mask-image: var(--md-admonition-icon--info); |  | ||||||
|   -webkit-mask-image: var(--md-admonition-icon--info); |  | ||||||
|   mask-repeat: no-repeat; |  | ||||||
|   -webkit-mask-repeat: no-repeat; |  | ||||||
|   mask-size: contain; |  | ||||||
|   -webkit-mask-repeat: no-repeat; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| :is(.admonition):is(.tip, .hint, .important) { |  | ||||||
|   border-color: #00bfa5; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| :is(.tip, .hint, .important) > :is(.admonition-title, summary) { |  | ||||||
|   background-color: rgba(0, 191, 165, 0.1); |  | ||||||
| } |  | ||||||
| :is(.tip, .hint, .important) > :is(.admonition-title, summary)::before { |  | ||||||
|   background-color: #00bfa5; |  | ||||||
|   mask-image: var(--md-admonition-icon--tip); |  | ||||||
|   -webkit-mask-image: var(--md-admonition-icon--tip); |  | ||||||
|   mask-repeat: no-repeat; |  | ||||||
|   -webkit-mask-repeat: no-repeat; |  | ||||||
|   mask-size: contain; |  | ||||||
|   -webkit-mask-repeat: no-repeat; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| :is(.admonition):is(.success, .check, .done) { |  | ||||||
|   border-color: #00c853; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| :is(.success, .check, .done) > :is(.admonition-title, summary) { |  | ||||||
|   background-color: rgba(0, 200, 83, 0.1); |  | ||||||
| } |  | ||||||
| :is(.success, .check, .done) > :is(.admonition-title, summary)::before { |  | ||||||
|   background-color: #00c853; |  | ||||||
|   mask-image: var(--md-admonition-icon--success); |  | ||||||
|   -webkit-mask-image: var(--md-admonition-icon--success); |  | ||||||
|   mask-repeat: no-repeat; |  | ||||||
|   -webkit-mask-repeat: no-repeat; |  | ||||||
|   mask-size: contain; |  | ||||||
|   -webkit-mask-repeat: no-repeat; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| :is(.admonition):is(.question, .help, .faq) { |  | ||||||
|   border-color: #64dd17; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| :is(.question, .help, .faq) > :is(.admonition-title, summary) { |  | ||||||
|   background-color: rgba(100, 221, 23, 0.1); |  | ||||||
| } |  | ||||||
| :is(.question, .help, .faq) > :is(.admonition-title, summary)::before { |  | ||||||
|   background-color: #64dd17; |  | ||||||
|   mask-image: var(--md-admonition-icon--question); |  | ||||||
|   -webkit-mask-image: var(--md-admonition-icon--question); |  | ||||||
|   mask-repeat: no-repeat; |  | ||||||
|   -webkit-mask-repeat: no-repeat; |  | ||||||
|   mask-size: contain; |  | ||||||
|   -webkit-mask-repeat: no-repeat; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| :is(.admonition):is(.warning, .caution, .attention) { |  | ||||||
|   border-color: #ff9100; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| :is(.warning, .caution, .attention) > :is(.admonition-title, summary) { |  | ||||||
|   background-color: rgba(255, 145, 0, 0.1); |  | ||||||
| } |  | ||||||
| :is(.warning, .caution, .attention) > :is(.admonition-title, summary)::before { |  | ||||||
|   background-color: #ff9100; |  | ||||||
|   mask-image: var(--md-admonition-icon--warning); |  | ||||||
|   -webkit-mask-image: var(--md-admonition-icon--warning); |  | ||||||
|   mask-repeat: no-repeat; |  | ||||||
|   -webkit-mask-repeat: no-repeat; |  | ||||||
|   mask-size: contain; |  | ||||||
|   -webkit-mask-repeat: no-repeat; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| :is(.admonition):is(.failure, .fail, .missing) { |  | ||||||
|   border-color: #ff5252; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| :is(.failure, .fail, .missing) > :is(.admonition-title, summary) { |  | ||||||
|   background-color: rgba(255, 82, 82, 0.1); |  | ||||||
| } |  | ||||||
| :is(.failure, .fail, .missing) > :is(.admonition-title, summary)::before { |  | ||||||
|   background-color: #ff5252; |  | ||||||
|   mask-image: var(--md-admonition-icon--failure); |  | ||||||
|   -webkit-mask-image: var(--md-admonition-icon--failure); |  | ||||||
|   mask-repeat: no-repeat; |  | ||||||
|   -webkit-mask-repeat: no-repeat; |  | ||||||
|   mask-size: contain; |  | ||||||
|   -webkit-mask-repeat: no-repeat; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| :is(.admonition):is(.danger, .error) { |  | ||||||
|   border-color: #ff1744; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| :is(.danger, .error) > :is(.admonition-title, summary) { |  | ||||||
|   background-color: rgba(255, 23, 68, 0.1); |  | ||||||
| } |  | ||||||
| :is(.danger, .error) > :is(.admonition-title, summary)::before { |  | ||||||
|   background-color: #ff1744; |  | ||||||
|   mask-image: var(--md-admonition-icon--danger); |  | ||||||
|   -webkit-mask-image: var(--md-admonition-icon--danger); |  | ||||||
|   mask-repeat: no-repeat; |  | ||||||
|   -webkit-mask-repeat: no-repeat; |  | ||||||
|   mask-size: contain; |  | ||||||
|   -webkit-mask-repeat: no-repeat; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| :is(.admonition):is(.bug) { |  | ||||||
|   border-color: #f50057; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| :is(.bug) > :is(.admonition-title, summary) { |  | ||||||
|   background-color: rgba(245, 0, 87, 0.1); |  | ||||||
| } |  | ||||||
| :is(.bug) > :is(.admonition-title, summary)::before { |  | ||||||
|   background-color: #f50057; |  | ||||||
|   mask-image: var(--md-admonition-icon--bug); |  | ||||||
|   -webkit-mask-image: var(--md-admonition-icon--bug); |  | ||||||
|   mask-repeat: no-repeat; |  | ||||||
|   -webkit-mask-repeat: no-repeat; |  | ||||||
|   mask-size: contain; |  | ||||||
|   -webkit-mask-repeat: no-repeat; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| :is(.admonition):is(.example) { |  | ||||||
|   border-color: #7c4dff; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| :is(.example) > :is(.admonition-title, summary) { |  | ||||||
|   background-color: rgba(124, 77, 255, 0.1); |  | ||||||
| } |  | ||||||
| :is(.example) > :is(.admonition-title, summary)::before { |  | ||||||
|   background-color: #7c4dff; |  | ||||||
|   mask-image: var(--md-admonition-icon--example); |  | ||||||
|   -webkit-mask-image: var(--md-admonition-icon--example); |  | ||||||
|   mask-repeat: no-repeat; |  | ||||||
|   -webkit-mask-repeat: no-repeat; |  | ||||||
|   mask-size: contain; |  | ||||||
|   -webkit-mask-repeat: no-repeat; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| :is(.admonition):is(.quote, .cite) { |  | ||||||
|   border-color: #9e9e9e; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| :is(.quote, .cite) > :is(.admonition-title, summary) { |  | ||||||
|   background-color: rgba(158, 158, 158, 0.1); |  | ||||||
| } |  | ||||||
| :is(.quote, .cite) > :is(.admonition-title, summary)::before { |  | ||||||
|   background-color: #9e9e9e; |  | ||||||
|   mask-image: var(--md-admonition-icon--quote); |  | ||||||
|   -webkit-mask-image: var(--md-admonition-icon--quote); |  | ||||||
|   mask-repeat: no-repeat; |  | ||||||
|   -webkit-mask-repeat: no-repeat; |  | ||||||
|   mask-size: contain; |  | ||||||
|   -webkit-mask-repeat: no-repeat; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .navy :is(.admonition) { |  | ||||||
|   background-color: var(--sidebar-bg); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .ayu :is(.admonition), .coal :is(.admonition) { |  | ||||||
|   background-color: var(--theme-hover); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .rust :is(.admonition) { |  | ||||||
|   background-color: var(--sidebar-bg); |  | ||||||
|   color: var(--sidebar-fg); |  | ||||||
| } |  | ||||||
| .rust .admonition-anchor-link:link, .rust .admonition-anchor-link:visited { |  | ||||||
|   color: var(--sidebar-fg); |  | ||||||
| } |  | ||||||
| @ -1,212 +0,0 @@ | |||||||
| <!DOCTYPE HTML> |  | ||||||
| <html lang="en" class="sidebar-visible no-js light"> |  | ||||||
|     <head> |  | ||||||
|         <!-- Book generated using mdBook --> |  | ||||||
|         <meta charset="UTF-8"> |  | ||||||
|         <title>Users auths - Doc Server</title> |  | ||||||
|         <base href="/docserver/"> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <!-- Custom HTML head --> |  | ||||||
|          |  | ||||||
|         <meta name="description" content="Doc Server"> |  | ||||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> |  | ||||||
|         <meta name="theme-color" content="#ffffff" /> |  | ||||||
| 
 |  | ||||||
|         <link rel="icon" href="/docserver/favicon.svg"> |  | ||||||
|         <link rel="shortcut icon" href="/docserver/favicon.png"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/variables.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/general.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/chrome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/print.css" media="print"> |  | ||||||
| 
 |  | ||||||
|         <!-- Fonts --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/FontAwesome/css/font-awesome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/fonts/fonts.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Highlight.js Stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/highlight.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/tomorrow-night.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/ayu-highlight.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom theme stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/custom.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/mdbook-admonish.css"> |  | ||||||
| 
 |  | ||||||
|     </head> |  | ||||||
|     <body> |  | ||||||
|     <div id="body-container"> |  | ||||||
|         <!-- Provide site root to javascript --> |  | ||||||
|         <script> |  | ||||||
|             var path_to_root = "/docserver/"; |  | ||||||
|             var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light"; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Work around some values being stored in localStorage wrapped in quotes --> |  | ||||||
|         <script> |  | ||||||
|             try { |  | ||||||
|                 var theme = localStorage.getItem('mdbook-theme'); |  | ||||||
|                 var sidebar = localStorage.getItem('mdbook-sidebar'); |  | ||||||
| 
 |  | ||||||
|                 if (theme.startsWith('"') && theme.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (sidebar.startsWith('"') && sidebar.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); |  | ||||||
|                 } |  | ||||||
|             } catch (e) { } |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Set the theme before any content is loaded, prevents flash --> |  | ||||||
|         <script> |  | ||||||
|             var theme; |  | ||||||
|             try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } |  | ||||||
|             if (theme === null || theme === undefined) { theme = default_theme; } |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             html.classList.remove('no-js') |  | ||||||
|             html.classList.remove('light') |  | ||||||
|             html.classList.add(theme); |  | ||||||
|             html.classList.add('js'); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Hide / unhide sidebar before it is displayed --> |  | ||||||
|         <script> |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             var sidebar = null; |  | ||||||
|             if (document.body.clientWidth >= 1080) { |  | ||||||
|                 try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } |  | ||||||
|                 sidebar = sidebar || 'visible'; |  | ||||||
|             } else { |  | ||||||
|                 sidebar = 'hidden'; |  | ||||||
|             } |  | ||||||
|             html.classList.remove('sidebar-visible'); |  | ||||||
|             html.classList.add("sidebar-" + sidebar); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <nav id="sidebar" class="sidebar" aria-label="Table of contents"> |  | ||||||
|             <div class="sidebar-scrollbox"> |  | ||||||
|                 <ol class="chapter"><li class="chapter-item "><a href="/docserver/introduction.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li class="chapter-item "><a href="/docserver/index.html"><strong aria-hidden="true">2.</strong> What is this ?</a></li><li class="chapter-item "><a href="/docserver/features.html"><strong aria-hidden="true">3.</strong> Features</a></li><li class="chapter-item "><a href="/docserver/howto.html"><strong aria-hidden="true">4.</strong> How to</a></li><li class="chapter-item "><a href="/docserver/quick-start.html"><strong aria-hidden="true">5.</strong> Quick Start</a></li><li class="spacer"></li><li class="chapter-item affix "><li class="part-title">Server and Content</li><li class="chapter-item "><a href="/docserver/one_server.html"><strong aria-hidden="true">6.</strong> One web server instance</a></li><li class="chapter-item "><a href="/docserver/server_modes.html"><strong aria-hidden="true">7.</strong> Server modes</a></li><li class="chapter-item "><a href="/docserver/static_content.html"><strong aria-hidden="true">8.</strong> Static contents</a></li><li class="chapter-item "><a href="/docserver/url_path.html"><strong aria-hidden="true">9.</strong> url_path prefix</a></li><li class="chapter-item "><a href="/docserver/protect_access.html"><strong aria-hidden="true">10.</strong> Protect access</a></li><li class="chapter-item affix "><li class="part-title">Users and Policies</li><li class="chapter-item "><a href="/docserver/users.html"><strong aria-hidden="true">11.</strong> Users</a></li><li class="chapter-item "><a href="/docserver/users_sql.html"><strong aria-hidden="true">12.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/users_file_storage.html"><strong aria-hidden="true">13.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/roles.html"><strong aria-hidden="true">14.</strong> Roles</a></li><li class="chapter-item expanded "><a href="/docserver/auths.html" class="active"><strong aria-hidden="true">15.</strong> Users auths</a></li><li class="chapter-item "><a href="/docserver/policies.html"><strong aria-hidden="true">16.</strong> Access policies</a></li><li class="chapter-item "><a href="/docserver/adminusers.html"><strong aria-hidden="true">17.</strong> Users Admin</a></li><li class="chapter-item affix "><li class="part-title">Sessions</li><li class="chapter-item "><a href="/docserver/sessions.html"><strong aria-hidden="true">18.</strong> Session data</a></li><li class="chapter-item "><a href="/docserver/pasetoken.html"><strong aria-hidden="true">19.</strong> Pasetoken</a></li><li class="chapter-item "><a href="/docserver/sessions_sql.html"><strong aria-hidden="true">20.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/sessions_file_storage.html"><strong aria-hidden="true">21.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/cookie.html"><strong aria-hidden="true">22.</strong> Cookie set</a></li><li class="chapter-item affix "><li class="part-title">Logs and Trace</li><li class="chapter-item "><a href="/docserver/trace.html"><strong aria-hidden="true">23.</strong> Traced</a></li><li class="chapter-item "><a href="/docserver/logs.html"><strong aria-hidden="true">24.</strong> Sessions logs</a></li><li class="chapter-item affix "><li class="part-title">Configuration</li><li class="chapter-item "><a href="/docserver/configuration.html"><strong aria-hidden="true">25.</strong> Configurable service</a></li><li class="chapter-item "><a href="/docserver/settings.html"><strong aria-hidden="true">26.</strong> Config settings</a></li><li class="spacer"></li></ol> |  | ||||||
|             </div> |  | ||||||
|             <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> |  | ||||||
|         </nav> |  | ||||||
| 
 |  | ||||||
|         <div id="page-wrapper" class="page-wrapper"> |  | ||||||
| 
 |  | ||||||
|             <div class="page"> |  | ||||||
|                                 <div id="menu-bar-hover-placeholder"></div> |  | ||||||
|                 <div id="menu-bar" class="menu-bar sticky bordered"> |  | ||||||
|                     <div class="left-buttons"> |  | ||||||
|                         <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> |  | ||||||
|                             <i class="fa fa-bars"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="sidebar-toggle" onclick="location.href='/'" class="icon-button" type="button" title="Home" aria-label="Home" aria-controls=""> |  | ||||||
|                             <i class="fa fa-home"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> |  | ||||||
|                             <i class="fa fa-paint-brush"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> |  | ||||||
|                         </ul> |  | ||||||
|                         <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> |  | ||||||
|                             <i class="fa fa-search"></i> |  | ||||||
|                         </button> |  | ||||||
|                     </div> |  | ||||||
| 
 |  | ||||||
|                     <h1 class="menu-title">Doc Server</h1> |  | ||||||
| 
 |  | ||||||
|                     <div class="right-buttons"> |  | ||||||
|                         <a href="/docserver/print.html" title="Print this book" aria-label="Print this book"> |  | ||||||
|                             <i id="print-button" class="fa fa-print"></i> |  | ||||||
|                         </a> |  | ||||||
|                         <a href="/logout" title="Sing out" aria-label="Sign out"> |  | ||||||
|                             <i id="logout-button" class="fa fa-sign-out"></i> |  | ||||||
|                         </a> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div id="search-wrapper" class="hidden"> |  | ||||||
|                     <form id="searchbar-outer" class="searchbar-outer"> |  | ||||||
|                         <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> |  | ||||||
|                     </form> |  | ||||||
|                     <div id="searchresults-outer" class="searchresults-outer hidden"> |  | ||||||
|                         <div id="searchresults-header" class="searchresults-header"></div> |  | ||||||
|                         <ul id="searchresults"> |  | ||||||
|                         </ul> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> |  | ||||||
|                 <script> |  | ||||||
|                     document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); |  | ||||||
|                     document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); |  | ||||||
|                     Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { |  | ||||||
|                         link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); |  | ||||||
|                     }); |  | ||||||
|                 </script> |  | ||||||
| 
 |  | ||||||
|                 <div id="content" class="content"> |  | ||||||
|                     <main> |  | ||||||
|                         <h1 id="users-authentication-and-authorizations"><a class="header" href="#users-authentication-and-authorizations">Users authentication and authorizations</a></h1> |  | ||||||
| 
 |  | ||||||
|                     </main> |  | ||||||
| 
 |  | ||||||
|                     <nav class="nav-wrapper" aria-label="Page navigation"> |  | ||||||
|                         <!-- Mobile navigation buttons --> |  | ||||||
|                             <a rel="prev" href="roles.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                                 <i class="fa fa-angle-left"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                             <a rel="next" href="policies.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                                 <i class="fa fa-angle-right"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                         <div style="clear: both"></div> |  | ||||||
|                     </nav> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
| 
 |  | ||||||
|             <nav class="nav-wide-wrapper" aria-label="Page navigation"> |  | ||||||
|                     <a rel="prev" href="roles.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                         <i class="fa fa-angle-left"></i> |  | ||||||
|                     </a> |  | ||||||
| 
 |  | ||||||
|                     <a rel="next" href="policies.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                         <i class="fa fa-angle-right"></i> |  | ||||||
|                     </a> |  | ||||||
|             </nav> |  | ||||||
| 
 |  | ||||||
|         </div> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <script> |  | ||||||
|             window.playground_copyable = true; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/ace.js"></script> |  | ||||||
|         <script src="/docserver/editor.js"></script> |  | ||||||
|         <script src="/docserver/mode-rust.js"></script> |  | ||||||
|         <script src="/docserver/theme-dawn.js"></script> |  | ||||||
|         <script src="/docserver/theme-tomorrow_night.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/elasticlunr.min.js"></script> |  | ||||||
|         <script src="/docserver/mark.min.js"></script> |  | ||||||
|         <script src="/docserver/searcher.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/clipboard.min.js"></script> |  | ||||||
|         <script src="/docserver/highlight.js"></script> |  | ||||||
|         <script src="/docserver/book.js"></script> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom JS scripts --> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     </div> |  | ||||||
|     </body> |  | ||||||
| </html> |  | ||||||
| @ -1,78 +0,0 @@ | |||||||
| /* |  | ||||||
| Based off of the Ayu theme |  | ||||||
| Original by Dempfi (https://github.com/dempfi/ayu) |  | ||||||
| */ |  | ||||||
| 
 |  | ||||||
| .hljs { |  | ||||||
|   display: block; |  | ||||||
|   overflow-x: auto; |  | ||||||
|   background: #191f26; |  | ||||||
|   color: #e6e1cf; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .hljs-comment, |  | ||||||
| .hljs-quote { |  | ||||||
|   color: #5c6773; |  | ||||||
|   font-style: italic; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .hljs-variable, |  | ||||||
| .hljs-template-variable, |  | ||||||
| .hljs-attribute, |  | ||||||
| .hljs-attr, |  | ||||||
| .hljs-regexp, |  | ||||||
| .hljs-link, |  | ||||||
| .hljs-selector-id, |  | ||||||
| .hljs-selector-class { |  | ||||||
|   color: #ff7733; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .hljs-number, |  | ||||||
| .hljs-meta, |  | ||||||
| .hljs-builtin-name, |  | ||||||
| .hljs-literal, |  | ||||||
| .hljs-type, |  | ||||||
| .hljs-params { |  | ||||||
|   color: #ffee99; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .hljs-string, |  | ||||||
| .hljs-bullet { |  | ||||||
|   color: #b8cc52; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .hljs-title, |  | ||||||
| .hljs-built_in, |  | ||||||
| .hljs-section { |  | ||||||
|   color: #ffb454; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .hljs-keyword, |  | ||||||
| .hljs-selector-tag, |  | ||||||
| .hljs-symbol { |  | ||||||
|   color: #ff7733; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .hljs-name { |  | ||||||
|     color: #36a3d9; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .hljs-tag { |  | ||||||
|     color: #00568d; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .hljs-emphasis { |  | ||||||
|   font-style: italic; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .hljs-strong { |  | ||||||
|   font-weight: bold; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .hljs-addition { |  | ||||||
|   color: #91b362; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .hljs-deletion { |  | ||||||
|   color: #d96c75; |  | ||||||
| } |  | ||||||
| @ -1,688 +0,0 @@ | |||||||
| "use strict"; |  | ||||||
| 
 |  | ||||||
| // Fix back button cache problem
 |  | ||||||
| window.onunload = function () { }; |  | ||||||
| 
 |  | ||||||
| // Global variable, shared between modules
 |  | ||||||
| function playground_text(playground, hidden = true) { |  | ||||||
|     let code_block = playground.querySelector("code"); |  | ||||||
| 
 |  | ||||||
|     if (window.ace && code_block.classList.contains("editable")) { |  | ||||||
|         let editor = window.ace.edit(code_block); |  | ||||||
|         return editor.getValue(); |  | ||||||
|     } else if (hidden) { |  | ||||||
|         return code_block.textContent; |  | ||||||
|     } else { |  | ||||||
|         return code_block.innerText; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| (function codeSnippets() { |  | ||||||
|     function fetch_with_timeout(url, options, timeout = 6000) { |  | ||||||
|         return Promise.race([ |  | ||||||
|             fetch(url, options), |  | ||||||
|             new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), timeout)) |  | ||||||
|         ]); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     var playgrounds = Array.from(document.querySelectorAll(".playground")); |  | ||||||
|     if (playgrounds.length > 0) { |  | ||||||
|         fetch_with_timeout("https://play.rust-lang.org/meta/crates", { |  | ||||||
|             headers: { |  | ||||||
|                 'Content-Type': "application/json", |  | ||||||
|             }, |  | ||||||
|             method: 'POST', |  | ||||||
|             mode: 'cors', |  | ||||||
|         }) |  | ||||||
|         .then(response => response.json()) |  | ||||||
|         .then(response => { |  | ||||||
|             // get list of crates available in the rust playground
 |  | ||||||
|             let playground_crates = response.crates.map(item => item["id"]); |  | ||||||
|             playgrounds.forEach(block => handle_crate_list_update(block, playground_crates)); |  | ||||||
|         }); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     function handle_crate_list_update(playground_block, playground_crates) { |  | ||||||
|         // update the play buttons after receiving the response
 |  | ||||||
|         update_play_button(playground_block, playground_crates); |  | ||||||
| 
 |  | ||||||
|         // and install on change listener to dynamically update ACE editors
 |  | ||||||
|         if (window.ace) { |  | ||||||
|             let code_block = playground_block.querySelector("code"); |  | ||||||
|             if (code_block.classList.contains("editable")) { |  | ||||||
|                 let editor = window.ace.edit(code_block); |  | ||||||
|                 editor.addEventListener("change", function (e) { |  | ||||||
|                     update_play_button(playground_block, playground_crates); |  | ||||||
|                 }); |  | ||||||
|                 // add Ctrl-Enter command to execute rust code
 |  | ||||||
|                 editor.commands.addCommand({ |  | ||||||
|                     name: "run", |  | ||||||
|                     bindKey: { |  | ||||||
|                         win: "Ctrl-Enter", |  | ||||||
|                         mac: "Ctrl-Enter" |  | ||||||
|                     }, |  | ||||||
|                     exec: _editor => run_rust_code(playground_block) |  | ||||||
|                 }); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     // updates the visibility of play button based on `no_run` class and
 |  | ||||||
|     // used crates vs ones available on https://play.rust-lang.org
 |  | ||||||
|     function update_play_button(pre_block, playground_crates) { |  | ||||||
|         var play_button = pre_block.querySelector(".play-button"); |  | ||||||
| 
 |  | ||||||
|         // skip if code is `no_run`
 |  | ||||||
|         if (pre_block.querySelector('code').classList.contains("no_run")) { |  | ||||||
|             play_button.classList.add("hidden"); |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         // get list of `extern crate`'s from snippet
 |  | ||||||
|         var txt = playground_text(pre_block); |  | ||||||
|         var re = /extern\s+crate\s+([a-zA-Z_0-9]+)\s*;/g; |  | ||||||
|         var snippet_crates = []; |  | ||||||
|         var item; |  | ||||||
|         while (item = re.exec(txt)) { |  | ||||||
|             snippet_crates.push(item[1]); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         // check if all used crates are available on play.rust-lang.org
 |  | ||||||
|         var all_available = snippet_crates.every(function (elem) { |  | ||||||
|             return playground_crates.indexOf(elem) > -1; |  | ||||||
|         }); |  | ||||||
| 
 |  | ||||||
|         if (all_available) { |  | ||||||
|             play_button.classList.remove("hidden"); |  | ||||||
|         } else { |  | ||||||
|             play_button.classList.add("hidden"); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     function run_rust_code(code_block) { |  | ||||||
|         var result_block = code_block.querySelector(".result"); |  | ||||||
|         if (!result_block) { |  | ||||||
|             result_block = document.createElement('code'); |  | ||||||
|             result_block.className = 'result hljs language-bash'; |  | ||||||
| 
 |  | ||||||
|             code_block.append(result_block); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         let text = playground_text(code_block); |  | ||||||
|         let classes = code_block.querySelector('code').classList; |  | ||||||
|         let edition = "2015"; |  | ||||||
|         if(classes.contains("edition2018")) { |  | ||||||
|             edition = "2018"; |  | ||||||
|         } else if(classes.contains("edition2021")) { |  | ||||||
|             edition = "2021"; |  | ||||||
|         } |  | ||||||
|         var params = { |  | ||||||
|             version: "stable", |  | ||||||
|             optimize: "0", |  | ||||||
|             code: text, |  | ||||||
|             edition: edition |  | ||||||
|         }; |  | ||||||
| 
 |  | ||||||
|         if (text.indexOf("#![feature") !== -1) { |  | ||||||
|             params.version = "nightly"; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         result_block.innerText = "Running..."; |  | ||||||
| 
 |  | ||||||
|         fetch_with_timeout("https://play.rust-lang.org/evaluate.json", { |  | ||||||
|             headers: { |  | ||||||
|                 'Content-Type': "application/json", |  | ||||||
|             }, |  | ||||||
|             method: 'POST', |  | ||||||
|             mode: 'cors', |  | ||||||
|             body: JSON.stringify(params) |  | ||||||
|         }) |  | ||||||
|         .then(response => response.json()) |  | ||||||
|         .then(response => { |  | ||||||
|             if (response.result.trim() === '') { |  | ||||||
|                 result_block.innerText = "No output"; |  | ||||||
|                 result_block.classList.add("result-no-output"); |  | ||||||
|             } else { |  | ||||||
|                 result_block.innerText = response.result; |  | ||||||
|                 result_block.classList.remove("result-no-output"); |  | ||||||
|             } |  | ||||||
|         }) |  | ||||||
|         .catch(error => result_block.innerText = "Playground Communication: " + error.message); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     // Syntax highlighting Configuration
 |  | ||||||
|     hljs.configure({ |  | ||||||
|         tabReplace: '    ', // 4 spaces
 |  | ||||||
|         languages: [],      // Languages used for auto-detection
 |  | ||||||
|     }); |  | ||||||
| 
 |  | ||||||
|     let code_nodes = Array |  | ||||||
|         .from(document.querySelectorAll('code')) |  | ||||||
|         // Don't highlight `inline code` blocks in headers.
 |  | ||||||
|         .filter(function (node) {return !node.parentElement.classList.contains("header"); }); |  | ||||||
| 
 |  | ||||||
|     if (window.ace) { |  | ||||||
|         // language-rust class needs to be removed for editable
 |  | ||||||
|         // blocks or highlightjs will capture events
 |  | ||||||
|         code_nodes |  | ||||||
|             .filter(function (node) {return node.classList.contains("editable"); }) |  | ||||||
|             .forEach(function (block) { block.classList.remove('language-rust'); }); |  | ||||||
| 
 |  | ||||||
|         code_nodes |  | ||||||
|             .filter(function (node) {return !node.classList.contains("editable"); }) |  | ||||||
|             .forEach(function (block) { hljs.highlightBlock(block); }); |  | ||||||
|     } else { |  | ||||||
|         code_nodes.forEach(function (block) { hljs.highlightBlock(block); }); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     // Adding the hljs class gives code blocks the color css
 |  | ||||||
|     // even if highlighting doesn't apply
 |  | ||||||
|     code_nodes.forEach(function (block) { block.classList.add('hljs'); }); |  | ||||||
| 
 |  | ||||||
|     Array.from(document.querySelectorAll("code.language-rust")).forEach(function (block) { |  | ||||||
| 
 |  | ||||||
|         var lines = Array.from(block.querySelectorAll('.boring')); |  | ||||||
|         // If no lines were hidden, return
 |  | ||||||
|         if (!lines.length) { return; } |  | ||||||
|         block.classList.add("hide-boring"); |  | ||||||
| 
 |  | ||||||
|         var buttons = document.createElement('div'); |  | ||||||
|         buttons.className = 'buttons'; |  | ||||||
|         buttons.innerHTML = "<button class=\"fa fa-eye\" title=\"Show hidden lines\" aria-label=\"Show hidden lines\"></button>"; |  | ||||||
| 
 |  | ||||||
|         // add expand button
 |  | ||||||
|         var pre_block = block.parentNode; |  | ||||||
|         pre_block.insertBefore(buttons, pre_block.firstChild); |  | ||||||
| 
 |  | ||||||
|         pre_block.querySelector('.buttons').addEventListener('click', function (e) { |  | ||||||
|             if (e.target.classList.contains('fa-eye')) { |  | ||||||
|                 e.target.classList.remove('fa-eye'); |  | ||||||
|                 e.target.classList.add('fa-eye-slash'); |  | ||||||
|                 e.target.title = 'Hide lines'; |  | ||||||
|                 e.target.setAttribute('aria-label', e.target.title); |  | ||||||
| 
 |  | ||||||
|                 block.classList.remove('hide-boring'); |  | ||||||
|             } else if (e.target.classList.contains('fa-eye-slash')) { |  | ||||||
|                 e.target.classList.remove('fa-eye-slash'); |  | ||||||
|                 e.target.classList.add('fa-eye'); |  | ||||||
|                 e.target.title = 'Show hidden lines'; |  | ||||||
|                 e.target.setAttribute('aria-label', e.target.title); |  | ||||||
| 
 |  | ||||||
|                 block.classList.add('hide-boring'); |  | ||||||
|             } |  | ||||||
|         }); |  | ||||||
|     }); |  | ||||||
| 
 |  | ||||||
|     if (window.playground_copyable) { |  | ||||||
|         Array.from(document.querySelectorAll('pre code')).forEach(function (block) { |  | ||||||
|             var pre_block = block.parentNode; |  | ||||||
|             if (!pre_block.classList.contains('playground')) { |  | ||||||
|                 var buttons = pre_block.querySelector(".buttons"); |  | ||||||
|                 if (!buttons) { |  | ||||||
|                     buttons = document.createElement('div'); |  | ||||||
|                     buttons.className = 'buttons'; |  | ||||||
|                     pre_block.insertBefore(buttons, pre_block.firstChild); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 var clipButton = document.createElement('button'); |  | ||||||
|                 clipButton.className = 'fa fa-copy clip-button'; |  | ||||||
|                 clipButton.title = 'Copy to clipboard'; |  | ||||||
|                 clipButton.setAttribute('aria-label', clipButton.title); |  | ||||||
|                 clipButton.innerHTML = '<i class=\"tooltiptext\"></i>'; |  | ||||||
| 
 |  | ||||||
|                 buttons.insertBefore(clipButton, buttons.firstChild); |  | ||||||
|             } |  | ||||||
|         }); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     // Process playground code blocks
 |  | ||||||
|     Array.from(document.querySelectorAll(".playground")).forEach(function (pre_block) { |  | ||||||
|         // Add play button
 |  | ||||||
|         var buttons = pre_block.querySelector(".buttons"); |  | ||||||
|         if (!buttons) { |  | ||||||
|             buttons = document.createElement('div'); |  | ||||||
|             buttons.className = 'buttons'; |  | ||||||
|             pre_block.insertBefore(buttons, pre_block.firstChild); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         var runCodeButton = document.createElement('button'); |  | ||||||
|         runCodeButton.className = 'fa fa-play play-button'; |  | ||||||
|         runCodeButton.hidden = true; |  | ||||||
|         runCodeButton.title = 'Run this code'; |  | ||||||
|         runCodeButton.setAttribute('aria-label', runCodeButton.title); |  | ||||||
| 
 |  | ||||||
|         buttons.insertBefore(runCodeButton, buttons.firstChild); |  | ||||||
|         runCodeButton.addEventListener('click', function (e) { |  | ||||||
|             run_rust_code(pre_block); |  | ||||||
|         }); |  | ||||||
| 
 |  | ||||||
|         if (window.playground_copyable) { |  | ||||||
|             var copyCodeClipboardButton = document.createElement('button'); |  | ||||||
|             copyCodeClipboardButton.className = 'fa fa-copy clip-button'; |  | ||||||
|             copyCodeClipboardButton.innerHTML = '<i class="tooltiptext"></i>'; |  | ||||||
|             copyCodeClipboardButton.title = 'Copy to clipboard'; |  | ||||||
|             copyCodeClipboardButton.setAttribute('aria-label', copyCodeClipboardButton.title); |  | ||||||
| 
 |  | ||||||
|             buttons.insertBefore(copyCodeClipboardButton, buttons.firstChild); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         let code_block = pre_block.querySelector("code"); |  | ||||||
|         if (window.ace && code_block.classList.contains("editable")) { |  | ||||||
|             var undoChangesButton = document.createElement('button'); |  | ||||||
|             undoChangesButton.className = 'fa fa-history reset-button'; |  | ||||||
|             undoChangesButton.title = 'Undo changes'; |  | ||||||
|             undoChangesButton.setAttribute('aria-label', undoChangesButton.title); |  | ||||||
| 
 |  | ||||||
|             buttons.insertBefore(undoChangesButton, buttons.firstChild); |  | ||||||
| 
 |  | ||||||
|             undoChangesButton.addEventListener('click', function () { |  | ||||||
|                 let editor = window.ace.edit(code_block); |  | ||||||
|                 editor.setValue(editor.originalCode); |  | ||||||
|                 editor.clearSelection(); |  | ||||||
|             }); |  | ||||||
|         } |  | ||||||
|     }); |  | ||||||
| })(); |  | ||||||
| 
 |  | ||||||
| (function themes() { |  | ||||||
|     var html = document.querySelector('html'); |  | ||||||
|     var themeToggleButton = document.getElementById('theme-toggle'); |  | ||||||
|     var themePopup = document.getElementById('theme-list'); |  | ||||||
|     var themeColorMetaTag = document.querySelector('meta[name="theme-color"]'); |  | ||||||
|     var stylesheets = { |  | ||||||
|         ayuHighlight: document.querySelector("[href$='ayu-highlight.css']"), |  | ||||||
|         tomorrowNight: document.querySelector("[href$='tomorrow-night.css']"), |  | ||||||
|         highlight: document.querySelector("[href$='highlight.css']"), |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     function showThemes() { |  | ||||||
|         themePopup.style.display = 'block'; |  | ||||||
|         themeToggleButton.setAttribute('aria-expanded', true); |  | ||||||
|         themePopup.querySelector("button#" + get_theme()).focus(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     function updateThemeSelected() { |  | ||||||
|         themePopup.querySelectorAll('.theme-selected').forEach(function (el) { |  | ||||||
|             el.classList.remove('theme-selected'); |  | ||||||
|         }); |  | ||||||
|         themePopup.querySelector("button#" + get_theme()).classList.add('theme-selected'); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     function hideThemes() { |  | ||||||
|         themePopup.style.display = 'none'; |  | ||||||
|         themeToggleButton.setAttribute('aria-expanded', false); |  | ||||||
|         themeToggleButton.focus(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     function get_theme() { |  | ||||||
|         var theme; |  | ||||||
|         try { theme = localStorage.getItem('mdbook-theme'); } catch (e) { } |  | ||||||
|         if (theme === null || theme === undefined) { |  | ||||||
|             return default_theme; |  | ||||||
|         } else { |  | ||||||
|             return theme; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     function set_theme(theme, store = true) { |  | ||||||
|         let ace_theme; |  | ||||||
| 
 |  | ||||||
|         if (theme == 'coal' || theme == 'navy') { |  | ||||||
|             stylesheets.ayuHighlight.disabled = true; |  | ||||||
|             stylesheets.tomorrowNight.disabled = false; |  | ||||||
|             stylesheets.highlight.disabled = true; |  | ||||||
| 
 |  | ||||||
|             ace_theme = "ace/theme/tomorrow_night"; |  | ||||||
|         } else if (theme == 'ayu') { |  | ||||||
|             stylesheets.ayuHighlight.disabled = false; |  | ||||||
|             stylesheets.tomorrowNight.disabled = true; |  | ||||||
|             stylesheets.highlight.disabled = true; |  | ||||||
|             ace_theme = "ace/theme/tomorrow_night"; |  | ||||||
|         } else { |  | ||||||
|             stylesheets.ayuHighlight.disabled = true; |  | ||||||
|             stylesheets.tomorrowNight.disabled = true; |  | ||||||
|             stylesheets.highlight.disabled = false; |  | ||||||
|             ace_theme = "ace/theme/dawn"; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         setTimeout(function () { |  | ||||||
|             themeColorMetaTag.content = getComputedStyle(document.body).backgroundColor; |  | ||||||
|         }, 1); |  | ||||||
| 
 |  | ||||||
|         if (window.ace && window.editors) { |  | ||||||
|             window.editors.forEach(function (editor) { |  | ||||||
|                 editor.setTheme(ace_theme); |  | ||||||
|             }); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         var previousTheme = get_theme(); |  | ||||||
| 
 |  | ||||||
|         if (store) { |  | ||||||
|             try { localStorage.setItem('mdbook-theme', theme); } catch (e) { } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         html.classList.remove(previousTheme); |  | ||||||
|         html.classList.add(theme); |  | ||||||
|         updateThemeSelected(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     // Set theme
 |  | ||||||
|     var theme = get_theme(); |  | ||||||
| 
 |  | ||||||
|     set_theme(theme, false); |  | ||||||
| 
 |  | ||||||
|     themeToggleButton.addEventListener('click', function () { |  | ||||||
|         if (themePopup.style.display === 'block') { |  | ||||||
|             hideThemes(); |  | ||||||
|         } else { |  | ||||||
|             showThemes(); |  | ||||||
|         } |  | ||||||
|     }); |  | ||||||
| 
 |  | ||||||
|     themePopup.addEventListener('click', function (e) { |  | ||||||
|         var theme; |  | ||||||
|         if (e.target.className === "theme") { |  | ||||||
|             theme = e.target.id; |  | ||||||
|         } else if (e.target.parentElement.className === "theme") { |  | ||||||
|             theme = e.target.parentElement.id; |  | ||||||
|         } else { |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         set_theme(theme); |  | ||||||
|     }); |  | ||||||
| 
 |  | ||||||
|     themePopup.addEventListener('focusout', function(e) { |  | ||||||
|         // e.relatedTarget is null in Safari and Firefox on macOS (see workaround below)
 |  | ||||||
|         if (!!e.relatedTarget && !themeToggleButton.contains(e.relatedTarget) && !themePopup.contains(e.relatedTarget)) { |  | ||||||
|             hideThemes(); |  | ||||||
|         } |  | ||||||
|     }); |  | ||||||
| 
 |  | ||||||
|     // Should not be needed, but it works around an issue on macOS & iOS: https://github.com/rust-lang/mdBook/issues/628
 |  | ||||||
|     document.addEventListener('click', function(e) { |  | ||||||
|         if (themePopup.style.display === 'block' && !themeToggleButton.contains(e.target) && !themePopup.contains(e.target)) { |  | ||||||
|             hideThemes(); |  | ||||||
|         } |  | ||||||
|     }); |  | ||||||
| 
 |  | ||||||
|     document.addEventListener('keydown', function (e) { |  | ||||||
|         if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; } |  | ||||||
|         if (!themePopup.contains(e.target)) { return; } |  | ||||||
| 
 |  | ||||||
|         switch (e.key) { |  | ||||||
|             case 'Escape': |  | ||||||
|                 e.preventDefault(); |  | ||||||
|                 hideThemes(); |  | ||||||
|                 break; |  | ||||||
|             case 'ArrowUp': |  | ||||||
|                 e.preventDefault(); |  | ||||||
|                 var li = document.activeElement.parentElement; |  | ||||||
|                 if (li && li.previousElementSibling) { |  | ||||||
|                     li.previousElementSibling.querySelector('button').focus(); |  | ||||||
|                 } |  | ||||||
|                 break; |  | ||||||
|             case 'ArrowDown': |  | ||||||
|                 e.preventDefault(); |  | ||||||
|                 var li = document.activeElement.parentElement; |  | ||||||
|                 if (li && li.nextElementSibling) { |  | ||||||
|                     li.nextElementSibling.querySelector('button').focus(); |  | ||||||
|                 } |  | ||||||
|                 break; |  | ||||||
|             case 'Home': |  | ||||||
|                 e.preventDefault(); |  | ||||||
|                 themePopup.querySelector('li:first-child button').focus(); |  | ||||||
|                 break; |  | ||||||
|             case 'End': |  | ||||||
|                 e.preventDefault(); |  | ||||||
|                 themePopup.querySelector('li:last-child button').focus(); |  | ||||||
|                 break; |  | ||||||
|         } |  | ||||||
|     }); |  | ||||||
| })(); |  | ||||||
| 
 |  | ||||||
| (function sidebar() { |  | ||||||
|     var html = document.querySelector("html"); |  | ||||||
|     var sidebar = document.getElementById("sidebar"); |  | ||||||
|     var sidebarLinks = document.querySelectorAll('#sidebar a'); |  | ||||||
|     var sidebarToggleButton = document.getElementById("sidebar-toggle"); |  | ||||||
|     var sidebarResizeHandle = document.getElementById("sidebar-resize-handle"); |  | ||||||
|     var firstContact = null; |  | ||||||
| 
 |  | ||||||
|     function showSidebar() { |  | ||||||
|         html.classList.remove('sidebar-hidden') |  | ||||||
|         html.classList.add('sidebar-visible'); |  | ||||||
|         Array.from(sidebarLinks).forEach(function (link) { |  | ||||||
|             link.setAttribute('tabIndex', 0); |  | ||||||
|         }); |  | ||||||
|         sidebarToggleButton.setAttribute('aria-expanded', true); |  | ||||||
|         sidebar.setAttribute('aria-hidden', false); |  | ||||||
|         try { localStorage.setItem('mdbook-sidebar', 'visible'); } catch (e) { } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     var sidebarAnchorToggles = document.querySelectorAll('#sidebar a.toggle'); |  | ||||||
| 
 |  | ||||||
|     function toggleSection(ev) { |  | ||||||
|         ev.currentTarget.parentElement.classList.toggle('expanded'); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     Array.from(sidebarAnchorToggles).forEach(function (el) { |  | ||||||
|         el.addEventListener('click', toggleSection); |  | ||||||
|     }); |  | ||||||
| 
 |  | ||||||
|     function hideSidebar() { |  | ||||||
|         html.classList.remove('sidebar-visible') |  | ||||||
|         html.classList.add('sidebar-hidden'); |  | ||||||
|         Array.from(sidebarLinks).forEach(function (link) { |  | ||||||
|             link.setAttribute('tabIndex', -1); |  | ||||||
|         }); |  | ||||||
|         sidebarToggleButton.setAttribute('aria-expanded', false); |  | ||||||
|         sidebar.setAttribute('aria-hidden', true); |  | ||||||
|         try { localStorage.setItem('mdbook-sidebar', 'hidden'); } catch (e) { } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     // Toggle sidebar
 |  | ||||||
|     sidebarToggleButton.addEventListener('click', function sidebarToggle() { |  | ||||||
|         if (html.classList.contains("sidebar-hidden")) { |  | ||||||
|             var current_width = parseInt( |  | ||||||
|                 document.documentElement.style.getPropertyValue('--sidebar-width'), 10); |  | ||||||
|             if (current_width < 150) { |  | ||||||
|                 document.documentElement.style.setProperty('--sidebar-width', '150px'); |  | ||||||
|             } |  | ||||||
|             showSidebar(); |  | ||||||
|         } else if (html.classList.contains("sidebar-visible")) { |  | ||||||
|             hideSidebar(); |  | ||||||
|         } else { |  | ||||||
|             if (getComputedStyle(sidebar)['transform'] === 'none') { |  | ||||||
|                 hideSidebar(); |  | ||||||
|             } else { |  | ||||||
|                 showSidebar(); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     }); |  | ||||||
| 
 |  | ||||||
|     sidebarResizeHandle.addEventListener('mousedown', initResize, false); |  | ||||||
| 
 |  | ||||||
|     function initResize(e) { |  | ||||||
|         window.addEventListener('mousemove', resize, false); |  | ||||||
|         window.addEventListener('mouseup', stopResize, false); |  | ||||||
|         html.classList.add('sidebar-resizing'); |  | ||||||
|     } |  | ||||||
|     function resize(e) { |  | ||||||
|         var pos = (e.clientX - sidebar.offsetLeft); |  | ||||||
|         if (pos < 20) { |  | ||||||
|             hideSidebar(); |  | ||||||
|         } else { |  | ||||||
|             if (html.classList.contains("sidebar-hidden")) { |  | ||||||
|                 showSidebar(); |  | ||||||
|             } |  | ||||||
|             pos = Math.min(pos, window.innerWidth - 100); |  | ||||||
|             document.documentElement.style.setProperty('--sidebar-width', pos + 'px'); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     //on mouseup remove windows functions mousemove & mouseup
 |  | ||||||
|     function stopResize(e) { |  | ||||||
|         html.classList.remove('sidebar-resizing'); |  | ||||||
|         window.removeEventListener('mousemove', resize, false); |  | ||||||
|         window.removeEventListener('mouseup', stopResize, false); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     document.addEventListener('touchstart', function (e) { |  | ||||||
|         firstContact = { |  | ||||||
|             x: e.touches[0].clientX, |  | ||||||
|             time: Date.now() |  | ||||||
|         }; |  | ||||||
|     }, { passive: true }); |  | ||||||
| 
 |  | ||||||
|     document.addEventListener('touchmove', function (e) { |  | ||||||
|         if (!firstContact) |  | ||||||
|             return; |  | ||||||
| 
 |  | ||||||
|         var curX = e.touches[0].clientX; |  | ||||||
|         var xDiff = curX - firstContact.x, |  | ||||||
|             tDiff = Date.now() - firstContact.time; |  | ||||||
| 
 |  | ||||||
|         if (tDiff < 250 && Math.abs(xDiff) >= 150) { |  | ||||||
|             if (xDiff >= 0 && firstContact.x < Math.min(document.body.clientWidth * 0.25, 300)) |  | ||||||
|                 showSidebar(); |  | ||||||
|             else if (xDiff < 0 && curX < 300) |  | ||||||
|                 hideSidebar(); |  | ||||||
| 
 |  | ||||||
|             firstContact = null; |  | ||||||
|         } |  | ||||||
|     }, { passive: true }); |  | ||||||
| 
 |  | ||||||
|     // Scroll sidebar to current active section
 |  | ||||||
|     var activeSection = document.getElementById("sidebar").querySelector(".active"); |  | ||||||
|     if (activeSection) { |  | ||||||
|         // https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView
 |  | ||||||
|         activeSection.scrollIntoView({ block: 'center' }); |  | ||||||
|     } |  | ||||||
| })(); |  | ||||||
| 
 |  | ||||||
| (function chapterNavigation() { |  | ||||||
|     document.addEventListener('keydown', function (e) { |  | ||||||
|         if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { return; } |  | ||||||
|         if (window.search && window.search.hasFocus()) { return; } |  | ||||||
| 
 |  | ||||||
|         switch (e.key) { |  | ||||||
|             case 'ArrowRight': |  | ||||||
|                 e.preventDefault(); |  | ||||||
|                 var nextButton = document.querySelector('.nav-chapters.next'); |  | ||||||
|                 if (nextButton) { |  | ||||||
|                     window.location.href = nextButton.href; |  | ||||||
|                 } |  | ||||||
|                 break; |  | ||||||
|             case 'ArrowLeft': |  | ||||||
|                 e.preventDefault(); |  | ||||||
|                 var previousButton = document.querySelector('.nav-chapters.previous'); |  | ||||||
|                 if (previousButton) { |  | ||||||
|                     window.location.href = previousButton.href; |  | ||||||
|                 } |  | ||||||
|                 break; |  | ||||||
|         } |  | ||||||
|     }); |  | ||||||
| })(); |  | ||||||
| 
 |  | ||||||
| (function clipboard() { |  | ||||||
|     var clipButtons = document.querySelectorAll('.clip-button'); |  | ||||||
| 
 |  | ||||||
|     function hideTooltip(elem) { |  | ||||||
|         elem.firstChild.innerText = ""; |  | ||||||
|         elem.className = 'fa fa-copy clip-button'; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     function showTooltip(elem, msg) { |  | ||||||
|         elem.firstChild.innerText = msg; |  | ||||||
|         elem.className = 'fa fa-copy tooltipped'; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     var clipboardSnippets = new ClipboardJS('.clip-button', { |  | ||||||
|         text: function (trigger) { |  | ||||||
|             hideTooltip(trigger); |  | ||||||
|             let playground = trigger.closest("pre"); |  | ||||||
|             return playground_text(playground, false); |  | ||||||
|         } |  | ||||||
|     }); |  | ||||||
| 
 |  | ||||||
|     Array.from(clipButtons).forEach(function (clipButton) { |  | ||||||
|         clipButton.addEventListener('mouseout', function (e) { |  | ||||||
|             hideTooltip(e.currentTarget); |  | ||||||
|         }); |  | ||||||
|     }); |  | ||||||
| 
 |  | ||||||
|     clipboardSnippets.on('success', function (e) { |  | ||||||
|         e.clearSelection(); |  | ||||||
|         showTooltip(e.trigger, "Copied!"); |  | ||||||
|     }); |  | ||||||
| 
 |  | ||||||
|     clipboardSnippets.on('error', function (e) { |  | ||||||
|         showTooltip(e.trigger, "Clipboard error!"); |  | ||||||
|     }); |  | ||||||
| })(); |  | ||||||
| 
 |  | ||||||
| (function scrollToTop () { |  | ||||||
|     var menuTitle = document.querySelector('.menu-title'); |  | ||||||
| 
 |  | ||||||
|     menuTitle.addEventListener('click', function () { |  | ||||||
|         document.scrollingElement.scrollTo({ top: 0, behavior: 'smooth' }); |  | ||||||
|     }); |  | ||||||
| })(); |  | ||||||
| 
 |  | ||||||
| (function controllMenu() { |  | ||||||
|     var menu = document.getElementById('menu-bar'); |  | ||||||
| 
 |  | ||||||
|     (function controllPosition() { |  | ||||||
|         var scrollTop = document.scrollingElement.scrollTop; |  | ||||||
|         var prevScrollTop = scrollTop; |  | ||||||
|         var minMenuY = -menu.clientHeight - 50; |  | ||||||
|         // When the script loads, the page can be at any scroll (e.g. if you reforesh it).
 |  | ||||||
|         menu.style.top = scrollTop + 'px'; |  | ||||||
|         // Same as parseInt(menu.style.top.slice(0, -2), but faster
 |  | ||||||
|         var topCache = menu.style.top.slice(0, -2); |  | ||||||
|         menu.classList.remove('sticky'); |  | ||||||
|         var stickyCache = false; // Same as menu.classList.contains('sticky'), but faster
 |  | ||||||
|         document.addEventListener('scroll', function () { |  | ||||||
|             scrollTop = Math.max(document.scrollingElement.scrollTop, 0); |  | ||||||
|             // `null` means that it doesn't need to be updated
 |  | ||||||
|             var nextSticky = null; |  | ||||||
|             var nextTop = null; |  | ||||||
|             var scrollDown = scrollTop > prevScrollTop; |  | ||||||
|             var menuPosAbsoluteY = topCache - scrollTop; |  | ||||||
|             if (scrollDown) { |  | ||||||
|                 nextSticky = false; |  | ||||||
|                 if (menuPosAbsoluteY > 0) { |  | ||||||
|                     nextTop = prevScrollTop; |  | ||||||
|                 } |  | ||||||
|             } else { |  | ||||||
|                 if (menuPosAbsoluteY > 0) { |  | ||||||
|                     nextSticky = true; |  | ||||||
|                 } else if (menuPosAbsoluteY < minMenuY) { |  | ||||||
|                     nextTop = prevScrollTop + minMenuY; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             if (nextSticky === true && stickyCache === false) { |  | ||||||
|                 menu.classList.add('sticky'); |  | ||||||
|                 stickyCache = true; |  | ||||||
|             } else if (nextSticky === false && stickyCache === true) { |  | ||||||
|                 menu.classList.remove('sticky'); |  | ||||||
|                 stickyCache = false; |  | ||||||
|             } |  | ||||||
|             if (nextTop !== null) { |  | ||||||
|                 menu.style.top = nextTop + 'px'; |  | ||||||
|                 topCache = nextTop; |  | ||||||
|             } |  | ||||||
|             prevScrollTop = scrollTop; |  | ||||||
|         }, { passive: true }); |  | ||||||
|     })(); |  | ||||||
|     (function controllBorder() { |  | ||||||
|         menu.classList.remove('bordered'); |  | ||||||
|         document.addEventListener('scroll', function () { |  | ||||||
|             if (menu.offsetTop === 0) { |  | ||||||
|                 menu.classList.remove('bordered'); |  | ||||||
|             } else { |  | ||||||
|                 menu.classList.add('bordered'); |  | ||||||
|             } |  | ||||||
|         }, { passive: true }); |  | ||||||
|     })(); |  | ||||||
| })(); |  | ||||||
| @ -1,430 +0,0 @@ | |||||||
| <!DOCTYPE HTML> |  | ||||||
| <html lang="en" class="sidebar-visible no-js light"> |  | ||||||
|     <head> |  | ||||||
|         <!-- Book generated using mdBook --> |  | ||||||
|         <meta charset="UTF-8"> |  | ||||||
|         <title>Configurable service - Doc Server</title> |  | ||||||
|         <base href="/docserver/"> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <!-- Custom HTML head --> |  | ||||||
|          |  | ||||||
|         <meta name="description" content="Doc Server"> |  | ||||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> |  | ||||||
|         <meta name="theme-color" content="#ffffff" /> |  | ||||||
| 
 |  | ||||||
|         <link rel="icon" href="/docserver/favicon.svg"> |  | ||||||
|         <link rel="shortcut icon" href="/docserver/favicon.png"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/variables.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/general.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/chrome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/print.css" media="print"> |  | ||||||
| 
 |  | ||||||
|         <!-- Fonts --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/FontAwesome/css/font-awesome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/fonts/fonts.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Highlight.js Stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/highlight.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/tomorrow-night.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/ayu-highlight.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom theme stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/custom.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/mdbook-admonish.css"> |  | ||||||
| 
 |  | ||||||
|     </head> |  | ||||||
|     <body> |  | ||||||
|     <div id="body-container"> |  | ||||||
|         <!-- Provide site root to javascript --> |  | ||||||
|         <script> |  | ||||||
|             var path_to_root = "/docserver/"; |  | ||||||
|             var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light"; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Work around some values being stored in localStorage wrapped in quotes --> |  | ||||||
|         <script> |  | ||||||
|             try { |  | ||||||
|                 var theme = localStorage.getItem('mdbook-theme'); |  | ||||||
|                 var sidebar = localStorage.getItem('mdbook-sidebar'); |  | ||||||
| 
 |  | ||||||
|                 if (theme.startsWith('"') && theme.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (sidebar.startsWith('"') && sidebar.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); |  | ||||||
|                 } |  | ||||||
|             } catch (e) { } |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Set the theme before any content is loaded, prevents flash --> |  | ||||||
|         <script> |  | ||||||
|             var theme; |  | ||||||
|             try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } |  | ||||||
|             if (theme === null || theme === undefined) { theme = default_theme; } |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             html.classList.remove('no-js') |  | ||||||
|             html.classList.remove('light') |  | ||||||
|             html.classList.add(theme); |  | ||||||
|             html.classList.add('js'); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Hide / unhide sidebar before it is displayed --> |  | ||||||
|         <script> |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             var sidebar = null; |  | ||||||
|             if (document.body.clientWidth >= 1080) { |  | ||||||
|                 try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } |  | ||||||
|                 sidebar = sidebar || 'visible'; |  | ||||||
|             } else { |  | ||||||
|                 sidebar = 'hidden'; |  | ||||||
|             } |  | ||||||
|             html.classList.remove('sidebar-visible'); |  | ||||||
|             html.classList.add("sidebar-" + sidebar); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <nav id="sidebar" class="sidebar" aria-label="Table of contents"> |  | ||||||
|             <div class="sidebar-scrollbox"> |  | ||||||
|                 <ol class="chapter"><li class="chapter-item "><a href="/docserver/introduction.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li class="chapter-item "><a href="/docserver/index.html"><strong aria-hidden="true">2.</strong> What is this ?</a></li><li class="chapter-item "><a href="/docserver/features.html"><strong aria-hidden="true">3.</strong> Features</a></li><li class="chapter-item "><a href="/docserver/howto.html"><strong aria-hidden="true">4.</strong> How to</a></li><li class="chapter-item "><a href="/docserver/quick-start.html"><strong aria-hidden="true">5.</strong> Quick Start</a></li><li class="spacer"></li><li class="chapter-item affix "><li class="part-title">Server and Content</li><li class="chapter-item "><a href="/docserver/one_server.html"><strong aria-hidden="true">6.</strong> One web server instance</a></li><li class="chapter-item "><a href="/docserver/server_modes.html"><strong aria-hidden="true">7.</strong> Server modes</a></li><li class="chapter-item "><a href="/docserver/static_content.html"><strong aria-hidden="true">8.</strong> Static contents</a></li><li class="chapter-item "><a href="/docserver/url_path.html"><strong aria-hidden="true">9.</strong> url_path prefix</a></li><li class="chapter-item "><a href="/docserver/protect_access.html"><strong aria-hidden="true">10.</strong> Protect access</a></li><li class="chapter-item affix "><li class="part-title">Users and Policies</li><li class="chapter-item "><a href="/docserver/users.html"><strong aria-hidden="true">11.</strong> Users</a></li><li class="chapter-item "><a href="/docserver/users_sql.html"><strong aria-hidden="true">12.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/users_file_storage.html"><strong aria-hidden="true">13.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/roles.html"><strong aria-hidden="true">14.</strong> Roles</a></li><li class="chapter-item "><a href="/docserver/auths.html"><strong aria-hidden="true">15.</strong> Users auths</a></li><li class="chapter-item "><a href="/docserver/policies.html"><strong aria-hidden="true">16.</strong> Access policies</a></li><li class="chapter-item "><a href="/docserver/adminusers.html"><strong aria-hidden="true">17.</strong> Users Admin</a></li><li class="chapter-item affix "><li class="part-title">Sessions</li><li class="chapter-item "><a href="/docserver/sessions.html"><strong aria-hidden="true">18.</strong> Session data</a></li><li class="chapter-item "><a href="/docserver/pasetoken.html"><strong aria-hidden="true">19.</strong> Pasetoken</a></li><li class="chapter-item "><a href="/docserver/sessions_sql.html"><strong aria-hidden="true">20.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/sessions_file_storage.html"><strong aria-hidden="true">21.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/cookie.html"><strong aria-hidden="true">22.</strong> Cookie set</a></li><li class="chapter-item affix "><li class="part-title">Logs and Trace</li><li class="chapter-item "><a href="/docserver/trace.html"><strong aria-hidden="true">23.</strong> Traced</a></li><li class="chapter-item "><a href="/docserver/logs.html"><strong aria-hidden="true">24.</strong> Sessions logs</a></li><li class="chapter-item affix "><li class="part-title">Configuration</li><li class="chapter-item expanded "><a href="/docserver/configuration.html" class="active"><strong aria-hidden="true">25.</strong> Configurable service</a></li><li class="chapter-item "><a href="/docserver/settings.html"><strong aria-hidden="true">26.</strong> Config settings</a></li><li class="spacer"></li></ol> |  | ||||||
|             </div> |  | ||||||
|             <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> |  | ||||||
|         </nav> |  | ||||||
| 
 |  | ||||||
|         <div id="page-wrapper" class="page-wrapper"> |  | ||||||
| 
 |  | ||||||
|             <div class="page"> |  | ||||||
|                                 <div id="menu-bar-hover-placeholder"></div> |  | ||||||
|                 <div id="menu-bar" class="menu-bar sticky bordered"> |  | ||||||
|                     <div class="left-buttons"> |  | ||||||
|                         <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> |  | ||||||
|                             <i class="fa fa-bars"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="sidebar-toggle" onclick="location.href='/'" class="icon-button" type="button" title="Home" aria-label="Home" aria-controls=""> |  | ||||||
|                             <i class="fa fa-home"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> |  | ||||||
|                             <i class="fa fa-paint-brush"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> |  | ||||||
|                         </ul> |  | ||||||
|                         <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> |  | ||||||
|                             <i class="fa fa-search"></i> |  | ||||||
|                         </button> |  | ||||||
|                     </div> |  | ||||||
| 
 |  | ||||||
|                     <h1 class="menu-title">Doc Server</h1> |  | ||||||
| 
 |  | ||||||
|                     <div class="right-buttons"> |  | ||||||
|                         <a href="/docserver/print.html" title="Print this book" aria-label="Print this book"> |  | ||||||
|                             <i id="print-button" class="fa fa-print"></i> |  | ||||||
|                         </a> |  | ||||||
|                         <a href="/logout" title="Sing out" aria-label="Sign out"> |  | ||||||
|                             <i id="logout-button" class="fa fa-sign-out"></i> |  | ||||||
|                         </a> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div id="search-wrapper" class="hidden"> |  | ||||||
|                     <form id="searchbar-outer" class="searchbar-outer"> |  | ||||||
|                         <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> |  | ||||||
|                     </form> |  | ||||||
|                     <div id="searchresults-outer" class="searchresults-outer hidden"> |  | ||||||
|                         <div id="searchresults-header" class="searchresults-header"></div> |  | ||||||
|                         <ul id="searchresults"> |  | ||||||
|                         </ul> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> |  | ||||||
|                 <script> |  | ||||||
|                     document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); |  | ||||||
|                     document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); |  | ||||||
|                     Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { |  | ||||||
|                         link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); |  | ||||||
|                     }); |  | ||||||
|                 </script> |  | ||||||
| 
 |  | ||||||
|                 <div id="content" class="content"> |  | ||||||
|                     <main> |  | ||||||
|                         <h1 id="configurable-service"><a class="header" href="#configurable-service">Configurable service</a></h1> |  | ||||||
| <p><a href="/docserver/">Doc Server</a> can be adjusted to differents <a href="#modes">modes</a> with <a href="settings.html">Settings</a> in <a href="#config-file">Config file</a>.</p> |  | ||||||
| <div class="box"><img src="images/docserver.svg" class="logo" /></div> |  | ||||||
| <h2 id="config-file"><a class="header" href="#config-file">Config file</a></h2> |  | ||||||
| <p><strong>Config file</strong> path with <a href="settings.html">Settings</a> is passed as argument to <a href="/docserver/">Doc Server</a> executable as:</p> |  | ||||||
| <pre><code class="language-bash">docserver --config <CONFIG_PATH>  |  | ||||||
| </code></pre> |  | ||||||
| <p>It should be a <strong><a href="https://en.wikipedia.org/wiki/TOML">TOML</a> file-path with Configuration <a href="settings.html">settings</a> to run <code>WebServer</code></strong>, it is REQUIRED to run  <a href="/docserver/">Doc Server</a></p> |  | ||||||
| <p>It is composed by the following parts:</p> |  | ||||||
| <ul> |  | ||||||
| <li> |  | ||||||
| <p><a href="configuration.html#main">Paths, URLs, Web Server main settings</a> (port, host, protocol, SSL certificates, etc)</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><a href="configuration.html#signup">Signup and Signin</a> settings: <a href="configuration.html#password-score">password</a>, <a href="configuration.html#totp">TOTP</a>,  <a href="configuration.html#admin-user-fields">admin fields</a>, etc.</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><a href="configuration.html#mail-service">Mail</a> settings if enabled</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><a href="configuration.html#stores">Stores</a> locations for Users, Auths and Sessions</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><a href="configuration.html#templates">Templates</a>: <strong>tpls</strong> to render requests responses</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><a href="pasetoken.html">Pasetoken</a>: <strong>paseto</strong> for token configurations</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><a href="configuration.html#ui">UI</a> where major user interface are defined:</p> |  | ||||||
| <ul> |  | ||||||
| <li> |  | ||||||
| <p><strong>Assets links</strong> for JS and CSS</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><strong>web_menu_items</strong> as items to show in top menu navigator</p> |  | ||||||
| </li> |  | ||||||
| </ul> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><a href="configuration.html#serv-paths">serv_paths</a>  where <a href="static_content.html">static content</a> path are defined as <strong>is_restricted</strong> and with allowed <a href="roles.html">roles</a></p> |  | ||||||
| </li> |  | ||||||
| </ul> |  | ||||||
| <h2 id="main"><a class="header" href="#main">Main</a></h2> |  | ||||||
| <p>On top of <strong>Configuration file</strong>:</p> |  | ||||||
| <ul> |  | ||||||
| <li> |  | ||||||
| <p><strong>root_path</strong> = “sitehome”, the most important as <u>root path</u>, other settings attibutes ending with <strong>_path</strong> can have relative path to this one or their own absolute or relative paths.</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><strong>name</strong> = “docserver” is a name for service</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><strong>org</strong> = “ORG” an organization name</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><strong>verbose</strong> = 2  some debug info in requests handling is shown with values over 0</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><strong>templates_path</strong> = “templates”, <a href="configuration.html#templates">templates</a> path</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><strong>assets_url</strong> = “/assets” assets path for <a href="configuration.html#templates">templates</a></p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><strong>allow_origin</strong> = [“http://localhost:8080”] allow origins for  <a href="https://developer.mozilla.org/es/docs/Web/HTTP/Headers/Access-Control-Allow-Origin">access control allow origin</a> webserver directive</p> |  | ||||||
| </li> |  | ||||||
| </ul> |  | ||||||
| <h2 id="https"><a class="header" href="#https">HTTPS</a></h2> |  | ||||||
| <p><a href="https://en.wikipedia.org/wiki/Transport_Layer_Security">TLS</a> certificates path can be provided in:</p> |  | ||||||
| <pre><code class="language-toml">cert_file = "cert/fullchain.pem" |  | ||||||
| key_file = "cert/privkey.pem" |  | ||||||
| </code></pre> |  | ||||||
| <p>To use <strong>HTTPS</strong> traffic set <strong>protocol</strong> to <strong>https</strong> rather than <strong>http</strong></p> |  | ||||||
| <pre><code class="language-toml">protocol = "https" |  | ||||||
| </code></pre> |  | ||||||
| <h2 id="signup"><a class="header" href="#signup">Signup</a></h2> |  | ||||||
| <p>It is about how new users will be created, there are two option:</p> |  | ||||||
| <ul> |  | ||||||
| <li> |  | ||||||
| <p><strong>Open</strong> by using a <strong>signup</strong> form with all details.</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><strong>invitation</strong> by <strong>adminitrators</strong>, new user would receive an <strong>invitation link</strong> (it would include some details like email, roles,etc) connected to a <a href="sesions.html">session</a> token with <strong>expiration time</strong> in seconds, this link can be sent by email if is set in config. By using an <strong>invitation link</strong> new user can fill a <strong>signup</strong> form with all details.</p> |  | ||||||
| </li> |  | ||||||
| </ul> |  | ||||||
| <pre><code class="language-toml">## How to signup by 'invitation' or 'open' |  | ||||||
| signup_mode = "invitation" |  | ||||||
| invite_expire = 900 # in seconds |  | ||||||
| </code></pre> |  | ||||||
| <h2 id="totp"><a class="header" href="#totp">TOTP</a></h2> |  | ||||||
| <p><a href="https://en.wikipedia.org/wiki/Time-based_one-time_password">TOPT</a> as <a href="https://en.wikipedia.org/wiki/Multi-factor_authentication">2FA</a> by default is set to <strong>no</strong>  but it can also be:</p> |  | ||||||
| <ul> |  | ||||||
| <li> |  | ||||||
| <p><strong>optional</strong> to users settings, so they can activate or deactivate in <strong>signup</strong> and <u>user settings</u> edition.</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><strong>mandatory</strong> means users have to configure in <strong>signup</strong> process.</p> |  | ||||||
| </li> |  | ||||||
| </ul> |  | ||||||
| <p><a href="https://en.wikipedia.org/wiki/Time-based_one-time_password">TOPT</a> can only be reset by <strong>user settings</strong>  or <strong>administrators</strong>  via <strong>user edition form</strong></p> |  | ||||||
| <pre><code class="language-toml"># topt Mode: mandatory, optional, no (default)   |  | ||||||
| totp_mode = "optional" |  | ||||||
| # totp Digits: 6 (default) or 8  |  | ||||||
| totp_digits = 6 |  | ||||||
| # topt Algorithm: sha1 (default), sha256, sha512 |  | ||||||
| totp_algorithm = "sha256" |  | ||||||
| </code></pre> |  | ||||||
| <h2 id="password-score"><a class="header" href="#password-score">Password score</a></h2> |  | ||||||
| <p><a href="/docserver/">Doc Server</a> use <a href="https://www.rust-lang.org">Rust</a> crate <a href="https://github.com/shssoichiro/zxcvbn-rs">zxcvbn</a> for password strength estimator, it can be enforced to a value:</p> |  | ||||||
| <pre><code class="language-toml">password_score = 3 |  | ||||||
| </code></pre> |  | ||||||
| <h2 id="admin-user-fields"><a class="header" href="#admin-user-fields">Admin user fields</a></h2> |  | ||||||
| <p><strong>admin_fields</strong> is a list of user fields or attributes to change only by <strong>administrators</strong>, user can only see their values.</p> |  | ||||||
| <pre><code class="language-toml">admin_fields = "roles,otp_base32,status" |  | ||||||
| </code></pre> |  | ||||||
| <h2 id="mail-service"><a class="header" href="#mail-service">Mail service</a></h2> |  | ||||||
| <p>It can be set as <strong>true</strong> or <strong>false</strong>, <strong>smtp_auth</strong> is token encrypted that can be generated by <strong>script</strong>  <strong>tools/get_mail_token.sh</strong> that runs <a href="/docserver/">Doc Server</a> program using credentials from <a href="pasetoken.html">paseto</a> section (<strong>public_path</strong> and <strong>secret_path</strong>), it can be included not encrypted but is highly not recomended.</p> |  | ||||||
| <blockquote> |  | ||||||
| <p>tools/get_mail_token.sh [mail_user] [mail_password] |  | ||||||
| Provides a token based in srcv pasetoken settings</p> |  | ||||||
| </blockquote> |  | ||||||
| <p>As an option enviroment variables MAIL_USER and MAIL_PASSWORD can also be set before to run <strong>tools/get_mail_token.sh</strong></p> |  | ||||||
| <pre><code class="language-toml">use_mail = true |  | ||||||
| smtp = "mail.example.com" |  | ||||||
| smtp_auth = "v4.public..." |  | ||||||
| mail_from ="admini@example.com" |  | ||||||
| </code></pre> |  | ||||||
| <h2 id="stores"><a class="header" href="#stores">Stores</a></h2> |  | ||||||
| <p><a href="users.html">Users</a> and <a href="sessions.html">Sessions</a> are stored in async <a href="https://github.com/launchbadge/sqlx">sqlx</a> to <a href="sqlite.html">Sqlite</a> or <a href="file_storage.html">File</a> storages, for larger use <a href="https://github.com/launchbadge/sqlx">sqlx</a> as <u>Database Agnostic</u> provides other <a href="https://en.wikipedia.org/wiki/SQL">SQL</a> options</p> |  | ||||||
| <blockquote> |  | ||||||
| <p>Prefix <strong>sqlite::</strong> is for <a href="https://www.sqlite.org/index.html">SQLite</a> storage, usually a file ends with <strong>.db</strong> suffix.</p> |  | ||||||
| </blockquote> |  | ||||||
| <pre><code class="language-toml">users_store_uri = "sqlite:PATH_TO_users.db" |  | ||||||
| session_store_uri = "sqlite:PATH_TO_sessions.db" |  | ||||||
| session_expire = 300 |  | ||||||
| </code></pre> |  | ||||||
| <blockquote> |  | ||||||
| <p>Prefix <strong>file:///</strong> if for <strong>FILE</strong> storage, value should be a directory. <strong>session_store_file</strong> value will be final file prefix follow by <a href="https://en.wikipedia.org/wiki/Timestamp">timestamp</a> autogenerated value.</p> |  | ||||||
| </blockquote> |  | ||||||
| <pre><code class="language-toml">users_store_uri = "file:///PATH_TO_users_DIRECTORY" |  | ||||||
| session_store_uri = "file:///PATH_TO_sessions_DIRECTORY" |  | ||||||
| session_store_file = "session" |  | ||||||
| session_expire = 300 |  | ||||||
| </code></pre> |  | ||||||
| <blockquote> |  | ||||||
| <p><strong>session_expire</strong> is a value in seconds for a session to expire ir is not used, with each request expire session is extended for same value.</p> |  | ||||||
| </blockquote> |  | ||||||
| <h2 id="policies"><a class="header" href="#policies">Policies</a></h2> |  | ||||||
| <p><a href="policies.html">Access policies</a> to be <strong>enfoced</strong> for content access with <a href="https://github.com/casbin/casbin-rs">Casbin</a> require two file path:</p> |  | ||||||
| <pre><code class="language-toml">authz_model_path = "PATH_TO_model.conf" |  | ||||||
| authz_policy_path = "PATH_TO_policy.csv" |  | ||||||
| </code></pre> |  | ||||||
| <h2 id="templates"><a class="header" href="#templates">Templates</a></h2> |  | ||||||
| <p><a href="https://tera.netlify.app/">Tera template engine</a> is used to to render response requests. Most of templates are <strong>HTML</strong> and in many cases use to include others from <strong>partials</strong> directory. Pre-render process is in charge of values setting.</p> |  | ||||||
| <p>Templates suffixes indicate if is <strong>html</strong> or <strong>txt</strong> and ends with <strong>j2</strong> as standard extension for <a href="https://jinja.palletsprojects.com/en/3.1.x/">jinja2</a> templating engine.</p> |  | ||||||
| <p>Default <strong>templates_path</strong> = “templates” directory layout:</p> |  | ||||||
| <pre><code class="language-text">├── home.html.j2 |  | ||||||
| ├── invite_create.html.j2 |  | ||||||
| ├── invite_mail.html.j2 |  | ||||||
| ├── invite_mail.txt.j2 |  | ||||||
| ├── invite_output.html.j2 |  | ||||||
| ├── login.html.j2 |  | ||||||
| ├── logout.html.j2 |  | ||||||
| ├── pages |  | ||||||
| │   └── terms-conditions.html.j2 |  | ||||||
| ├── partials |  | ||||||
| │   ├── footer.html.j2 |  | ||||||
| │   ├── form-password.html.j2 |  | ||||||
| │   ├── form-totp.html.j2 |  | ||||||
| │   ├── form-user.html.j2 |  | ||||||
| │   ├── header.html.j2 |  | ||||||
| │   ├── loading.html.j2 |  | ||||||
| │   ├── mini_navbar.html.j2 |  | ||||||
| │   ├── modal_edit_user.html.j2 |  | ||||||
| │   ├── _navbar.html.j2 |  | ||||||
| │   ├── navbar.html.j2 |  | ||||||
| │   └── symbols.html.j2 |  | ||||||
| ├── signup.html.j2 |  | ||||||
| ├── user_settings.html.j2 |  | ||||||
| └── users.html.j2 |  | ||||||
| </code></pre> |  | ||||||
| <p>Current templates use <a href="https://unocss.dev/">UnoCSS</a> as CSS engine (compatible with <a href="https://tailwindcss.com/">Tailwindcss</a>) and <a href="https://flowbite.com/docs/getting-started/introduction/">FLowbyte</a> as CSS and JS component library, so they are added from <a href="configuration.html#ui">UI</a> configuration values</p> |  | ||||||
| <pre><code class="language-toml">[ui] |  | ||||||
| css_link = "https://cdn.jsdelivr.net/npm/@unocss/reset/tailwind.min.css" |  | ||||||
| js_link = "https://cdn.jsdelivr.net/npm/@unocss/runtime" |  | ||||||
| other_css_link = "https://cdnjs.cloudflare.com/ajax/libs/flowbite/1.6.5/flowbite.min.css" |  | ||||||
| other_js_link="https://cdnjs.cloudflare.com/ajax/libs/flowbite/1.6.5/flowbite.min.js" |  | ||||||
| </code></pre> |  | ||||||
| <p>Other <strong>JS</strong> values are used for basic tasks in page interaction:</p> |  | ||||||
| <pre><code class="language-toml">[ui] |  | ||||||
| main_js_link = "/assets/js/main.js" |  | ||||||
| utils_js_link = "/assets/js/utils.js" |  | ||||||
| </code></pre> |  | ||||||
| <p>A <strong>main.css</strong> is used for customized <strong>CSS</strong>, is loaded in <strong>partials/header.html.j2</strong> template as (pay attention to <strong>asserts_url</strong>):</p> |  | ||||||
| <pre><code class="language-python">/css/main.css |  | ||||||
| </code></pre> |  | ||||||
| <p>Values under <strong>[tpls]</strong>  section are mapped values for <strong>template filename</strong> used in <a href="/docserver/">Doc Server</a> request handlers to render a response, so basically filenames in <strong>templates_path</strong> value directory.</p> |  | ||||||
| <h2 id="ui"><a class="header" href="#ui">UI</a></h2> |  | ||||||
| <p>Contains values for <a href="/configuration.html#templates">templates</a> render for <strong>assets</strong> files: <strong>js</strong>, <strong>css</strong>.</p> |  | ||||||
| <p>Each <strong>web_menu_items</strong> entry set values (<strong>text</strong>, <strong>url</strong>, <strong>roles</strong>) for each <strong>navigation menu</strong> template used in pages.</p> |  | ||||||
| <h2 id="serv-paths"><a class="header" href="#serv-paths">Serv Paths</a></h2> |  | ||||||
| <p>An entry for each <a href="static_content.html">static_content</a> like in example bellow</p> |  | ||||||
| <p>Example:</p> |  | ||||||
| <pre><code class="language-toml">[[serve_paths]] |  | ||||||
| # Server relative Directory Path (sitehome/appdoc) |  | ||||||
| srv_path = "Server DIRECTORY_PATH" |  | ||||||
| # Absolute URL path for resquests |  | ||||||
| url_path = "/appdoc" |  | ||||||
| # Not found URL to be redirect  |  | ||||||
| not_found = "" |  | ||||||
| # URL to be redirect if is not authorization found |  | ||||||
| not_auth = "/login" |  | ||||||
| # true or false to access control or not to this PATH |  | ||||||
| is_restricted = true |  | ||||||
| </code></pre> |  | ||||||
| <blockquote> |  | ||||||
| <p>Access <a href="%7B%7D">policies</a> for <strong>serve_path.url_path</strong>  should be in <strong>authz_policy_path</strong> file</p> |  | ||||||
| </blockquote> |  | ||||||
| 
 |  | ||||||
|                     </main> |  | ||||||
| 
 |  | ||||||
|                     <nav class="nav-wrapper" aria-label="Page navigation"> |  | ||||||
|                         <!-- Mobile navigation buttons --> |  | ||||||
|                             <a rel="prev" href="logs.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                                 <i class="fa fa-angle-left"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                             <a rel="next" href="settings.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                                 <i class="fa fa-angle-right"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                         <div style="clear: both"></div> |  | ||||||
|                     </nav> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
| 
 |  | ||||||
|             <nav class="nav-wide-wrapper" aria-label="Page navigation"> |  | ||||||
|                     <a rel="prev" href="logs.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                         <i class="fa fa-angle-left"></i> |  | ||||||
|                     </a> |  | ||||||
| 
 |  | ||||||
|                     <a rel="next" href="settings.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                         <i class="fa fa-angle-right"></i> |  | ||||||
|                     </a> |  | ||||||
|             </nav> |  | ||||||
| 
 |  | ||||||
|         </div> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <script> |  | ||||||
|             window.playground_copyable = true; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/ace.js"></script> |  | ||||||
|         <script src="/docserver/editor.js"></script> |  | ||||||
|         <script src="/docserver/mode-rust.js"></script> |  | ||||||
|         <script src="/docserver/theme-dawn.js"></script> |  | ||||||
|         <script src="/docserver/theme-tomorrow_night.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/elasticlunr.min.js"></script> |  | ||||||
|         <script src="/docserver/mark.min.js"></script> |  | ||||||
|         <script src="/docserver/searcher.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/clipboard.min.js"></script> |  | ||||||
|         <script src="/docserver/highlight.js"></script> |  | ||||||
|         <script src="/docserver/book.js"></script> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom JS scripts --> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     </div> |  | ||||||
|     </body> |  | ||||||
| </html> |  | ||||||
| @ -1,212 +0,0 @@ | |||||||
| <!DOCTYPE HTML> |  | ||||||
| <html lang="en" class="sidebar-visible no-js light"> |  | ||||||
|     <head> |  | ||||||
|         <!-- Book generated using mdBook --> |  | ||||||
|         <meta charset="UTF-8"> |  | ||||||
|         <title>Cookie set - Doc Server</title> |  | ||||||
|         <base href="/docserver/"> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <!-- Custom HTML head --> |  | ||||||
|          |  | ||||||
|         <meta name="description" content="Doc Server"> |  | ||||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> |  | ||||||
|         <meta name="theme-color" content="#ffffff" /> |  | ||||||
| 
 |  | ||||||
|         <link rel="icon" href="/docserver/favicon.svg"> |  | ||||||
|         <link rel="shortcut icon" href="/docserver/favicon.png"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/variables.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/general.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/chrome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/print.css" media="print"> |  | ||||||
| 
 |  | ||||||
|         <!-- Fonts --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/FontAwesome/css/font-awesome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/fonts/fonts.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Highlight.js Stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/highlight.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/tomorrow-night.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/ayu-highlight.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom theme stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/custom.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/mdbook-admonish.css"> |  | ||||||
| 
 |  | ||||||
|     </head> |  | ||||||
|     <body> |  | ||||||
|     <div id="body-container"> |  | ||||||
|         <!-- Provide site root to javascript --> |  | ||||||
|         <script> |  | ||||||
|             var path_to_root = "/docserver/"; |  | ||||||
|             var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light"; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Work around some values being stored in localStorage wrapped in quotes --> |  | ||||||
|         <script> |  | ||||||
|             try { |  | ||||||
|                 var theme = localStorage.getItem('mdbook-theme'); |  | ||||||
|                 var sidebar = localStorage.getItem('mdbook-sidebar'); |  | ||||||
| 
 |  | ||||||
|                 if (theme.startsWith('"') && theme.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (sidebar.startsWith('"') && sidebar.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); |  | ||||||
|                 } |  | ||||||
|             } catch (e) { } |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Set the theme before any content is loaded, prevents flash --> |  | ||||||
|         <script> |  | ||||||
|             var theme; |  | ||||||
|             try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } |  | ||||||
|             if (theme === null || theme === undefined) { theme = default_theme; } |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             html.classList.remove('no-js') |  | ||||||
|             html.classList.remove('light') |  | ||||||
|             html.classList.add(theme); |  | ||||||
|             html.classList.add('js'); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Hide / unhide sidebar before it is displayed --> |  | ||||||
|         <script> |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             var sidebar = null; |  | ||||||
|             if (document.body.clientWidth >= 1080) { |  | ||||||
|                 try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } |  | ||||||
|                 sidebar = sidebar || 'visible'; |  | ||||||
|             } else { |  | ||||||
|                 sidebar = 'hidden'; |  | ||||||
|             } |  | ||||||
|             html.classList.remove('sidebar-visible'); |  | ||||||
|             html.classList.add("sidebar-" + sidebar); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <nav id="sidebar" class="sidebar" aria-label="Table of contents"> |  | ||||||
|             <div class="sidebar-scrollbox"> |  | ||||||
|                 <ol class="chapter"><li class="chapter-item "><a href="/docserver/introduction.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li class="chapter-item "><a href="/docserver/index.html"><strong aria-hidden="true">2.</strong> What is this ?</a></li><li class="chapter-item "><a href="/docserver/features.html"><strong aria-hidden="true">3.</strong> Features</a></li><li class="chapter-item "><a href="/docserver/howto.html"><strong aria-hidden="true">4.</strong> How to</a></li><li class="chapter-item "><a href="/docserver/quick-start.html"><strong aria-hidden="true">5.</strong> Quick Start</a></li><li class="spacer"></li><li class="chapter-item affix "><li class="part-title">Server and Content</li><li class="chapter-item "><a href="/docserver/one_server.html"><strong aria-hidden="true">6.</strong> One web server instance</a></li><li class="chapter-item "><a href="/docserver/server_modes.html"><strong aria-hidden="true">7.</strong> Server modes</a></li><li class="chapter-item "><a href="/docserver/static_content.html"><strong aria-hidden="true">8.</strong> Static contents</a></li><li class="chapter-item "><a href="/docserver/url_path.html"><strong aria-hidden="true">9.</strong> url_path prefix</a></li><li class="chapter-item "><a href="/docserver/protect_access.html"><strong aria-hidden="true">10.</strong> Protect access</a></li><li class="chapter-item affix "><li class="part-title">Users and Policies</li><li class="chapter-item "><a href="/docserver/users.html"><strong aria-hidden="true">11.</strong> Users</a></li><li class="chapter-item "><a href="/docserver/users_sql.html"><strong aria-hidden="true">12.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/users_file_storage.html"><strong aria-hidden="true">13.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/roles.html"><strong aria-hidden="true">14.</strong> Roles</a></li><li class="chapter-item "><a href="/docserver/auths.html"><strong aria-hidden="true">15.</strong> Users auths</a></li><li class="chapter-item "><a href="/docserver/policies.html"><strong aria-hidden="true">16.</strong> Access policies</a></li><li class="chapter-item "><a href="/docserver/adminusers.html"><strong aria-hidden="true">17.</strong> Users Admin</a></li><li class="chapter-item affix "><li class="part-title">Sessions</li><li class="chapter-item "><a href="/docserver/sessions.html"><strong aria-hidden="true">18.</strong> Session data</a></li><li class="chapter-item "><a href="/docserver/pasetoken.html"><strong aria-hidden="true">19.</strong> Pasetoken</a></li><li class="chapter-item "><a href="/docserver/sessions_sql.html"><strong aria-hidden="true">20.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/sessions_file_storage.html"><strong aria-hidden="true">21.</strong> File storage</a></li><li class="chapter-item expanded "><a href="/docserver/cookie.html" class="active"><strong aria-hidden="true">22.</strong> Cookie set</a></li><li class="chapter-item affix "><li class="part-title">Logs and Trace</li><li class="chapter-item "><a href="/docserver/trace.html"><strong aria-hidden="true">23.</strong> Traced</a></li><li class="chapter-item "><a href="/docserver/logs.html"><strong aria-hidden="true">24.</strong> Sessions logs</a></li><li class="chapter-item affix "><li class="part-title">Configuration</li><li class="chapter-item "><a href="/docserver/configuration.html"><strong aria-hidden="true">25.</strong> Configurable service</a></li><li class="chapter-item "><a href="/docserver/settings.html"><strong aria-hidden="true">26.</strong> Config settings</a></li><li class="spacer"></li></ol> |  | ||||||
|             </div> |  | ||||||
|             <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> |  | ||||||
|         </nav> |  | ||||||
| 
 |  | ||||||
|         <div id="page-wrapper" class="page-wrapper"> |  | ||||||
| 
 |  | ||||||
|             <div class="page"> |  | ||||||
|                                 <div id="menu-bar-hover-placeholder"></div> |  | ||||||
|                 <div id="menu-bar" class="menu-bar sticky bordered"> |  | ||||||
|                     <div class="left-buttons"> |  | ||||||
|                         <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> |  | ||||||
|                             <i class="fa fa-bars"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="sidebar-toggle" onclick="location.href='/'" class="icon-button" type="button" title="Home" aria-label="Home" aria-controls=""> |  | ||||||
|                             <i class="fa fa-home"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> |  | ||||||
|                             <i class="fa fa-paint-brush"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> |  | ||||||
|                         </ul> |  | ||||||
|                         <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> |  | ||||||
|                             <i class="fa fa-search"></i> |  | ||||||
|                         </button> |  | ||||||
|                     </div> |  | ||||||
| 
 |  | ||||||
|                     <h1 class="menu-title">Doc Server</h1> |  | ||||||
| 
 |  | ||||||
|                     <div class="right-buttons"> |  | ||||||
|                         <a href="/docserver/print.html" title="Print this book" aria-label="Print this book"> |  | ||||||
|                             <i id="print-button" class="fa fa-print"></i> |  | ||||||
|                         </a> |  | ||||||
|                         <a href="/logout" title="Sing out" aria-label="Sign out"> |  | ||||||
|                             <i id="logout-button" class="fa fa-sign-out"></i> |  | ||||||
|                         </a> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div id="search-wrapper" class="hidden"> |  | ||||||
|                     <form id="searchbar-outer" class="searchbar-outer"> |  | ||||||
|                         <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> |  | ||||||
|                     </form> |  | ||||||
|                     <div id="searchresults-outer" class="searchresults-outer hidden"> |  | ||||||
|                         <div id="searchresults-header" class="searchresults-header"></div> |  | ||||||
|                         <ul id="searchresults"> |  | ||||||
|                         </ul> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> |  | ||||||
|                 <script> |  | ||||||
|                     document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); |  | ||||||
|                     document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); |  | ||||||
|                     Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { |  | ||||||
|                         link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); |  | ||||||
|                     }); |  | ||||||
|                 </script> |  | ||||||
| 
 |  | ||||||
|                 <div id="content" class="content"> |  | ||||||
|                     <main> |  | ||||||
|                         <h1 id="cookie-set"><a class="header" href="#cookie-set">Cookie set</a></h1> |  | ||||||
| 
 |  | ||||||
|                     </main> |  | ||||||
| 
 |  | ||||||
|                     <nav class="nav-wrapper" aria-label="Page navigation"> |  | ||||||
|                         <!-- Mobile navigation buttons --> |  | ||||||
|                             <a rel="prev" href="sessions_file_storage.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                                 <i class="fa fa-angle-left"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                             <a rel="next" href="trace.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                                 <i class="fa fa-angle-right"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                         <div style="clear: both"></div> |  | ||||||
|                     </nav> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
| 
 |  | ||||||
|             <nav class="nav-wide-wrapper" aria-label="Page navigation"> |  | ||||||
|                     <a rel="prev" href="sessions_file_storage.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                         <i class="fa fa-angle-left"></i> |  | ||||||
|                     </a> |  | ||||||
| 
 |  | ||||||
|                     <a rel="next" href="trace.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                         <i class="fa fa-angle-right"></i> |  | ||||||
|                     </a> |  | ||||||
|             </nav> |  | ||||||
| 
 |  | ||||||
|         </div> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <script> |  | ||||||
|             window.playground_copyable = true; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/ace.js"></script> |  | ||||||
|         <script src="/docserver/editor.js"></script> |  | ||||||
|         <script src="/docserver/mode-rust.js"></script> |  | ||||||
|         <script src="/docserver/theme-dawn.js"></script> |  | ||||||
|         <script src="/docserver/theme-tomorrow_night.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/elasticlunr.min.js"></script> |  | ||||||
|         <script src="/docserver/mark.min.js"></script> |  | ||||||
|         <script src="/docserver/searcher.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/clipboard.min.js"></script> |  | ||||||
|         <script src="/docserver/highlight.js"></script> |  | ||||||
|         <script src="/docserver/book.js"></script> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom JS scripts --> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     </div> |  | ||||||
|     </body> |  | ||||||
| </html> |  | ||||||
| @ -1,545 +0,0 @@ | |||||||
| /* CSS for UI elements (a.k.a. chrome) */ |  | ||||||
| 
 |  | ||||||
| @import 'variables.css'; |  | ||||||
| 
 |  | ||||||
| html { |  | ||||||
|     scrollbar-color: var(--scrollbar) var(--bg); |  | ||||||
| } |  | ||||||
| #searchresults a, |  | ||||||
| .content a:link, |  | ||||||
| a:visited, |  | ||||||
| a > .hljs { |  | ||||||
|     color: var(--links); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* |  | ||||||
|     body-container is necessary because mobile browsers don't seem to like |  | ||||||
|     overflow-x on the body tag when there is a <meta name="viewport"> tag. |  | ||||||
| */ |  | ||||||
| #body-container { |  | ||||||
|     /* |  | ||||||
|         This is used when the sidebar pushes the body content off the side of |  | ||||||
|         the screen on small screens. Without it, dragging on mobile Safari |  | ||||||
|         will want to reposition the viewport in a weird way. |  | ||||||
|     */ |  | ||||||
|     overflow-x: clip; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* Menu Bar */ |  | ||||||
| 
 |  | ||||||
| #menu-bar, |  | ||||||
| #menu-bar-hover-placeholder { |  | ||||||
|     z-index: 101; |  | ||||||
|     margin: auto calc(0px - var(--page-padding)); |  | ||||||
| } |  | ||||||
| #menu-bar { |  | ||||||
|     position: relative; |  | ||||||
|     display: flex; |  | ||||||
|     flex-wrap: wrap; |  | ||||||
|     background-color: var(--bg); |  | ||||||
|     border-bottom-color: var(--bg); |  | ||||||
|     border-bottom-width: 1px; |  | ||||||
|     border-bottom-style: solid; |  | ||||||
| } |  | ||||||
| #menu-bar.sticky, |  | ||||||
| .js #menu-bar-hover-placeholder:hover + #menu-bar, |  | ||||||
| .js #menu-bar:hover, |  | ||||||
| .js.sidebar-visible #menu-bar { |  | ||||||
|     position: -webkit-sticky; |  | ||||||
|     position: sticky; |  | ||||||
|     top: 0 !important; |  | ||||||
| } |  | ||||||
| #menu-bar-hover-placeholder { |  | ||||||
|     position: sticky; |  | ||||||
|     position: -webkit-sticky; |  | ||||||
|     top: 0; |  | ||||||
|     height: var(--menu-bar-height); |  | ||||||
| } |  | ||||||
| #menu-bar.bordered { |  | ||||||
|     border-bottom-color: var(--table-border-color); |  | ||||||
| } |  | ||||||
| #menu-bar i, #menu-bar .icon-button { |  | ||||||
|     position: relative; |  | ||||||
|     padding: 0 8px; |  | ||||||
|     z-index: 10; |  | ||||||
|     line-height: var(--menu-bar-height); |  | ||||||
|     cursor: pointer; |  | ||||||
|     transition: color 0.5s; |  | ||||||
| } |  | ||||||
| @media only screen and (max-width: 420px) { |  | ||||||
|     #menu-bar i, #menu-bar .icon-button { |  | ||||||
|         padding: 0 5px; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .icon-button { |  | ||||||
|     border: none; |  | ||||||
|     background: none; |  | ||||||
|     padding: 0; |  | ||||||
|     color: inherit; |  | ||||||
| } |  | ||||||
| .icon-button i { |  | ||||||
|     margin: 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .right-buttons { |  | ||||||
|     margin: 0 15px; |  | ||||||
| } |  | ||||||
| .right-buttons a { |  | ||||||
|     text-decoration: none; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .left-buttons { |  | ||||||
|     display: flex; |  | ||||||
|     margin: 0 5px; |  | ||||||
| } |  | ||||||
| .no-js .left-buttons { |  | ||||||
|     display: none; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .menu-title { |  | ||||||
|     display: inline-block; |  | ||||||
|     font-weight: 200; |  | ||||||
|     font-size: 2.4rem; |  | ||||||
|     line-height: var(--menu-bar-height); |  | ||||||
|     text-align: center; |  | ||||||
|     margin: 0; |  | ||||||
|     flex: 1; |  | ||||||
|     white-space: nowrap; |  | ||||||
|     overflow: hidden; |  | ||||||
|     text-overflow: ellipsis; |  | ||||||
| } |  | ||||||
| .js .menu-title { |  | ||||||
|     cursor: pointer; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .menu-bar, |  | ||||||
| .menu-bar:visited, |  | ||||||
| .nav-chapters, |  | ||||||
| .nav-chapters:visited, |  | ||||||
| .mobile-nav-chapters, |  | ||||||
| .mobile-nav-chapters:visited, |  | ||||||
| .menu-bar .icon-button, |  | ||||||
| .menu-bar a i { |  | ||||||
|     color: var(--icons); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .menu-bar i:hover, |  | ||||||
| .menu-bar .icon-button:hover, |  | ||||||
| .nav-chapters:hover, |  | ||||||
| .mobile-nav-chapters i:hover { |  | ||||||
|     color: var(--icons-hover); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* Nav Icons */ |  | ||||||
| 
 |  | ||||||
| .nav-chapters { |  | ||||||
|     font-size: 2.5em; |  | ||||||
|     text-align: center; |  | ||||||
|     text-decoration: none; |  | ||||||
| 
 |  | ||||||
|     position: fixed; |  | ||||||
|     top: 0; |  | ||||||
|     bottom: 0; |  | ||||||
|     margin: 0; |  | ||||||
|     max-width: 150px; |  | ||||||
|     min-width: 90px; |  | ||||||
| 
 |  | ||||||
|     display: flex; |  | ||||||
|     justify-content: center; |  | ||||||
|     align-content: center; |  | ||||||
|     flex-direction: column; |  | ||||||
| 
 |  | ||||||
|     transition: color 0.5s, background-color 0.5s; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .nav-chapters:hover { |  | ||||||
|     text-decoration: none; |  | ||||||
|     background-color: var(--theme-hover); |  | ||||||
|     transition: background-color 0.15s, color 0.15s; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .nav-wrapper { |  | ||||||
|     margin-top: 50px; |  | ||||||
|     display: none; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .mobile-nav-chapters { |  | ||||||
|     font-size: 2.5em; |  | ||||||
|     text-align: center; |  | ||||||
|     text-decoration: none; |  | ||||||
|     width: 90px; |  | ||||||
|     border-radius: 5px; |  | ||||||
|     background-color: var(--sidebar-bg); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .previous { |  | ||||||
|     float: left; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .next { |  | ||||||
|     float: right; |  | ||||||
|     right: var(--page-padding); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| @media only screen and (max-width: 1080px) { |  | ||||||
|     .nav-wide-wrapper { display: none; } |  | ||||||
|     .nav-wrapper { display: block; } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| @media only screen and (max-width: 1380px) { |  | ||||||
|     .sidebar-visible .nav-wide-wrapper { display: none; } |  | ||||||
|     .sidebar-visible .nav-wrapper { display: block; } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* Inline code */ |  | ||||||
| 
 |  | ||||||
| :not(pre) > .hljs { |  | ||||||
|     display: inline; |  | ||||||
|     padding: 0.1em 0.3em; |  | ||||||
|     border-radius: 3px; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| :not(pre):not(a) > .hljs { |  | ||||||
|     color: var(--inline-code-color); |  | ||||||
|     overflow-x: initial; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| a:hover > .hljs { |  | ||||||
|     text-decoration: underline; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| pre { |  | ||||||
|     position: relative; |  | ||||||
| } |  | ||||||
| pre > .buttons { |  | ||||||
|     position: absolute; |  | ||||||
|     z-index: 100; |  | ||||||
|     right: 0px; |  | ||||||
|     top: 2px; |  | ||||||
|     margin: 0px; |  | ||||||
|     padding: 2px 0px; |  | ||||||
| 
 |  | ||||||
|     color: var(--sidebar-fg); |  | ||||||
|     cursor: pointer; |  | ||||||
|     visibility: hidden; |  | ||||||
|     opacity: 0; |  | ||||||
|     transition: visibility 0.1s linear, opacity 0.1s linear; |  | ||||||
| } |  | ||||||
| pre:hover > .buttons { |  | ||||||
|     visibility: visible; |  | ||||||
|     opacity: 1 |  | ||||||
| } |  | ||||||
| pre > .buttons :hover { |  | ||||||
|     color: var(--sidebar-active); |  | ||||||
|     border-color: var(--icons-hover); |  | ||||||
|     background-color: var(--theme-hover); |  | ||||||
| } |  | ||||||
| pre > .buttons i { |  | ||||||
|     margin-left: 8px; |  | ||||||
| } |  | ||||||
| pre > .buttons button { |  | ||||||
|     cursor: inherit; |  | ||||||
|     margin: 0px 5px; |  | ||||||
|     padding: 3px 5px; |  | ||||||
|     font-size: 14px; |  | ||||||
| 
 |  | ||||||
|     border-style: solid; |  | ||||||
|     border-width: 1px; |  | ||||||
|     border-radius: 4px; |  | ||||||
|     border-color: var(--icons); |  | ||||||
|     background-color: var(--theme-popup-bg); |  | ||||||
|     transition: 100ms; |  | ||||||
|     transition-property: color,border-color,background-color; |  | ||||||
|     color: var(--icons); |  | ||||||
| } |  | ||||||
| @media (pointer: coarse) { |  | ||||||
|     pre > .buttons button { |  | ||||||
|         /* On mobile, make it easier to tap buttons. */ |  | ||||||
|         padding: 0.3rem 1rem; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| pre > code { |  | ||||||
|     padding: 1rem; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* FIXME: ACE editors overlap their buttons because ACE does absolute |  | ||||||
|    positioning within the code block which breaks padding. The only solution I |  | ||||||
|    can think of is to move the padding to the outer pre tag (or insert a div |  | ||||||
|    wrapper), but that would require fixing a whole bunch of CSS rules. |  | ||||||
| */ |  | ||||||
| .hljs.ace_editor { |  | ||||||
|   padding: 0rem 0rem; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| pre > .result { |  | ||||||
|     margin-top: 10px; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* Search */ |  | ||||||
| 
 |  | ||||||
| #searchresults a { |  | ||||||
|     text-decoration: none; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| mark { |  | ||||||
|     border-radius: 2px; |  | ||||||
|     padding: 0 3px 1px 3px; |  | ||||||
|     margin: 0 -3px -1px -3px; |  | ||||||
|     background-color: var(--search-mark-bg); |  | ||||||
|     transition: background-color 300ms linear; |  | ||||||
|     cursor: pointer; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| mark.fade-out { |  | ||||||
|     background-color: rgba(0,0,0,0) !important; |  | ||||||
|     cursor: auto; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .searchbar-outer { |  | ||||||
|     margin-left: auto; |  | ||||||
|     margin-right: auto; |  | ||||||
|     max-width: var(--content-max-width); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #searchbar { |  | ||||||
|     width: 100%; |  | ||||||
|     margin: 5px auto 0px auto; |  | ||||||
|     padding: 10px 16px; |  | ||||||
|     transition: box-shadow 300ms ease-in-out; |  | ||||||
|     border: 1px solid var(--searchbar-border-color); |  | ||||||
|     border-radius: 3px; |  | ||||||
|     background-color: var(--searchbar-bg); |  | ||||||
|     color: var(--searchbar-fg); |  | ||||||
| } |  | ||||||
| #searchbar:focus, |  | ||||||
| #searchbar.active { |  | ||||||
|     box-shadow: 0 0 3px var(--searchbar-shadow-color); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .searchresults-header { |  | ||||||
|     font-weight: bold; |  | ||||||
|     font-size: 1em; |  | ||||||
|     padding: 18px 0 0 5px; |  | ||||||
|     color: var(--searchresults-header-fg); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .searchresults-outer { |  | ||||||
|     margin-left: auto; |  | ||||||
|     margin-right: auto; |  | ||||||
|     max-width: var(--content-max-width); |  | ||||||
|     border-bottom: 1px dashed var(--searchresults-border-color); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| ul#searchresults { |  | ||||||
|     list-style: none; |  | ||||||
|     padding-left: 20px; |  | ||||||
| } |  | ||||||
| ul#searchresults li { |  | ||||||
|     margin: 10px 0px; |  | ||||||
|     padding: 2px; |  | ||||||
|     border-radius: 2px; |  | ||||||
| } |  | ||||||
| ul#searchresults li.focus { |  | ||||||
|     background-color: var(--searchresults-li-bg); |  | ||||||
| } |  | ||||||
| ul#searchresults span.teaser { |  | ||||||
|     display: block; |  | ||||||
|     clear: both; |  | ||||||
|     margin: 5px 0 0 20px; |  | ||||||
|     font-size: 0.8em; |  | ||||||
| } |  | ||||||
| ul#searchresults span.teaser em { |  | ||||||
|     font-weight: bold; |  | ||||||
|     font-style: normal; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* Sidebar */ |  | ||||||
| 
 |  | ||||||
| .sidebar { |  | ||||||
|     position: fixed; |  | ||||||
|     left: 0; |  | ||||||
|     top: 0; |  | ||||||
|     bottom: 0; |  | ||||||
|     width: var(--sidebar-width); |  | ||||||
|     font-size: 0.875em; |  | ||||||
|     box-sizing: border-box; |  | ||||||
|     -webkit-overflow-scrolling: touch; |  | ||||||
|     overscroll-behavior-y: contain; |  | ||||||
|     background-color: var(--sidebar-bg); |  | ||||||
|     color: var(--sidebar-fg); |  | ||||||
| } |  | ||||||
| .sidebar-resizing { |  | ||||||
|     -moz-user-select: none; |  | ||||||
|     -webkit-user-select: none; |  | ||||||
|     -ms-user-select: none; |  | ||||||
|     user-select: none; |  | ||||||
| } |  | ||||||
| .js:not(.sidebar-resizing) .sidebar { |  | ||||||
|     transition: transform 0.3s; /* Animation: slide away */ |  | ||||||
| } |  | ||||||
| .sidebar code { |  | ||||||
|     line-height: 2em; |  | ||||||
| } |  | ||||||
| .sidebar .sidebar-scrollbox { |  | ||||||
|     overflow-y: auto; |  | ||||||
|     position: absolute; |  | ||||||
|     top: 0; |  | ||||||
|     bottom: 0; |  | ||||||
|     left: 0; |  | ||||||
|     right: 0; |  | ||||||
|     padding: 10px 10px; |  | ||||||
| } |  | ||||||
| .sidebar .sidebar-resize-handle { |  | ||||||
|     position: absolute; |  | ||||||
|     cursor: col-resize; |  | ||||||
|     width: 0; |  | ||||||
|     right: 0; |  | ||||||
|     top: 0; |  | ||||||
|     bottom: 0; |  | ||||||
| } |  | ||||||
| .js .sidebar .sidebar-resize-handle { |  | ||||||
|     cursor: col-resize; |  | ||||||
|     width: 5px; |  | ||||||
| } |  | ||||||
| .sidebar-hidden .sidebar { |  | ||||||
|     transform: translateX(calc(0px - var(--sidebar-width))); |  | ||||||
| } |  | ||||||
| .sidebar::-webkit-scrollbar { |  | ||||||
|     background: var(--sidebar-bg); |  | ||||||
| } |  | ||||||
| .sidebar::-webkit-scrollbar-thumb { |  | ||||||
|     background: var(--scrollbar); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .sidebar-visible .page-wrapper { |  | ||||||
|     transform: translateX(var(--sidebar-width)); |  | ||||||
| } |  | ||||||
| @media only screen and (min-width: 620px) { |  | ||||||
|     .sidebar-visible .page-wrapper { |  | ||||||
|         transform: none; |  | ||||||
|         margin-left: var(--sidebar-width); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .chapter { |  | ||||||
|     list-style: none outside none; |  | ||||||
|     padding-left: 0; |  | ||||||
|     line-height: 2.2em; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .chapter ol { |  | ||||||
|     width: 100%; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .chapter li { |  | ||||||
|     display: flex; |  | ||||||
|     color: var(--sidebar-non-existant); |  | ||||||
| } |  | ||||||
| .chapter li a { |  | ||||||
|     display: block; |  | ||||||
|     padding: 0; |  | ||||||
|     text-decoration: none; |  | ||||||
|     color: var(--sidebar-fg); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .chapter li a:hover { |  | ||||||
|     color: var(--sidebar-active); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .chapter li a.active { |  | ||||||
|     color: var(--sidebar-active); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .chapter li > a.toggle { |  | ||||||
|     cursor: pointer; |  | ||||||
|     display: block; |  | ||||||
|     margin-left: auto; |  | ||||||
|     padding: 0 10px; |  | ||||||
|     user-select: none; |  | ||||||
|     opacity: 0.68; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .chapter li > a.toggle div { |  | ||||||
|     transition: transform 0.5s; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* collapse the section */ |  | ||||||
| .chapter li:not(.expanded) + li > ol { |  | ||||||
|     display: none; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .chapter li.chapter-item { |  | ||||||
|     line-height: 1.5em; |  | ||||||
|     margin-top: 0.6em; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .chapter li.expanded > a.toggle div { |  | ||||||
|     transform: rotate(90deg); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .spacer { |  | ||||||
|     width: 100%; |  | ||||||
|     height: 3px; |  | ||||||
|     margin: 5px 0px; |  | ||||||
| } |  | ||||||
| .chapter .spacer { |  | ||||||
|     background-color: var(--sidebar-spacer); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| @media (-moz-touch-enabled: 1), (pointer: coarse) { |  | ||||||
|     .chapter li a { padding: 5px 0; } |  | ||||||
|     .spacer { margin: 10px 0; } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .section { |  | ||||||
|     list-style: none outside none; |  | ||||||
|     padding-left: 20px; |  | ||||||
|     line-height: 1.9em; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* Theme Menu Popup */ |  | ||||||
| 
 |  | ||||||
| .theme-popup { |  | ||||||
|     position: absolute; |  | ||||||
|     left: 10px; |  | ||||||
|     top: var(--menu-bar-height); |  | ||||||
|     z-index: 1000; |  | ||||||
|     border-radius: 4px; |  | ||||||
|     font-size: 0.7em; |  | ||||||
|     color: var(--fg); |  | ||||||
|     background: var(--theme-popup-bg); |  | ||||||
|     border: 1px solid var(--theme-popup-border); |  | ||||||
|     margin: 0; |  | ||||||
|     padding: 0; |  | ||||||
|     list-style: none; |  | ||||||
|     display: none; |  | ||||||
|     /* Don't let the children's background extend past the rounded corners. */ |  | ||||||
|     overflow: hidden; |  | ||||||
| } |  | ||||||
| .theme-popup .default { |  | ||||||
|     color: var(--icons); |  | ||||||
| } |  | ||||||
| .theme-popup .theme { |  | ||||||
|     width: 100%; |  | ||||||
|     border: 0; |  | ||||||
|     margin: 0; |  | ||||||
|     padding: 2px 20px; |  | ||||||
|     line-height: 25px; |  | ||||||
|     white-space: nowrap; |  | ||||||
|     text-align: left; |  | ||||||
|     cursor: pointer; |  | ||||||
|     color: inherit; |  | ||||||
|     background: inherit; |  | ||||||
|     font-size: inherit; |  | ||||||
| } |  | ||||||
| .theme-popup .theme:hover { |  | ||||||
|     background-color: var(--theme-hover); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .theme-selected::before { |  | ||||||
|     display: inline-block; |  | ||||||
|     content: "✓"; |  | ||||||
|     margin-left: -14px; |  | ||||||
|     width: 14px; |  | ||||||
| } |  | ||||||
| @ -1,204 +0,0 @@ | |||||||
| /* Base styles and content styles */ |  | ||||||
| 
 |  | ||||||
| @import 'variables.css'; |  | ||||||
| 
 |  | ||||||
| :root { |  | ||||||
|     /* Browser default font-size is 16px, this way 1 rem = 10px */ |  | ||||||
|     font-size: 62.5%; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| html { |  | ||||||
|     font-family: "Open Sans", sans-serif; |  | ||||||
|     color: var(--fg); |  | ||||||
|     background-color: var(--bg); |  | ||||||
|     text-size-adjust: none; |  | ||||||
|     -webkit-text-size-adjust: none; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| body { |  | ||||||
|     margin: 0; |  | ||||||
|     font-size: 1.6rem; |  | ||||||
|     overflow-x: hidden; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| code { |  | ||||||
|     font-family: var(--mono-font) !important; |  | ||||||
|     font-size: var(--code-font-size); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* make long words/inline code not x overflow */ |  | ||||||
| main { |  | ||||||
|     overflow-wrap: break-word; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* make wide tables scroll if they overflow */ |  | ||||||
| .table-wrapper { |  | ||||||
|     overflow-x: auto; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* Don't change font size in headers. */ |  | ||||||
| h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { |  | ||||||
|     font-size: unset; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .left { float: left; } |  | ||||||
| .right { float: right; } |  | ||||||
| .boring { opacity: 0.6; } |  | ||||||
| .hide-boring .boring { display: none; } |  | ||||||
| .hidden { display: none !important; } |  | ||||||
| 
 |  | ||||||
| h2, h3 { margin-top: 2.5em; } |  | ||||||
| h4, h5 { margin-top: 2em; } |  | ||||||
| 
 |  | ||||||
| .header + .header h3, |  | ||||||
| .header + .header h4, |  | ||||||
| .header + .header h5 { |  | ||||||
|     margin-top: 1em; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| h1:target::before, |  | ||||||
| h2:target::before, |  | ||||||
| h3:target::before, |  | ||||||
| h4:target::before, |  | ||||||
| h5:target::before, |  | ||||||
| h6:target::before { |  | ||||||
|     display: inline-block; |  | ||||||
|     content: "»"; |  | ||||||
|     margin-left: -30px; |  | ||||||
|     width: 30px; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* This is broken on Safari as of version 14, but is fixed |  | ||||||
|    in Safari Technology Preview 117 which I think will be Safari 14.2. |  | ||||||
|    https://bugs.webkit.org/show_bug.cgi?id=218076 |  | ||||||
| */ |  | ||||||
| :target { |  | ||||||
|     scroll-margin-top: calc(var(--menu-bar-height) + 0.5em); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .page { |  | ||||||
|     outline: 0; |  | ||||||
|     padding: 0 var(--page-padding); |  | ||||||
|     margin-top: calc(0px - var(--menu-bar-height)); /* Compensate for the #menu-bar-hover-placeholder */ |  | ||||||
| } |  | ||||||
| .page-wrapper { |  | ||||||
|     box-sizing: border-box; |  | ||||||
| } |  | ||||||
| .js:not(.sidebar-resizing) .page-wrapper { |  | ||||||
|     transition: margin-left 0.3s ease, transform 0.3s ease; /* Animation: slide away */ |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .content { |  | ||||||
|     overflow-y: auto; |  | ||||||
|     padding: 0 5px 50px 5px; |  | ||||||
| } |  | ||||||
| .content main { |  | ||||||
|     margin-left: auto; |  | ||||||
|     margin-right: auto; |  | ||||||
|     max-width: var(--content-max-width); |  | ||||||
| } |  | ||||||
| .content p { line-height: 1.45em; } |  | ||||||
| .content ol { line-height: 1.45em; } |  | ||||||
| .content ul { line-height: 1.45em; } |  | ||||||
| .content a { text-decoration: none; } |  | ||||||
| .content a:hover { text-decoration: underline; } |  | ||||||
| .content img, .content video { max-width: 100%; } |  | ||||||
| .content .header:link, |  | ||||||
| .content .header:visited { |  | ||||||
|     color: var(--fg); |  | ||||||
| } |  | ||||||
| .content .header:link, |  | ||||||
| .content .header:visited:hover { |  | ||||||
|     text-decoration: none; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| table { |  | ||||||
|     margin: 0 auto; |  | ||||||
|     border-collapse: collapse; |  | ||||||
| } |  | ||||||
| table td { |  | ||||||
|     padding: 3px 20px; |  | ||||||
|     border: 1px var(--table-border-color) solid; |  | ||||||
| } |  | ||||||
| table thead { |  | ||||||
|     background: var(--table-header-bg); |  | ||||||
| } |  | ||||||
| table thead td { |  | ||||||
|     font-weight: 700; |  | ||||||
|     border: none; |  | ||||||
| } |  | ||||||
| table thead th { |  | ||||||
|     padding: 3px 20px; |  | ||||||
| } |  | ||||||
| table thead tr { |  | ||||||
|     border: 1px var(--table-header-bg) solid; |  | ||||||
| } |  | ||||||
| /* Alternate background colors for rows */ |  | ||||||
| table tbody tr:nth-child(2n) { |  | ||||||
|     background: var(--table-alternate-bg); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| blockquote { |  | ||||||
|     margin: 20px 0; |  | ||||||
|     padding: 0 20px; |  | ||||||
|     color: var(--fg); |  | ||||||
|     background-color: var(--quote-bg); |  | ||||||
|     border-top: .1em solid var(--quote-border); |  | ||||||
|     border-bottom: .1em solid var(--quote-border); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| kbd { |  | ||||||
|     background-color: var(--table-border-color); |  | ||||||
|     border-radius: 4px; |  | ||||||
|     border: solid 1px var(--theme-popup-border); |  | ||||||
|     box-shadow: inset 0 -1px 0 var(--theme-hover); |  | ||||||
|     display: inline-block; |  | ||||||
|     font-size: var(--code-font-size); |  | ||||||
|     font-family: var(--mono-font); |  | ||||||
|     line-height: 10px; |  | ||||||
|     padding: 4px 5px; |  | ||||||
|     vertical-align: middle; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| :not(.footnote-definition) + .footnote-definition, |  | ||||||
| .footnote-definition + :not(.footnote-definition) { |  | ||||||
|     margin-top: 2em; |  | ||||||
| } |  | ||||||
| .footnote-definition { |  | ||||||
|     font-size: 0.9em; |  | ||||||
|     margin: 0.5em 0; |  | ||||||
| } |  | ||||||
| .footnote-definition p { |  | ||||||
|     display: inline; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .tooltiptext { |  | ||||||
|     position: absolute; |  | ||||||
|     visibility: hidden; |  | ||||||
|     color: #fff; |  | ||||||
|     background-color: #333; |  | ||||||
|     transform: translateX(-50%); /* Center by moving tooltip 50% of its width left */ |  | ||||||
|     left: -8px; /* Half of the width of the icon */ |  | ||||||
|     top: -35px; |  | ||||||
|     font-size: 0.8em; |  | ||||||
|     text-align: center; |  | ||||||
|     border-radius: 6px; |  | ||||||
|     padding: 5px 8px; |  | ||||||
|     margin: 5px; |  | ||||||
|     z-index: 1000; |  | ||||||
| } |  | ||||||
| .tooltipped .tooltiptext { |  | ||||||
|     visibility: visible; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .chapter li.part-title { |  | ||||||
|     color: var(--sidebar-fg); |  | ||||||
|     margin: 5px 0px; |  | ||||||
|     font-weight: bold; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .result-no-output { |  | ||||||
|     font-style: italic; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| @ -1,54 +0,0 @@ | |||||||
| 
 |  | ||||||
| #sidebar, |  | ||||||
| #menu-bar, |  | ||||||
| .nav-chapters, |  | ||||||
| .mobile-nav-chapters { |  | ||||||
|     display: none; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #page-wrapper.page-wrapper { |  | ||||||
|     transform: none; |  | ||||||
|     margin-left: 0px; |  | ||||||
|     overflow-y: initial; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #content { |  | ||||||
|     max-width: none; |  | ||||||
|     margin: 0; |  | ||||||
|     padding: 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .page { |  | ||||||
|     overflow-y: initial; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| code { |  | ||||||
|     background-color: #666666; |  | ||||||
|     border-radius: 5px; |  | ||||||
| 
 |  | ||||||
|     /* Force background to be printed in Chrome */ |  | ||||||
|     -webkit-print-color-adjust: exact; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| pre > .buttons { |  | ||||||
|     z-index: 2; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| a, a:visited, a:active, a:hover { |  | ||||||
|     color: #4183c4; |  | ||||||
|     text-decoration: none; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| h1, h2, h3, h4, h5, h6 { |  | ||||||
|     page-break-inside: avoid; |  | ||||||
|     page-break-after: avoid; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| pre, code { |  | ||||||
|     page-break-inside: avoid; |  | ||||||
|     white-space: pre-wrap; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .fa { |  | ||||||
|     display: none !important; |  | ||||||
| } |  | ||||||
| @ -1,255 +0,0 @@ | |||||||
| 
 |  | ||||||
| /* Globals */ |  | ||||||
| 
 |  | ||||||
| :root { |  | ||||||
|     --sidebar-width: 300px; |  | ||||||
|     --page-padding: 15px; |  | ||||||
|     --content-max-width: 750px; |  | ||||||
|     --menu-bar-height: 50px; |  | ||||||
|     --mono-font: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace; |  | ||||||
|     --code-font-size: 0.875em /* please adjust the ace font size accordingly in editor.js */ |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* Themes */ |  | ||||||
| 
 |  | ||||||
| .ayu { |  | ||||||
|     --bg: hsl(210, 25%, 8%); |  | ||||||
|     --fg: #c5c5c5; |  | ||||||
| 
 |  | ||||||
|     --sidebar-bg: #14191f; |  | ||||||
|     --sidebar-fg: #c8c9db; |  | ||||||
|     --sidebar-non-existant: #5c6773; |  | ||||||
|     --sidebar-active: #ffb454; |  | ||||||
|     --sidebar-spacer: #2d334f; |  | ||||||
| 
 |  | ||||||
|     --scrollbar: var(--sidebar-fg); |  | ||||||
| 
 |  | ||||||
|     --icons: #737480; |  | ||||||
|     --icons-hover: #b7b9cc; |  | ||||||
| 
 |  | ||||||
|     --links: #0096cf; |  | ||||||
| 
 |  | ||||||
|     --inline-code-color: #ffb454; |  | ||||||
| 
 |  | ||||||
|     --theme-popup-bg: #14191f; |  | ||||||
|     --theme-popup-border: #5c6773; |  | ||||||
|     --theme-hover: #191f26; |  | ||||||
| 
 |  | ||||||
|     --quote-bg: hsl(226, 15%, 17%); |  | ||||||
|     --quote-border: hsl(226, 15%, 22%); |  | ||||||
| 
 |  | ||||||
|     --table-border-color: hsl(210, 25%, 13%); |  | ||||||
|     --table-header-bg: hsl(210, 25%, 28%); |  | ||||||
|     --table-alternate-bg: hsl(210, 25%, 11%); |  | ||||||
| 
 |  | ||||||
|     --searchbar-border-color: #848484; |  | ||||||
|     --searchbar-bg: #424242; |  | ||||||
|     --searchbar-fg: #fff; |  | ||||||
|     --searchbar-shadow-color: #d4c89f; |  | ||||||
|     --searchresults-header-fg: #666; |  | ||||||
|     --searchresults-border-color: #888; |  | ||||||
|     --searchresults-li-bg: #252932; |  | ||||||
|     --search-mark-bg: #e3b171; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .coal { |  | ||||||
|     --bg: hsl(200, 7%, 8%); |  | ||||||
|     --fg: #98a3ad; |  | ||||||
| 
 |  | ||||||
|     --sidebar-bg: #292c2f; |  | ||||||
|     --sidebar-fg: #a1adb8; |  | ||||||
|     --sidebar-non-existant: #505254; |  | ||||||
|     --sidebar-active: #3473ad; |  | ||||||
|     --sidebar-spacer: #393939; |  | ||||||
| 
 |  | ||||||
|     --scrollbar: var(--sidebar-fg); |  | ||||||
| 
 |  | ||||||
|     --icons: #43484d; |  | ||||||
|     --icons-hover: #b3c0cc; |  | ||||||
| 
 |  | ||||||
|     --links: #2b79a2; |  | ||||||
| 
 |  | ||||||
|     --inline-code-color: #c5c8c6; |  | ||||||
| 
 |  | ||||||
|     --theme-popup-bg: #141617; |  | ||||||
|     --theme-popup-border: #43484d; |  | ||||||
|     --theme-hover: #1f2124; |  | ||||||
| 
 |  | ||||||
|     --quote-bg: hsl(234, 21%, 18%); |  | ||||||
|     --quote-border: hsl(234, 21%, 23%); |  | ||||||
| 
 |  | ||||||
|     --table-border-color: hsl(200, 7%, 13%); |  | ||||||
|     --table-header-bg: hsl(200, 7%, 28%); |  | ||||||
|     --table-alternate-bg: hsl(200, 7%, 11%); |  | ||||||
| 
 |  | ||||||
|     --searchbar-border-color: #aaa; |  | ||||||
|     --searchbar-bg: #b7b7b7; |  | ||||||
|     --searchbar-fg: #000; |  | ||||||
|     --searchbar-shadow-color: #aaa; |  | ||||||
|     --searchresults-header-fg: #666; |  | ||||||
|     --searchresults-border-color: #98a3ad; |  | ||||||
|     --searchresults-li-bg: #2b2b2f; |  | ||||||
|     --search-mark-bg: #355c7d; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .light { |  | ||||||
|     --bg: hsl(0, 0%, 100%); |  | ||||||
|     --fg: hsl(0, 0%, 0%); |  | ||||||
| 
 |  | ||||||
|     --sidebar-bg: #fafafa; |  | ||||||
|     --sidebar-fg: hsl(0, 0%, 0%); |  | ||||||
|     --sidebar-non-existant: #aaaaaa; |  | ||||||
|     --sidebar-active: #1f1fff; |  | ||||||
|     --sidebar-spacer: #f4f4f4; |  | ||||||
| 
 |  | ||||||
|     --scrollbar: #8F8F8F; |  | ||||||
| 
 |  | ||||||
|     --icons: #747474; |  | ||||||
|     --icons-hover: #000000; |  | ||||||
| 
 |  | ||||||
|     --links: #20609f; |  | ||||||
| 
 |  | ||||||
|     --inline-code-color: #301900; |  | ||||||
| 
 |  | ||||||
|     --theme-popup-bg: #fafafa; |  | ||||||
|     --theme-popup-border: #cccccc; |  | ||||||
|     --theme-hover: #e6e6e6; |  | ||||||
| 
 |  | ||||||
|     --quote-bg: hsl(197, 37%, 96%); |  | ||||||
|     --quote-border: hsl(197, 37%, 91%); |  | ||||||
| 
 |  | ||||||
|     --table-border-color: hsl(0, 0%, 95%); |  | ||||||
|     --table-header-bg: hsl(0, 0%, 80%); |  | ||||||
|     --table-alternate-bg: hsl(0, 0%, 97%); |  | ||||||
| 
 |  | ||||||
|     --searchbar-border-color: #aaa; |  | ||||||
|     --searchbar-bg: #fafafa; |  | ||||||
|     --searchbar-fg: #000; |  | ||||||
|     --searchbar-shadow-color: #aaa; |  | ||||||
|     --searchresults-header-fg: #666; |  | ||||||
|     --searchresults-border-color: #888; |  | ||||||
|     --searchresults-li-bg: #e4f2fe; |  | ||||||
|     --search-mark-bg: #a2cff5; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .navy { |  | ||||||
|     --bg: hsl(226, 23%, 11%); |  | ||||||
|     --fg: #bcbdd0; |  | ||||||
| 
 |  | ||||||
|     --sidebar-bg: #282d3f; |  | ||||||
|     --sidebar-fg: #c8c9db; |  | ||||||
|     --sidebar-non-existant: #505274; |  | ||||||
|     --sidebar-active: #2b79a2; |  | ||||||
|     --sidebar-spacer: #2d334f; |  | ||||||
| 
 |  | ||||||
|     --scrollbar: var(--sidebar-fg); |  | ||||||
| 
 |  | ||||||
|     --icons: #737480; |  | ||||||
|     --icons-hover: #b7b9cc; |  | ||||||
| 
 |  | ||||||
|     --links: #2b79a2; |  | ||||||
| 
 |  | ||||||
|     --inline-code-color: #c5c8c6; |  | ||||||
| 
 |  | ||||||
|     --theme-popup-bg: #161923; |  | ||||||
|     --theme-popup-border: #737480; |  | ||||||
|     --theme-hover: #282e40; |  | ||||||
| 
 |  | ||||||
|     --quote-bg: hsl(226, 15%, 17%); |  | ||||||
|     --quote-border: hsl(226, 15%, 22%); |  | ||||||
| 
 |  | ||||||
|     --table-border-color: hsl(226, 23%, 16%); |  | ||||||
|     --table-header-bg: hsl(226, 23%, 31%); |  | ||||||
|     --table-alternate-bg: hsl(226, 23%, 14%); |  | ||||||
| 
 |  | ||||||
|     --searchbar-border-color: #aaa; |  | ||||||
|     --searchbar-bg: #aeaec6; |  | ||||||
|     --searchbar-fg: #000; |  | ||||||
|     --searchbar-shadow-color: #aaa; |  | ||||||
|     --searchresults-header-fg: #5f5f71; |  | ||||||
|     --searchresults-border-color: #5c5c68; |  | ||||||
|     --searchresults-li-bg: #242430; |  | ||||||
|     --search-mark-bg: #a2cff5; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .rust { |  | ||||||
|     --bg: hsl(60, 9%, 87%); |  | ||||||
|     --fg: #262625; |  | ||||||
| 
 |  | ||||||
|     --sidebar-bg: #3b2e2a; |  | ||||||
|     --sidebar-fg: #c8c9db; |  | ||||||
|     --sidebar-non-existant: #505254; |  | ||||||
|     --sidebar-active: #e69f67; |  | ||||||
|     --sidebar-spacer: #45373a; |  | ||||||
| 
 |  | ||||||
|     --scrollbar: var(--sidebar-fg); |  | ||||||
| 
 |  | ||||||
|     --icons: #737480; |  | ||||||
|     --icons-hover: #262625; |  | ||||||
| 
 |  | ||||||
|     --links: #2b79a2; |  | ||||||
| 
 |  | ||||||
|     --inline-code-color: #6e6b5e; |  | ||||||
| 
 |  | ||||||
|     --theme-popup-bg: #e1e1db; |  | ||||||
|     --theme-popup-border: #b38f6b; |  | ||||||
|     --theme-hover: #99908a; |  | ||||||
| 
 |  | ||||||
|     --quote-bg: hsl(60, 5%, 75%); |  | ||||||
|     --quote-border: hsl(60, 5%, 70%); |  | ||||||
| 
 |  | ||||||
|     --table-border-color: hsl(60, 9%, 82%); |  | ||||||
|     --table-header-bg: #b3a497; |  | ||||||
|     --table-alternate-bg: hsl(60, 9%, 84%); |  | ||||||
| 
 |  | ||||||
|     --searchbar-border-color: #aaa; |  | ||||||
|     --searchbar-bg: #fafafa; |  | ||||||
|     --searchbar-fg: #000; |  | ||||||
|     --searchbar-shadow-color: #aaa; |  | ||||||
|     --searchresults-header-fg: #666; |  | ||||||
|     --searchresults-border-color: #888; |  | ||||||
|     --searchresults-li-bg: #dec2a2; |  | ||||||
|     --search-mark-bg: #e69f67; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| @media (prefers-color-scheme: dark) { |  | ||||||
|     .light.no-js { |  | ||||||
|         --bg: hsl(200, 7%, 8%); |  | ||||||
|         --fg: #98a3ad; |  | ||||||
| 
 |  | ||||||
|         --sidebar-bg: #292c2f; |  | ||||||
|         --sidebar-fg: #a1adb8; |  | ||||||
|         --sidebar-non-existant: #505254; |  | ||||||
|         --sidebar-active: #3473ad; |  | ||||||
|         --sidebar-spacer: #393939; |  | ||||||
| 
 |  | ||||||
|         --scrollbar: var(--sidebar-fg); |  | ||||||
| 
 |  | ||||||
|         --icons: #43484d; |  | ||||||
|         --icons-hover: #b3c0cc; |  | ||||||
| 
 |  | ||||||
|         --links: #2b79a2; |  | ||||||
| 
 |  | ||||||
|         --inline-code-color: #c5c8c6; |  | ||||||
| 
 |  | ||||||
|         --theme-popup-bg: #141617; |  | ||||||
|         --theme-popup-border: #43484d; |  | ||||||
|         --theme-hover: #1f2124; |  | ||||||
| 
 |  | ||||||
|         --quote-bg: hsl(234, 21%, 18%); |  | ||||||
|         --quote-border: hsl(234, 21%, 23%); |  | ||||||
| 
 |  | ||||||
|         --table-border-color: hsl(200, 7%, 13%); |  | ||||||
|         --table-header-bg: hsl(200, 7%, 28%); |  | ||||||
|         --table-alternate-bg: hsl(200, 7%, 11%); |  | ||||||
| 
 |  | ||||||
|         --searchbar-border-color: #aaa; |  | ||||||
|         --searchbar-bg: #b7b7b7; |  | ||||||
|         --searchbar-fg: #000; |  | ||||||
|         --searchbar-shadow-color: #aaa; |  | ||||||
|         --searchresults-header-fg: #666; |  | ||||||
|         --searchresults-border-color: #98a3ad; |  | ||||||
|         --searchresults-li-bg: #2b2b2f; |  | ||||||
|         --search-mark-bg: #355c7d; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @ -1,29 +0,0 @@ | |||||||
| "use strict"; |  | ||||||
| window.editors = []; |  | ||||||
| (function(editors) { |  | ||||||
|     if (typeof(ace) === 'undefined' || !ace) { |  | ||||||
|         return; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     Array.from(document.querySelectorAll('.editable')).forEach(function(editable) { |  | ||||||
|         let display_line_numbers = window.playground_line_numbers || false; |  | ||||||
| 
 |  | ||||||
|         let editor = ace.edit(editable); |  | ||||||
|             editor.setOptions({ |  | ||||||
|             highlightActiveLine: false, |  | ||||||
|             showPrintMargin: false, |  | ||||||
|             showLineNumbers: display_line_numbers, |  | ||||||
|             showGutter: display_line_numbers, |  | ||||||
|             maxLines: Infinity, |  | ||||||
|             fontSize: "0.875em" // please adjust the font size of the code in general.css
 |  | ||||||
|         }); |  | ||||||
| 
 |  | ||||||
|         editor.$blockScrolling = Infinity; |  | ||||||
| 
 |  | ||||||
|         editor.getSession().setMode("ace/mode/rust"); |  | ||||||
| 
 |  | ||||||
|         editor.originalCode = editor.getValue(); |  | ||||||
| 
 |  | ||||||
|         editors.push(editor); |  | ||||||
|     }); |  | ||||||
| })(window.editors); |  | ||||||
| Before Width: | Height: | Size: 5.5 KiB | 
| @ -1,22 +0,0 @@ | |||||||
| <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 199.7 184.2"> |  | ||||||
|   <style> |  | ||||||
|     @media (prefers-color-scheme: dark) { |  | ||||||
|       svg { fill: white; } |  | ||||||
|     } |  | ||||||
|   </style> |  | ||||||
| <path d="M189.5,36.8c0.2,2.8,0,5.1-0.6,6.8L153,162c-0.6,2.1-2,3.7-4.2,5c-2.2,1.2-4.4,1.9-6.7,1.9H31.4c-9.6,0-15.3-2.8-17.3-8.4 |  | ||||||
|   c-0.8-2.2-0.8-3.9,0.1-5.2c0.9-1.2,2.4-1.8,4.6-1.8H123c7.4,0,12.6-1.4,15.4-4.1s5.7-8.9,8.6-18.4l32.9-108.6 |  | ||||||
|   c1.8-5.9,1-11.1-2.2-15.6S169.9,0,164,0H72.7c-1,0-3.1,0.4-6.1,1.1l0.1-0.4C64.5,0.2,62.6,0,61,0.1s-3,0.5-4.3,1.4 |  | ||||||
|   c-1.3,0.9-2.4,1.8-3.2,2.8S52,6.5,51.2,8.1c-0.8,1.6-1.4,3-1.9,4.3s-1.1,2.7-1.8,4.2c-0.7,1.5-1.3,2.7-2,3.7c-0.5,0.6-1.2,1.5-2,2.5 |  | ||||||
|   s-1.6,2-2.2,2.8s-0.9,1.5-1.1,2.2c-0.2,0.7-0.1,1.8,0.2,3.2c0.3,1.4,0.4,2.4,0.4,3.1c-0.3,3-1.4,6.9-3.3,11.6 |  | ||||||
|   c-1.9,4.7-3.6,8.1-5.1,10.1c-0.3,0.4-1.2,1.3-2.6,2.7c-1.4,1.4-2.3,2.6-2.6,3.7c-0.3,0.4-0.3,1.5-0.1,3.4c0.3,1.8,0.4,3.1,0.3,3.8 |  | ||||||
|   c-0.3,2.7-1.3,6.3-3,10.8c-1.7,4.5-3.4,8.2-5,11c-0.2,0.5-0.9,1.4-2,2.8c-1.1,1.4-1.8,2.5-2,3.4c-0.2,0.6-0.1,1.8,0.1,3.4 |  | ||||||
|   c0.2,1.6,0.2,2.8-0.1,3.6c-0.6,3-1.8,6.7-3.6,11c-1.8,4.3-3.6,7.9-5.4,11c-0.5,0.8-1.1,1.7-2,2.8c-0.8,1.1-1.5,2-2,2.8 |  | ||||||
|   s-0.8,1.6-1,2.5c-0.1,0.5,0,1.3,0.4,2.3c0.3,1.1,0.4,1.9,0.4,2.6c-0.1,1.1-0.2,2.6-0.5,4.4c-0.2,1.8-0.4,2.9-0.4,3.2 |  | ||||||
|   c-1.8,4.8-1.7,9.9,0.2,15.2c2.2,6.2,6.2,11.5,11.9,15.8c5.7,4.3,11.7,6.4,17.8,6.4h110.7c5.2,0,10.1-1.7,14.7-5.2s7.7-7.8,9.2-12.9 |  | ||||||
|   l33-108.6c1.8-5.8,1-10.9-2.2-15.5C194.9,39.7,192.6,38,189.5,36.8z M59.6,122.8L73.8,80c0,0,7,0,10.8,0s28.8-1.7,25.4,17.5 |  | ||||||
|   c-3.4,19.2-18.8,25.2-36.8,25.4S59.6,122.8,59.6,122.8z M78.6,116.8c4.7-0.1,18.9-2.9,22.1-17.1S89.2,86.3,89.2,86.3l-8.9,0 |  | ||||||
|   l-10.2,30.5C70.2,116.9,74,116.9,78.6,116.8z M75.3,68.7L89,26.2h9.8l0.8,34l23.6-34h9.9l-13.6,42.5h-7.1l12.5-35.4l-24.5,35.4h-6.8 |  | ||||||
|   l-0.8-35L82,68.7H75.3z"/> |  | ||||||
| </svg> |  | ||||||
| <!-- Original image Copyright Dave Gandy — CC BY 4.0 License --> |  | ||||||
| Before Width: | Height: | Size: 1.8 KiB | 
| @ -1,238 +0,0 @@ | |||||||
| <!DOCTYPE HTML> |  | ||||||
| <html lang="en" class="sidebar-visible no-js light"> |  | ||||||
|     <head> |  | ||||||
|         <!-- Book generated using mdBook --> |  | ||||||
|         <meta charset="UTF-8"> |  | ||||||
|         <title>Features - Doc Server</title> |  | ||||||
|         <base href="/docserver/"> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <!-- Custom HTML head --> |  | ||||||
|          |  | ||||||
|         <meta name="description" content="Doc Server"> |  | ||||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> |  | ||||||
|         <meta name="theme-color" content="#ffffff" /> |  | ||||||
| 
 |  | ||||||
|         <link rel="icon" href="/docserver/favicon.svg"> |  | ||||||
|         <link rel="shortcut icon" href="/docserver/favicon.png"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/variables.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/general.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/chrome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/print.css" media="print"> |  | ||||||
| 
 |  | ||||||
|         <!-- Fonts --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/FontAwesome/css/font-awesome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/fonts/fonts.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Highlight.js Stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/highlight.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/tomorrow-night.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/ayu-highlight.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom theme stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/custom.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/mdbook-admonish.css"> |  | ||||||
| 
 |  | ||||||
|     </head> |  | ||||||
|     <body> |  | ||||||
|     <div id="body-container"> |  | ||||||
|         <!-- Provide site root to javascript --> |  | ||||||
|         <script> |  | ||||||
|             var path_to_root = "/docserver/"; |  | ||||||
|             var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light"; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Work around some values being stored in localStorage wrapped in quotes --> |  | ||||||
|         <script> |  | ||||||
|             try { |  | ||||||
|                 var theme = localStorage.getItem('mdbook-theme'); |  | ||||||
|                 var sidebar = localStorage.getItem('mdbook-sidebar'); |  | ||||||
| 
 |  | ||||||
|                 if (theme.startsWith('"') && theme.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (sidebar.startsWith('"') && sidebar.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); |  | ||||||
|                 } |  | ||||||
|             } catch (e) { } |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Set the theme before any content is loaded, prevents flash --> |  | ||||||
|         <script> |  | ||||||
|             var theme; |  | ||||||
|             try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } |  | ||||||
|             if (theme === null || theme === undefined) { theme = default_theme; } |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             html.classList.remove('no-js') |  | ||||||
|             html.classList.remove('light') |  | ||||||
|             html.classList.add(theme); |  | ||||||
|             html.classList.add('js'); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Hide / unhide sidebar before it is displayed --> |  | ||||||
|         <script> |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             var sidebar = null; |  | ||||||
|             if (document.body.clientWidth >= 1080) { |  | ||||||
|                 try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } |  | ||||||
|                 sidebar = sidebar || 'visible'; |  | ||||||
|             } else { |  | ||||||
|                 sidebar = 'hidden'; |  | ||||||
|             } |  | ||||||
|             html.classList.remove('sidebar-visible'); |  | ||||||
|             html.classList.add("sidebar-" + sidebar); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <nav id="sidebar" class="sidebar" aria-label="Table of contents"> |  | ||||||
|             <div class="sidebar-scrollbox"> |  | ||||||
|                 <ol class="chapter"><li class="chapter-item "><a href="/docserver/introduction.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li class="chapter-item "><a href="/docserver/index.html"><strong aria-hidden="true">2.</strong> What is this ?</a></li><li class="chapter-item expanded "><a href="/docserver/features.html" class="active"><strong aria-hidden="true">3.</strong> Features</a></li><li class="chapter-item "><a href="/docserver/howto.html"><strong aria-hidden="true">4.</strong> How to</a></li><li class="chapter-item "><a href="/docserver/quick-start.html"><strong aria-hidden="true">5.</strong> Quick Start</a></li><li class="spacer"></li><li class="chapter-item affix "><li class="part-title">Server and Content</li><li class="chapter-item "><a href="/docserver/one_server.html"><strong aria-hidden="true">6.</strong> One web server instance</a></li><li class="chapter-item "><a href="/docserver/server_modes.html"><strong aria-hidden="true">7.</strong> Server modes</a></li><li class="chapter-item "><a href="/docserver/static_content.html"><strong aria-hidden="true">8.</strong> Static contents</a></li><li class="chapter-item "><a href="/docserver/url_path.html"><strong aria-hidden="true">9.</strong> url_path prefix</a></li><li class="chapter-item "><a href="/docserver/protect_access.html"><strong aria-hidden="true">10.</strong> Protect access</a></li><li class="chapter-item affix "><li class="part-title">Users and Policies</li><li class="chapter-item "><a href="/docserver/users.html"><strong aria-hidden="true">11.</strong> Users</a></li><li class="chapter-item "><a href="/docserver/users_sql.html"><strong aria-hidden="true">12.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/users_file_storage.html"><strong aria-hidden="true">13.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/roles.html"><strong aria-hidden="true">14.</strong> Roles</a></li><li class="chapter-item "><a href="/docserver/auths.html"><strong aria-hidden="true">15.</strong> Users auths</a></li><li class="chapter-item "><a href="/docserver/policies.html"><strong aria-hidden="true">16.</strong> Access policies</a></li><li class="chapter-item "><a href="/docserver/adminusers.html"><strong aria-hidden="true">17.</strong> Users Admin</a></li><li class="chapter-item affix "><li class="part-title">Sessions</li><li class="chapter-item "><a href="/docserver/sessions.html"><strong aria-hidden="true">18.</strong> Session data</a></li><li class="chapter-item "><a href="/docserver/pasetoken.html"><strong aria-hidden="true">19.</strong> Pasetoken</a></li><li class="chapter-item "><a href="/docserver/sessions_sql.html"><strong aria-hidden="true">20.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/sessions_file_storage.html"><strong aria-hidden="true">21.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/cookie.html"><strong aria-hidden="true">22.</strong> Cookie set</a></li><li class="chapter-item affix "><li class="part-title">Logs and Trace</li><li class="chapter-item "><a href="/docserver/trace.html"><strong aria-hidden="true">23.</strong> Traced</a></li><li class="chapter-item "><a href="/docserver/logs.html"><strong aria-hidden="true">24.</strong> Sessions logs</a></li><li class="chapter-item affix "><li class="part-title">Configuration</li><li class="chapter-item "><a href="/docserver/configuration.html"><strong aria-hidden="true">25.</strong> Configurable service</a></li><li class="chapter-item "><a href="/docserver/settings.html"><strong aria-hidden="true">26.</strong> Config settings</a></li><li class="spacer"></li></ol> |  | ||||||
|             </div> |  | ||||||
|             <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> |  | ||||||
|         </nav> |  | ||||||
| 
 |  | ||||||
|         <div id="page-wrapper" class="page-wrapper"> |  | ||||||
| 
 |  | ||||||
|             <div class="page"> |  | ||||||
|                                 <div id="menu-bar-hover-placeholder"></div> |  | ||||||
|                 <div id="menu-bar" class="menu-bar sticky bordered"> |  | ||||||
|                     <div class="left-buttons"> |  | ||||||
|                         <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> |  | ||||||
|                             <i class="fa fa-bars"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="sidebar-toggle" onclick="location.href='/'" class="icon-button" type="button" title="Home" aria-label="Home" aria-controls=""> |  | ||||||
|                             <i class="fa fa-home"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> |  | ||||||
|                             <i class="fa fa-paint-brush"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> |  | ||||||
|                         </ul> |  | ||||||
|                         <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> |  | ||||||
|                             <i class="fa fa-search"></i> |  | ||||||
|                         </button> |  | ||||||
|                     </div> |  | ||||||
| 
 |  | ||||||
|                     <h1 class="menu-title">Doc Server</h1> |  | ||||||
| 
 |  | ||||||
|                     <div class="right-buttons"> |  | ||||||
|                         <a href="/docserver/print.html" title="Print this book" aria-label="Print this book"> |  | ||||||
|                             <i id="print-button" class="fa fa-print"></i> |  | ||||||
|                         </a> |  | ||||||
|                         <a href="/logout" title="Sing out" aria-label="Sign out"> |  | ||||||
|                             <i id="logout-button" class="fa fa-sign-out"></i> |  | ||||||
|                         </a> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div id="search-wrapper" class="hidden"> |  | ||||||
|                     <form id="searchbar-outer" class="searchbar-outer"> |  | ||||||
|                         <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> |  | ||||||
|                     </form> |  | ||||||
|                     <div id="searchresults-outer" class="searchresults-outer hidden"> |  | ||||||
|                         <div id="searchresults-header" class="searchresults-header"></div> |  | ||||||
|                         <ul id="searchresults"> |  | ||||||
|                         </ul> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> |  | ||||||
|                 <script> |  | ||||||
|                     document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); |  | ||||||
|                     document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); |  | ||||||
|                     Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { |  | ||||||
|                         link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); |  | ||||||
|                     }); |  | ||||||
|                 </script> |  | ||||||
| 
 |  | ||||||
|                 <div id="content" class="content"> |  | ||||||
|                     <main> |  | ||||||
|                         <h1 id="features"><a class="header" href="#features">Features</a></h1> |  | ||||||
| <ol> |  | ||||||
| <li> |  | ||||||
| <p>Server severals <a href="static_content.html">static contents</a> paths from one web server instance</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><a href="protect_access.html">Protect access content</a> with <a href="auths.html">users authentication and authorizations</a></p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>Create keys and <a href="sessions.html">sessions</a> to content access with <a href="pasetoken.html">asymmetric encrypted</a></p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>Handle and stored <a href="sessions.html">secure sessions</a> and exchange it via <a href="cookies.html">cookies</a></p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>Provides <a href="users.html">users management</a> creation, identification and admin with password and <a href="https://en.wikipedia.org/wiki/Multi-factor_authentication">2FA</a> with optional mail service for notifications</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>Some requests responses are created by a <a href="https://github.com/Keats/tera">template engine</a>, so can be customized to some use cases.</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>Can <a href="trace.html">trace access</a> to <a href="logs.html">logs</a> storages</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><a href="configuration.html">Configurable service</a> with <a href="settings.html">settings</a> via <a href="https://en.wikipedia.org/wiki/TOML">TOML</a> file</p> |  | ||||||
| </li> |  | ||||||
| </ol> |  | ||||||
| 
 |  | ||||||
|                     </main> |  | ||||||
| 
 |  | ||||||
|                     <nav class="nav-wrapper" aria-label="Page navigation"> |  | ||||||
|                         <!-- Mobile navigation buttons --> |  | ||||||
|                             <a rel="prev" href="index.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                                 <i class="fa fa-angle-left"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                             <a rel="next" href="howto.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                                 <i class="fa fa-angle-right"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                         <div style="clear: both"></div> |  | ||||||
|                     </nav> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
| 
 |  | ||||||
|             <nav class="nav-wide-wrapper" aria-label="Page navigation"> |  | ||||||
|                     <a rel="prev" href="index.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                         <i class="fa fa-angle-left"></i> |  | ||||||
|                     </a> |  | ||||||
| 
 |  | ||||||
|                     <a rel="next" href="howto.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                         <i class="fa fa-angle-right"></i> |  | ||||||
|                     </a> |  | ||||||
|             </nav> |  | ||||||
| 
 |  | ||||||
|         </div> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <script> |  | ||||||
|             window.playground_copyable = true; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/ace.js"></script> |  | ||||||
|         <script src="/docserver/editor.js"></script> |  | ||||||
|         <script src="/docserver/mode-rust.js"></script> |  | ||||||
|         <script src="/docserver/theme-dawn.js"></script> |  | ||||||
|         <script src="/docserver/theme-tomorrow_night.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/elasticlunr.min.js"></script> |  | ||||||
|         <script src="/docserver/mark.min.js"></script> |  | ||||||
|         <script src="/docserver/searcher.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/clipboard.min.js"></script> |  | ||||||
|         <script src="/docserver/highlight.js"></script> |  | ||||||
|         <script src="/docserver/book.js"></script> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom JS scripts --> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     </div> |  | ||||||
|     </body> |  | ||||||
| </html> |  | ||||||
| @ -1,202 +0,0 @@ | |||||||
| 
 |  | ||||||
|                                  Apache License |  | ||||||
|                            Version 2.0, January 2004 |  | ||||||
|                         http://www.apache.org/licenses/ |  | ||||||
| 
 |  | ||||||
|    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION |  | ||||||
| 
 |  | ||||||
|    1. Definitions. |  | ||||||
| 
 |  | ||||||
|       "License" shall mean the terms and conditions for use, reproduction, |  | ||||||
|       and distribution as defined by Sections 1 through 9 of this document. |  | ||||||
| 
 |  | ||||||
|       "Licensor" shall mean the copyright owner or entity authorized by |  | ||||||
|       the copyright owner that is granting the License. |  | ||||||
| 
 |  | ||||||
|       "Legal Entity" shall mean the union of the acting entity and all |  | ||||||
|       other entities that control, are controlled by, or are under common |  | ||||||
|       control with that entity. For the purposes of this definition, |  | ||||||
|       "control" means (i) the power, direct or indirect, to cause the |  | ||||||
|       direction or management of such entity, whether by contract or |  | ||||||
|       otherwise, or (ii) ownership of fifty percent (50%) or more of the |  | ||||||
|       outstanding shares, or (iii) beneficial ownership of such entity. |  | ||||||
| 
 |  | ||||||
|       "You" (or "Your") shall mean an individual or Legal Entity |  | ||||||
|       exercising permissions granted by this License. |  | ||||||
| 
 |  | ||||||
|       "Source" form shall mean the preferred form for making modifications, |  | ||||||
|       including but not limited to software source code, documentation |  | ||||||
|       source, and configuration files. |  | ||||||
| 
 |  | ||||||
|       "Object" form shall mean any form resulting from mechanical |  | ||||||
|       transformation or translation of a Source form, including but |  | ||||||
|       not limited to compiled object code, generated documentation, |  | ||||||
|       and conversions to other media types. |  | ||||||
| 
 |  | ||||||
|       "Work" shall mean the work of authorship, whether in Source or |  | ||||||
|       Object form, made available under the License, as indicated by a |  | ||||||
|       copyright notice that is included in or attached to the work |  | ||||||
|       (an example is provided in the Appendix below). |  | ||||||
| 
 |  | ||||||
|       "Derivative Works" shall mean any work, whether in Source or Object |  | ||||||
|       form, that is based on (or derived from) the Work and for which the |  | ||||||
|       editorial revisions, annotations, elaborations, or other modifications |  | ||||||
|       represent, as a whole, an original work of authorship. For the purposes |  | ||||||
|       of this License, Derivative Works shall not include works that remain |  | ||||||
|       separable from, or merely link (or bind by name) to the interfaces of, |  | ||||||
|       the Work and Derivative Works thereof. |  | ||||||
| 
 |  | ||||||
|       "Contribution" shall mean any work of authorship, including |  | ||||||
|       the original version of the Work and any modifications or additions |  | ||||||
|       to that Work or Derivative Works thereof, that is intentionally |  | ||||||
|       submitted to Licensor for inclusion in the Work by the copyright owner |  | ||||||
|       or by an individual or Legal Entity authorized to submit on behalf of |  | ||||||
|       the copyright owner. For the purposes of this definition, "submitted" |  | ||||||
|       means any form of electronic, verbal, or written communication sent |  | ||||||
|       to the Licensor or its representatives, including but not limited to |  | ||||||
|       communication on electronic mailing lists, source code control systems, |  | ||||||
|       and issue tracking systems that are managed by, or on behalf of, the |  | ||||||
|       Licensor for the purpose of discussing and improving the Work, but |  | ||||||
|       excluding communication that is conspicuously marked or otherwise |  | ||||||
|       designated in writing by the copyright owner as "Not a Contribution." |  | ||||||
| 
 |  | ||||||
|       "Contributor" shall mean Licensor and any individual or Legal Entity |  | ||||||
|       on behalf of whom a Contribution has been received by Licensor and |  | ||||||
|       subsequently incorporated within the Work. |  | ||||||
| 
 |  | ||||||
|    2. Grant of Copyright License. Subject to the terms and conditions of |  | ||||||
|       this License, each Contributor hereby grants to You a perpetual, |  | ||||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable |  | ||||||
|       copyright license to reproduce, prepare Derivative Works of, |  | ||||||
|       publicly display, publicly perform, sublicense, and distribute the |  | ||||||
|       Work and such Derivative Works in Source or Object form. |  | ||||||
| 
 |  | ||||||
|    3. Grant of Patent License. Subject to the terms and conditions of |  | ||||||
|       this License, each Contributor hereby grants to You a perpetual, |  | ||||||
|       worldwide, non-exclusive, no-charge, royalty-free, irrevocable |  | ||||||
|       (except as stated in this section) patent license to make, have made, |  | ||||||
|       use, offer to sell, sell, import, and otherwise transfer the Work, |  | ||||||
|       where such license applies only to those patent claims licensable |  | ||||||
|       by such Contributor that are necessarily infringed by their |  | ||||||
|       Contribution(s) alone or by combination of their Contribution(s) |  | ||||||
|       with the Work to which such Contribution(s) was submitted. If You |  | ||||||
|       institute patent litigation against any entity (including a |  | ||||||
|       cross-claim or counterclaim in a lawsuit) alleging that the Work |  | ||||||
|       or a Contribution incorporated within the Work constitutes direct |  | ||||||
|       or contributory patent infringement, then any patent licenses |  | ||||||
|       granted to You under this License for that Work shall terminate |  | ||||||
|       as of the date such litigation is filed. |  | ||||||
| 
 |  | ||||||
|    4. Redistribution. You may reproduce and distribute copies of the |  | ||||||
|       Work or Derivative Works thereof in any medium, with or without |  | ||||||
|       modifications, and in Source or Object form, provided that You |  | ||||||
|       meet the following conditions: |  | ||||||
| 
 |  | ||||||
|       (a) You must give any other recipients of the Work or |  | ||||||
|           Derivative Works a copy of this License; and |  | ||||||
| 
 |  | ||||||
|       (b) You must cause any modified files to carry prominent notices |  | ||||||
|           stating that You changed the files; and |  | ||||||
| 
 |  | ||||||
|       (c) You must retain, in the Source form of any Derivative Works |  | ||||||
|           that You distribute, all copyright, patent, trademark, and |  | ||||||
|           attribution notices from the Source form of the Work, |  | ||||||
|           excluding those notices that do not pertain to any part of |  | ||||||
|           the Derivative Works; and |  | ||||||
| 
 |  | ||||||
|       (d) If the Work includes a "NOTICE" text file as part of its |  | ||||||
|           distribution, then any Derivative Works that You distribute must |  | ||||||
|           include a readable copy of the attribution notices contained |  | ||||||
|           within such NOTICE file, excluding those notices that do not |  | ||||||
|           pertain to any part of the Derivative Works, in at least one |  | ||||||
|           of the following places: within a NOTICE text file distributed |  | ||||||
|           as part of the Derivative Works; within the Source form or |  | ||||||
|           documentation, if provided along with the Derivative Works; or, |  | ||||||
|           within a display generated by the Derivative Works, if and |  | ||||||
|           wherever such third-party notices normally appear. The contents |  | ||||||
|           of the NOTICE file are for informational purposes only and |  | ||||||
|           do not modify the License. You may add Your own attribution |  | ||||||
|           notices within Derivative Works that You distribute, alongside |  | ||||||
|           or as an addendum to the NOTICE text from the Work, provided |  | ||||||
|           that such additional attribution notices cannot be construed |  | ||||||
|           as modifying the License. |  | ||||||
| 
 |  | ||||||
|       You may add Your own copyright statement to Your modifications and |  | ||||||
|       may provide additional or different license terms and conditions |  | ||||||
|       for use, reproduction, or distribution of Your modifications, or |  | ||||||
|       for any such Derivative Works as a whole, provided Your use, |  | ||||||
|       reproduction, and distribution of the Work otherwise complies with |  | ||||||
|       the conditions stated in this License. |  | ||||||
| 
 |  | ||||||
|    5. Submission of Contributions. Unless You explicitly state otherwise, |  | ||||||
|       any Contribution intentionally submitted for inclusion in the Work |  | ||||||
|       by You to the Licensor shall be under the terms and conditions of |  | ||||||
|       this License, without any additional terms or conditions. |  | ||||||
|       Notwithstanding the above, nothing herein shall supersede or modify |  | ||||||
|       the terms of any separate license agreement you may have executed |  | ||||||
|       with Licensor regarding such Contributions. |  | ||||||
| 
 |  | ||||||
|    6. Trademarks. This License does not grant permission to use the trade |  | ||||||
|       names, trademarks, service marks, or product names of the Licensor, |  | ||||||
|       except as required for reasonable and customary use in describing the |  | ||||||
|       origin of the Work and reproducing the content of the NOTICE file. |  | ||||||
| 
 |  | ||||||
|    7. Disclaimer of Warranty. Unless required by applicable law or |  | ||||||
|       agreed to in writing, Licensor provides the Work (and each |  | ||||||
|       Contributor provides its Contributions) on an "AS IS" BASIS, |  | ||||||
|       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |  | ||||||
|       implied, including, without limitation, any warranties or conditions |  | ||||||
|       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A |  | ||||||
|       PARTICULAR PURPOSE. You are solely responsible for determining the |  | ||||||
|       appropriateness of using or redistributing the Work and assume any |  | ||||||
|       risks associated with Your exercise of permissions under this License. |  | ||||||
| 
 |  | ||||||
|    8. Limitation of Liability. In no event and under no legal theory, |  | ||||||
|       whether in tort (including negligence), contract, or otherwise, |  | ||||||
|       unless required by applicable law (such as deliberate and grossly |  | ||||||
|       negligent acts) or agreed to in writing, shall any Contributor be |  | ||||||
|       liable to You for damages, including any direct, indirect, special, |  | ||||||
|       incidental, or consequential damages of any character arising as a |  | ||||||
|       result of this License or out of the use or inability to use the |  | ||||||
|       Work (including but not limited to damages for loss of goodwill, |  | ||||||
|       work stoppage, computer failure or malfunction, or any and all |  | ||||||
|       other commercial damages or losses), even if such Contributor |  | ||||||
|       has been advised of the possibility of such damages. |  | ||||||
| 
 |  | ||||||
|    9. Accepting Warranty or Additional Liability. While redistributing |  | ||||||
|       the Work or Derivative Works thereof, You may choose to offer, |  | ||||||
|       and charge a fee for, acceptance of support, warranty, indemnity, |  | ||||||
|       or other liability obligations and/or rights consistent with this |  | ||||||
|       License. However, in accepting such obligations, You may act only |  | ||||||
|       on Your own behalf and on Your sole responsibility, not on behalf |  | ||||||
|       of any other Contributor, and only if You agree to indemnify, |  | ||||||
|       defend, and hold each Contributor harmless for any liability |  | ||||||
|       incurred by, or claims asserted against, such Contributor by reason |  | ||||||
|       of your accepting any such warranty or additional liability. |  | ||||||
| 
 |  | ||||||
|    END OF TERMS AND CONDITIONS |  | ||||||
| 
 |  | ||||||
|    APPENDIX: How to apply the Apache License to your work. |  | ||||||
| 
 |  | ||||||
|       To apply the Apache License to your work, attach the following |  | ||||||
|       boilerplate notice, with the fields enclosed by brackets "[]" |  | ||||||
|       replaced with your own identifying information. (Don't include |  | ||||||
|       the brackets!)  The text should be enclosed in the appropriate |  | ||||||
|       comment syntax for the file format. We also recommend that a |  | ||||||
|       file or class name and description of purpose be included on the |  | ||||||
|       same "printed page" as the copyright notice for easier |  | ||||||
|       identification within third-party archives. |  | ||||||
| 
 |  | ||||||
|    Copyright [yyyy] [name of copyright owner] |  | ||||||
| 
 |  | ||||||
|    Licensed under the Apache License, Version 2.0 (the "License"); |  | ||||||
|    you may not use this file except in compliance with the License. |  | ||||||
|    You may obtain a copy of the License at |  | ||||||
| 
 |  | ||||||
|        http://www.apache.org/licenses/LICENSE-2.0 |  | ||||||
| 
 |  | ||||||
|    Unless required by applicable law or agreed to in writing, software |  | ||||||
|    distributed under the License is distributed on an "AS IS" BASIS, |  | ||||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |  | ||||||
|    See the License for the specific language governing permissions and |  | ||||||
|    limitations under the License. |  | ||||||
| @ -1,93 +0,0 @@ | |||||||
| Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. |  | ||||||
| 
 |  | ||||||
| This Font Software is licensed under the SIL Open Font License, Version 1.1. |  | ||||||
| This license is copied below, and is also available with a FAQ at: |  | ||||||
| http://scripts.sil.org/OFL |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| ----------------------------------------------------------- |  | ||||||
| SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 |  | ||||||
| ----------------------------------------------------------- |  | ||||||
| 
 |  | ||||||
| PREAMBLE |  | ||||||
| The goals of the Open Font License (OFL) are to stimulate worldwide |  | ||||||
| development of collaborative font projects, to support the font creation |  | ||||||
| efforts of academic and linguistic communities, and to provide a free and |  | ||||||
| open framework in which fonts may be shared and improved in partnership |  | ||||||
| with others. |  | ||||||
| 
 |  | ||||||
| The OFL allows the licensed fonts to be used, studied, modified and |  | ||||||
| redistributed freely as long as they are not sold by themselves. The |  | ||||||
| fonts, including any derivative works, can be bundled, embedded,  |  | ||||||
| redistributed and/or sold with any software provided that any reserved |  | ||||||
| names are not used by derivative works. The fonts and derivatives, |  | ||||||
| however, cannot be released under any other type of license. The |  | ||||||
| requirement for fonts to remain under this license does not apply |  | ||||||
| to any document created using the fonts or their derivatives. |  | ||||||
| 
 |  | ||||||
| DEFINITIONS |  | ||||||
| "Font Software" refers to the set of files released by the Copyright |  | ||||||
| Holder(s) under this license and clearly marked as such. This may |  | ||||||
| include source files, build scripts and documentation. |  | ||||||
| 
 |  | ||||||
| "Reserved Font Name" refers to any names specified as such after the |  | ||||||
| copyright statement(s). |  | ||||||
| 
 |  | ||||||
| "Original Version" refers to the collection of Font Software components as |  | ||||||
| distributed by the Copyright Holder(s). |  | ||||||
| 
 |  | ||||||
| "Modified Version" refers to any derivative made by adding to, deleting, |  | ||||||
| or substituting -- in part or in whole -- any of the components of the |  | ||||||
| Original Version, by changing formats or by porting the Font Software to a |  | ||||||
| new environment. |  | ||||||
| 
 |  | ||||||
| "Author" refers to any designer, engineer, programmer, technical |  | ||||||
| writer or other person who contributed to the Font Software. |  | ||||||
| 
 |  | ||||||
| PERMISSION & CONDITIONS |  | ||||||
| Permission is hereby granted, free of charge, to any person obtaining |  | ||||||
| a copy of the Font Software, to use, study, copy, merge, embed, modify, |  | ||||||
| redistribute, and sell modified and unmodified copies of the Font |  | ||||||
| Software, subject to the following conditions: |  | ||||||
| 
 |  | ||||||
| 1) Neither the Font Software nor any of its individual components, |  | ||||||
| in Original or Modified Versions, may be sold by itself. |  | ||||||
| 
 |  | ||||||
| 2) Original or Modified Versions of the Font Software may be bundled, |  | ||||||
| redistributed and/or sold with any software, provided that each copy |  | ||||||
| contains the above copyright notice and this license. These can be |  | ||||||
| included either as stand-alone text files, human-readable headers or |  | ||||||
| in the appropriate machine-readable metadata fields within text or |  | ||||||
| binary files as long as those fields can be easily viewed by the user. |  | ||||||
| 
 |  | ||||||
| 3) No Modified Version of the Font Software may use the Reserved Font |  | ||||||
| Name(s) unless explicit written permission is granted by the corresponding |  | ||||||
| Copyright Holder. This restriction only applies to the primary font name as |  | ||||||
| presented to the users. |  | ||||||
| 
 |  | ||||||
| 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font |  | ||||||
| Software shall not be used to promote, endorse or advertise any |  | ||||||
| Modified Version, except to acknowledge the contribution(s) of the |  | ||||||
| Copyright Holder(s) and the Author(s) or with their explicit written |  | ||||||
| permission. |  | ||||||
| 
 |  | ||||||
| 5) The Font Software, modified or unmodified, in part or in whole, |  | ||||||
| must be distributed entirely under this license, and must not be |  | ||||||
| distributed under any other license. The requirement for fonts to |  | ||||||
| remain under this license does not apply to any document created |  | ||||||
| using the Font Software. |  | ||||||
| 
 |  | ||||||
| TERMINATION |  | ||||||
| This license becomes null and void if any of the above conditions are |  | ||||||
| not met. |  | ||||||
| 
 |  | ||||||
| DISCLAIMER |  | ||||||
| THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |  | ||||||
| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF |  | ||||||
| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT |  | ||||||
| OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE |  | ||||||
| COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |  | ||||||
| INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL |  | ||||||
| DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |  | ||||||
| FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM |  | ||||||
| OTHER DEALINGS IN THE FONT SOFTWARE. |  | ||||||
| @ -1,100 +0,0 @@ | |||||||
| /* Open Sans is licensed under the Apache License, Version 2.0. See http://www.apache.org/licenses/LICENSE-2.0 */ |  | ||||||
| /* Source Code Pro is under the Open Font License. See https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL */ |  | ||||||
| 
 |  | ||||||
| /* open-sans-300 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ |  | ||||||
| @font-face { |  | ||||||
|   font-family: 'Open Sans'; |  | ||||||
|   font-style: normal; |  | ||||||
|   font-weight: 300; |  | ||||||
|   src: local('Open Sans Light'), local('OpenSans-Light'), |  | ||||||
|        url('open-sans-v17-all-charsets-300.woff2') format('woff2'); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* open-sans-300italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ |  | ||||||
| @font-face { |  | ||||||
|   font-family: 'Open Sans'; |  | ||||||
|   font-style: italic; |  | ||||||
|   font-weight: 300; |  | ||||||
|   src: local('Open Sans Light Italic'), local('OpenSans-LightItalic'), |  | ||||||
|        url('open-sans-v17-all-charsets-300italic.woff2') format('woff2'); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* open-sans-regular - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ |  | ||||||
| @font-face { |  | ||||||
|   font-family: 'Open Sans'; |  | ||||||
|   font-style: normal; |  | ||||||
|   font-weight: 400; |  | ||||||
|   src: local('Open Sans Regular'), local('OpenSans-Regular'), |  | ||||||
|        url('open-sans-v17-all-charsets-regular.woff2') format('woff2'); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* open-sans-italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ |  | ||||||
| @font-face { |  | ||||||
|   font-family: 'Open Sans'; |  | ||||||
|   font-style: italic; |  | ||||||
|   font-weight: 400; |  | ||||||
|   src: local('Open Sans Italic'), local('OpenSans-Italic'), |  | ||||||
|        url('open-sans-v17-all-charsets-italic.woff2') format('woff2'); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* open-sans-600 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ |  | ||||||
| @font-face { |  | ||||||
|   font-family: 'Open Sans'; |  | ||||||
|   font-style: normal; |  | ||||||
|   font-weight: 600; |  | ||||||
|   src: local('Open Sans SemiBold'), local('OpenSans-SemiBold'), |  | ||||||
|        url('open-sans-v17-all-charsets-600.woff2') format('woff2'); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* open-sans-600italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ |  | ||||||
| @font-face { |  | ||||||
|   font-family: 'Open Sans'; |  | ||||||
|   font-style: italic; |  | ||||||
|   font-weight: 600; |  | ||||||
|   src: local('Open Sans SemiBold Italic'), local('OpenSans-SemiBoldItalic'), |  | ||||||
|        url('open-sans-v17-all-charsets-600italic.woff2') format('woff2'); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* open-sans-700 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ |  | ||||||
| @font-face { |  | ||||||
|   font-family: 'Open Sans'; |  | ||||||
|   font-style: normal; |  | ||||||
|   font-weight: 700; |  | ||||||
|   src: local('Open Sans Bold'), local('OpenSans-Bold'), |  | ||||||
|        url('open-sans-v17-all-charsets-700.woff2') format('woff2'); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* open-sans-700italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ |  | ||||||
| @font-face { |  | ||||||
|   font-family: 'Open Sans'; |  | ||||||
|   font-style: italic; |  | ||||||
|   font-weight: 700; |  | ||||||
|   src: local('Open Sans Bold Italic'), local('OpenSans-BoldItalic'), |  | ||||||
|        url('open-sans-v17-all-charsets-700italic.woff2') format('woff2'); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* open-sans-800 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ |  | ||||||
| @font-face { |  | ||||||
|   font-family: 'Open Sans'; |  | ||||||
|   font-style: normal; |  | ||||||
|   font-weight: 800; |  | ||||||
|   src: local('Open Sans ExtraBold'), local('OpenSans-ExtraBold'), |  | ||||||
|        url('open-sans-v17-all-charsets-800.woff2') format('woff2'); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* open-sans-800italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ |  | ||||||
| @font-face { |  | ||||||
|   font-family: 'Open Sans'; |  | ||||||
|   font-style: italic; |  | ||||||
|   font-weight: 800; |  | ||||||
|   src: local('Open Sans ExtraBold Italic'), local('OpenSans-ExtraBoldItalic'), |  | ||||||
|        url('open-sans-v17-all-charsets-800italic.woff2') format('woff2'); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* source-code-pro-500 - latin_vietnamese_latin-ext_greek_cyrillic-ext_cyrillic */ |  | ||||||
| @font-face { |  | ||||||
|   font-family: 'Source Code Pro'; |  | ||||||
|   font-style: normal; |  | ||||||
|   font-weight: 500; |  | ||||||
|   src: url('source-code-pro-v11-all-charsets-500.woff2') format('woff2'); |  | ||||||
| } |  | ||||||
| @ -1,82 +0,0 @@ | |||||||
| /* |  | ||||||
|  * An increased contrast highlighting scheme loosely based on the |  | ||||||
|  * "Base16 Atelier Dune Light" theme by Bram de Haan |  | ||||||
|  * (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) |  | ||||||
|  * Original Base16 color scheme by Chris Kempson |  | ||||||
|  * (https://github.com/chriskempson/base16) |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| /* Comment */ |  | ||||||
| .hljs-comment, |  | ||||||
| .hljs-quote { |  | ||||||
|   color: #575757; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* Red */ |  | ||||||
| .hljs-variable, |  | ||||||
| .hljs-template-variable, |  | ||||||
| .hljs-attribute, |  | ||||||
| .hljs-tag, |  | ||||||
| .hljs-name, |  | ||||||
| .hljs-regexp, |  | ||||||
| .hljs-link, |  | ||||||
| .hljs-name, |  | ||||||
| .hljs-selector-id, |  | ||||||
| .hljs-selector-class { |  | ||||||
|   color: #d70025; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* Orange */ |  | ||||||
| .hljs-number, |  | ||||||
| .hljs-meta, |  | ||||||
| .hljs-built_in, |  | ||||||
| .hljs-builtin-name, |  | ||||||
| .hljs-literal, |  | ||||||
| .hljs-type, |  | ||||||
| .hljs-params { |  | ||||||
|   color: #b21e00; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* Green */ |  | ||||||
| .hljs-string, |  | ||||||
| .hljs-symbol, |  | ||||||
| .hljs-bullet { |  | ||||||
|   color: #008200; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* Blue */ |  | ||||||
| .hljs-title, |  | ||||||
| .hljs-section { |  | ||||||
|   color: #0030f2; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* Purple */ |  | ||||||
| .hljs-keyword, |  | ||||||
| .hljs-selector-tag { |  | ||||||
|   color: #9d00ec; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .hljs { |  | ||||||
|   display: block; |  | ||||||
|   overflow-x: auto; |  | ||||||
|   background: #f6f7f6; |  | ||||||
|   color: #000; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .hljs-emphasis { |  | ||||||
|   font-style: italic; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .hljs-strong { |  | ||||||
|   font-weight: bold; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .hljs-addition { |  | ||||||
|   color: #22863a; |  | ||||||
|   background-color: #f0fff4; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .hljs-deletion { |  | ||||||
|   color: #b31d28; |  | ||||||
|   background-color: #ffeef0; |  | ||||||
| } |  | ||||||
| @ -1,212 +0,0 @@ | |||||||
| <!DOCTYPE HTML> |  | ||||||
| <html lang="en" class="sidebar-visible no-js light"> |  | ||||||
|     <head> |  | ||||||
|         <!-- Book generated using mdBook --> |  | ||||||
|         <meta charset="UTF-8"> |  | ||||||
|         <title>How to - Doc Server</title> |  | ||||||
|         <base href="/docserver/"> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <!-- Custom HTML head --> |  | ||||||
|          |  | ||||||
|         <meta name="description" content="Doc Server"> |  | ||||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> |  | ||||||
|         <meta name="theme-color" content="#ffffff" /> |  | ||||||
| 
 |  | ||||||
|         <link rel="icon" href="/docserver/favicon.svg"> |  | ||||||
|         <link rel="shortcut icon" href="/docserver/favicon.png"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/variables.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/general.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/chrome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/print.css" media="print"> |  | ||||||
| 
 |  | ||||||
|         <!-- Fonts --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/FontAwesome/css/font-awesome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/fonts/fonts.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Highlight.js Stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/highlight.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/tomorrow-night.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/ayu-highlight.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom theme stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/custom.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/mdbook-admonish.css"> |  | ||||||
| 
 |  | ||||||
|     </head> |  | ||||||
|     <body> |  | ||||||
|     <div id="body-container"> |  | ||||||
|         <!-- Provide site root to javascript --> |  | ||||||
|         <script> |  | ||||||
|             var path_to_root = "/docserver/"; |  | ||||||
|             var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light"; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Work around some values being stored in localStorage wrapped in quotes --> |  | ||||||
|         <script> |  | ||||||
|             try { |  | ||||||
|                 var theme = localStorage.getItem('mdbook-theme'); |  | ||||||
|                 var sidebar = localStorage.getItem('mdbook-sidebar'); |  | ||||||
| 
 |  | ||||||
|                 if (theme.startsWith('"') && theme.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (sidebar.startsWith('"') && sidebar.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); |  | ||||||
|                 } |  | ||||||
|             } catch (e) { } |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Set the theme before any content is loaded, prevents flash --> |  | ||||||
|         <script> |  | ||||||
|             var theme; |  | ||||||
|             try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } |  | ||||||
|             if (theme === null || theme === undefined) { theme = default_theme; } |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             html.classList.remove('no-js') |  | ||||||
|             html.classList.remove('light') |  | ||||||
|             html.classList.add(theme); |  | ||||||
|             html.classList.add('js'); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Hide / unhide sidebar before it is displayed --> |  | ||||||
|         <script> |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             var sidebar = null; |  | ||||||
|             if (document.body.clientWidth >= 1080) { |  | ||||||
|                 try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } |  | ||||||
|                 sidebar = sidebar || 'visible'; |  | ||||||
|             } else { |  | ||||||
|                 sidebar = 'hidden'; |  | ||||||
|             } |  | ||||||
|             html.classList.remove('sidebar-visible'); |  | ||||||
|             html.classList.add("sidebar-" + sidebar); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <nav id="sidebar" class="sidebar" aria-label="Table of contents"> |  | ||||||
|             <div class="sidebar-scrollbox"> |  | ||||||
|                 <ol class="chapter"><li class="chapter-item "><a href="/docserver/introduction.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li class="chapter-item "><a href="/docserver/index.html"><strong aria-hidden="true">2.</strong> What is this ?</a></li><li class="chapter-item "><a href="/docserver/features.html"><strong aria-hidden="true">3.</strong> Features</a></li><li class="chapter-item expanded "><a href="/docserver/howto.html" class="active"><strong aria-hidden="true">4.</strong> How to</a></li><li class="chapter-item "><a href="/docserver/quick-start.html"><strong aria-hidden="true">5.</strong> Quick Start</a></li><li class="spacer"></li><li class="chapter-item affix "><li class="part-title">Server and Content</li><li class="chapter-item "><a href="/docserver/one_server.html"><strong aria-hidden="true">6.</strong> One web server instance</a></li><li class="chapter-item "><a href="/docserver/server_modes.html"><strong aria-hidden="true">7.</strong> Server modes</a></li><li class="chapter-item "><a href="/docserver/static_content.html"><strong aria-hidden="true">8.</strong> Static contents</a></li><li class="chapter-item "><a href="/docserver/url_path.html"><strong aria-hidden="true">9.</strong> url_path prefix</a></li><li class="chapter-item "><a href="/docserver/protect_access.html"><strong aria-hidden="true">10.</strong> Protect access</a></li><li class="chapter-item affix "><li class="part-title">Users and Policies</li><li class="chapter-item "><a href="/docserver/users.html"><strong aria-hidden="true">11.</strong> Users</a></li><li class="chapter-item "><a href="/docserver/users_sql.html"><strong aria-hidden="true">12.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/users_file_storage.html"><strong aria-hidden="true">13.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/roles.html"><strong aria-hidden="true">14.</strong> Roles</a></li><li class="chapter-item "><a href="/docserver/auths.html"><strong aria-hidden="true">15.</strong> Users auths</a></li><li class="chapter-item "><a href="/docserver/policies.html"><strong aria-hidden="true">16.</strong> Access policies</a></li><li class="chapter-item "><a href="/docserver/adminusers.html"><strong aria-hidden="true">17.</strong> Users Admin</a></li><li class="chapter-item affix "><li class="part-title">Sessions</li><li class="chapter-item "><a href="/docserver/sessions.html"><strong aria-hidden="true">18.</strong> Session data</a></li><li class="chapter-item "><a href="/docserver/pasetoken.html"><strong aria-hidden="true">19.</strong> Pasetoken</a></li><li class="chapter-item "><a href="/docserver/sessions_sql.html"><strong aria-hidden="true">20.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/sessions_file_storage.html"><strong aria-hidden="true">21.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/cookie.html"><strong aria-hidden="true">22.</strong> Cookie set</a></li><li class="chapter-item affix "><li class="part-title">Logs and Trace</li><li class="chapter-item "><a href="/docserver/trace.html"><strong aria-hidden="true">23.</strong> Traced</a></li><li class="chapter-item "><a href="/docserver/logs.html"><strong aria-hidden="true">24.</strong> Sessions logs</a></li><li class="chapter-item affix "><li class="part-title">Configuration</li><li class="chapter-item "><a href="/docserver/configuration.html"><strong aria-hidden="true">25.</strong> Configurable service</a></li><li class="chapter-item "><a href="/docserver/settings.html"><strong aria-hidden="true">26.</strong> Config settings</a></li><li class="spacer"></li></ol> |  | ||||||
|             </div> |  | ||||||
|             <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> |  | ||||||
|         </nav> |  | ||||||
| 
 |  | ||||||
|         <div id="page-wrapper" class="page-wrapper"> |  | ||||||
| 
 |  | ||||||
|             <div class="page"> |  | ||||||
|                                 <div id="menu-bar-hover-placeholder"></div> |  | ||||||
|                 <div id="menu-bar" class="menu-bar sticky bordered"> |  | ||||||
|                     <div class="left-buttons"> |  | ||||||
|                         <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> |  | ||||||
|                             <i class="fa fa-bars"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="sidebar-toggle" onclick="location.href='/'" class="icon-button" type="button" title="Home" aria-label="Home" aria-controls=""> |  | ||||||
|                             <i class="fa fa-home"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> |  | ||||||
|                             <i class="fa fa-paint-brush"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> |  | ||||||
|                         </ul> |  | ||||||
|                         <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> |  | ||||||
|                             <i class="fa fa-search"></i> |  | ||||||
|                         </button> |  | ||||||
|                     </div> |  | ||||||
| 
 |  | ||||||
|                     <h1 class="menu-title">Doc Server</h1> |  | ||||||
| 
 |  | ||||||
|                     <div class="right-buttons"> |  | ||||||
|                         <a href="/docserver/print.html" title="Print this book" aria-label="Print this book"> |  | ||||||
|                             <i id="print-button" class="fa fa-print"></i> |  | ||||||
|                         </a> |  | ||||||
|                         <a href="/logout" title="Sing out" aria-label="Sign out"> |  | ||||||
|                             <i id="logout-button" class="fa fa-sign-out"></i> |  | ||||||
|                         </a> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div id="search-wrapper" class="hidden"> |  | ||||||
|                     <form id="searchbar-outer" class="searchbar-outer"> |  | ||||||
|                         <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> |  | ||||||
|                     </form> |  | ||||||
|                     <div id="searchresults-outer" class="searchresults-outer hidden"> |  | ||||||
|                         <div id="searchresults-header" class="searchresults-header"></div> |  | ||||||
|                         <ul id="searchresults"> |  | ||||||
|                         </ul> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> |  | ||||||
|                 <script> |  | ||||||
|                     document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); |  | ||||||
|                     document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); |  | ||||||
|                     Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { |  | ||||||
|                         link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); |  | ||||||
|                     }); |  | ||||||
|                 </script> |  | ||||||
| 
 |  | ||||||
|                 <div id="content" class="content"> |  | ||||||
|                     <main> |  | ||||||
|                         <h1 id="how-to"><a class="header" href="#how-to">How to</a></h1> |  | ||||||
| 
 |  | ||||||
|                     </main> |  | ||||||
| 
 |  | ||||||
|                     <nav class="nav-wrapper" aria-label="Page navigation"> |  | ||||||
|                         <!-- Mobile navigation buttons --> |  | ||||||
|                             <a rel="prev" href="features.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                                 <i class="fa fa-angle-left"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                             <a rel="next" href="quick-start.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                                 <i class="fa fa-angle-right"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                         <div style="clear: both"></div> |  | ||||||
|                     </nav> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
| 
 |  | ||||||
|             <nav class="nav-wide-wrapper" aria-label="Page navigation"> |  | ||||||
|                     <a rel="prev" href="features.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                         <i class="fa fa-angle-left"></i> |  | ||||||
|                     </a> |  | ||||||
| 
 |  | ||||||
|                     <a rel="next" href="quick-start.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                         <i class="fa fa-angle-right"></i> |  | ||||||
|                     </a> |  | ||||||
|             </nav> |  | ||||||
| 
 |  | ||||||
|         </div> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <script> |  | ||||||
|             window.playground_copyable = true; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/ace.js"></script> |  | ||||||
|         <script src="/docserver/editor.js"></script> |  | ||||||
|         <script src="/docserver/mode-rust.js"></script> |  | ||||||
|         <script src="/docserver/theme-dawn.js"></script> |  | ||||||
|         <script src="/docserver/theme-tomorrow_night.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/elasticlunr.min.js"></script> |  | ||||||
|         <script src="/docserver/mark.min.js"></script> |  | ||||||
|         <script src="/docserver/searcher.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/clipboard.min.js"></script> |  | ||||||
|         <script src="/docserver/highlight.js"></script> |  | ||||||
|         <script src="/docserver/book.js"></script> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom JS scripts --> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     </div> |  | ||||||
|     </body> |  | ||||||
| </html> |  | ||||||
| Before Width: | Height: | Size: 710 KiB | 
| @ -1,38 +0,0 @@ | |||||||
| <?xml version="1.0" encoding="utf-8"?> |  | ||||||
| <!-- Generator: Adobe Illustrator 25.4.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  --> |  | ||||||
| <svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" |  | ||||||
| 	 viewBox="0 0 100 100" style="enable-background:new 0 0 100 100;" xml:space="preserve"> |  | ||||||
| <style type="text/css"> |  | ||||||
| 	.st0{fill:#0061A1;} |  | ||||||
| </style> |  | ||||||
| <path d="M63.4,73.1c-0.7,0-1.2,0.5-1.2,1.2v12.2H13.5v-56h15.8c0.7,0,1.2-0.5,1.2-1.2V13.5h31.7v7.3c0,0.7,0.5,1.2,1.2,1.2 |  | ||||||
| 	s1.2-0.5,1.2-1.2v-8.5c0-0.7-0.5-1.2-1.2-1.2H29.5c-0.4,0-0.8,0.1-1.1,0.4L11.4,28.4C11.2,28.7,11,29,11,29.3v58.5 |  | ||||||
| 	c0,0.7,0.5,1.2,1.2,1.2h51.2c0.7,0,1.2-0.5,1.2-1.2V74.4C64.6,73.7,64.1,73.1,63.4,73.1z M28.1,15.2v12.9H15.2L28.1,15.2z"/> |  | ||||||
| <path class="st0" d="M85.3,24.4H51.2c-2,0-3.7,1.6-3.7,3.7v1.4c0,4-2.1,7.7-5.5,9.7c-0.6,0.4-0.7,1.1-0.3,1.7 |  | ||||||
| 	c0.2,0.3,0.6,0.5,0.9,0.5h42.6c2,0,3.7-1.6,3.7-3.7v-9.7C89,26.1,87.3,24.4,85.3,24.4z M86.5,37.8c0,0.7-0.5,1.2-1.2,1.2H46.2 |  | ||||||
| 	c2.5-2.6,3.8-6,3.8-9.5v-1.4c0-0.7,0.5-1.2,1.2-1.2h34.1c0.7,0,1.2,0.5,1.2,1.2V37.8z"/> |  | ||||||
| <path class="st0" d="M63.4,31.7h-7.3c-0.7,0-1.2,0.5-1.2,1.2s0.5,1.2,1.2,1.2h7.3c0.7,0,1.2-0.5,1.2-1.2S64.1,31.7,63.4,31.7z"/> |  | ||||||
| <path class="st0" d="M80.5,31.7H68.3c-0.7,0-1.2,0.5-1.2,1.2s0.5,1.2,1.2,1.2h12.2c0.7,0,1.2-0.5,1.2-1.2S81.1,31.7,80.5,31.7z"/> |  | ||||||
| <path class="st0" d="M85.3,46.3H51.2c-2,0-3.7,1.6-3.7,3.7v8.7c0,4-2.1,7.7-5.5,9.7c-0.6,0.4-0.7,1.1-0.3,1.7 |  | ||||||
| 	c0.2,0.3,0.6,0.5,0.9,0.5h42.6c2,0,3.7-1.6,3.7-3.7V50C89,48,87.3,46.3,85.3,46.3z M86.5,67.1c0,0.7-0.5,1.2-1.2,1.2H46.2 |  | ||||||
| 	c2.5-2.6,3.8-6,3.8-9.5V50c0-0.7,0.5-1.2,1.2-1.2h34.1c0.7,0,1.2,0.5,1.2,1.2V67.1z"/> |  | ||||||
| <path class="st0" d="M56.1,56.1H61c0.7,0,1.2-0.5,1.2-1.2s-0.5-1.2-1.2-1.2h-4.9c-0.7,0-1.2,0.5-1.2,1.2S55.4,56.1,56.1,56.1z"/> |  | ||||||
| <path class="st0" d="M80.5,53.7H65.8c-0.7,0-1.2,0.5-1.2,1.2s0.5,1.2,1.2,1.2h14.6c0.7,0,1.2-0.5,1.2-1.2S81.1,53.7,80.5,53.7z"/> |  | ||||||
| <path class="st0" d="M65.8,62.2h-9.7c-0.7,0-1.2,0.5-1.2,1.2c0,0.7,0.5,1.2,1.2,1.2h9.7c0.7,0,1.2-0.5,1.2-1.2 |  | ||||||
| 	C67.1,62.7,66.5,62.2,65.8,62.2z"/> |  | ||||||
| <path class="st0" d="M80.5,62.2h-9.7c-0.7,0-1.2,0.5-1.2,1.2c0,0.7,0.5,1.2,1.2,1.2h9.7c0.7,0,1.2-0.5,1.2-1.2 |  | ||||||
| 	C81.7,62.7,81.1,62.2,80.5,62.2z"/> |  | ||||||
| <path d="M23.2,35.4c-2.7,0-4.9,2.2-4.9,4.9c0,2.7,2.2,4.9,4.9,4.9s4.9-2.2,4.9-4.9C28.1,37.6,25.9,35.4,23.2,35.4z M23.2,42.7 |  | ||||||
| 	c-1.3,0-2.4-1.1-2.4-2.4c0-1.3,1.1-2.4,2.4-2.4c1.3,0,2.4,1.1,2.4,2.4C25.6,41.6,24.5,42.7,23.2,42.7z"/> |  | ||||||
| <path d="M23.2,64.6c-2.7,0-4.9,2.2-4.9,4.9c0,2.7,2.2,4.9,4.9,4.9s4.9-2.2,4.9-4.9C28.1,66.8,25.9,64.6,23.2,64.6z M23.2,71.9 |  | ||||||
| 	c-1.3,0-2.4-1.1-2.4-2.4s1.1-2.4,2.4-2.4c1.3,0,2.4,1.1,2.4,2.4S24.5,71.9,23.2,71.9z"/> |  | ||||||
| <path d="M31.7,37.8h4.9c0.7,0,1.2-0.5,1.2-1.2s-0.5-1.2-1.2-1.2h-4.9c-0.7,0-1.2,0.5-1.2,1.2S31.1,37.8,31.7,37.8z"/> |  | ||||||
| <path d="M31.7,45.1h4.9c0.7,0,1.2-0.5,1.2-1.2s-0.5-1.2-1.2-1.2h-4.9c-0.7,0-1.2,0.5-1.2,1.2S31.1,45.1,31.7,45.1z"/> |  | ||||||
| <path d="M42.7,51.2c0-0.7-0.5-1.2-1.2-1.2h-9.7c-0.7,0-1.2,0.5-1.2,1.2s0.5,1.2,1.2,1.2h9.7C42.1,52.4,42.7,51.9,42.7,51.2z"/> |  | ||||||
| <path d="M31.7,67.1h4.9c0.7,0,1.2-0.5,1.2-1.2c0-0.7-0.5-1.2-1.2-1.2h-4.9c-0.7,0-1.2,0.5-1.2,1.2C30.5,66.5,31.1,67.1,31.7,67.1z" |  | ||||||
| 	/> |  | ||||||
| <path d="M31.7,74.4h4.9c0.7,0,1.2-0.5,1.2-1.2c0-0.7-0.5-1.2-1.2-1.2h-4.9c-0.7,0-1.2,0.5-1.2,1.2C30.5,73.8,31.1,74.4,31.7,74.4z" |  | ||||||
| 	/> |  | ||||||
| <path d="M31.7,81.7h24.4c0.7,0,1.2-0.5,1.2-1.2c0-0.7-0.5-1.2-1.2-1.2H31.7c-0.7,0-1.2,0.5-1.2,1.2C30.5,81.1,31.1,81.7,31.7,81.7z" |  | ||||||
| 	/> |  | ||||||
| </svg> |  | ||||||
| Before Width: | Height: | Size: 3.3 KiB | 
| Before Width: | Height: | Size: 8.0 KiB | 
| Before Width: | Height: | Size: 816 KiB | 
| @ -1,38 +0,0 @@ | |||||||
| <?xml version="1.0" encoding="utf-8"?> |  | ||||||
| <!-- Generator: Adobe Illustrator 25.4.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  --> |  | ||||||
| <svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" |  | ||||||
| 	 viewBox="0 0 100 100" style="enable-background:new 0 0 100 100;" xml:space="preserve"> |  | ||||||
| <style type="text/css"> |  | ||||||
| 	.st0{fill:#0061A1;} |  | ||||||
| </style> |  | ||||||
| <path d="M63.4,73.1c-0.7,0-1.2,0.5-1.2,1.2v12.2H13.5v-56h15.8c0.7,0,1.2-0.5,1.2-1.2V13.5h31.7v7.3c0,0.7,0.5,1.2,1.2,1.2 |  | ||||||
| 	s1.2-0.5,1.2-1.2v-8.5c0-0.7-0.5-1.2-1.2-1.2H29.5c-0.4,0-0.8,0.1-1.1,0.4L11.4,28.4C11.2,28.7,11,29,11,29.3v58.5 |  | ||||||
| 	c0,0.7,0.5,1.2,1.2,1.2h51.2c0.7,0,1.2-0.5,1.2-1.2V74.4C64.6,73.7,64.1,73.1,63.4,73.1z M28.1,15.2v12.9H15.2L28.1,15.2z"/> |  | ||||||
| <path class="st0" d="M85.3,24.4H51.2c-2,0-3.7,1.6-3.7,3.7v1.4c0,4-2.1,7.7-5.5,9.7c-0.6,0.4-0.7,1.1-0.3,1.7 |  | ||||||
| 	c0.2,0.3,0.6,0.5,0.9,0.5h42.6c2,0,3.7-1.6,3.7-3.7v-9.7C89,26.1,87.3,24.4,85.3,24.4z M86.5,37.8c0,0.7-0.5,1.2-1.2,1.2H46.2 |  | ||||||
| 	c2.5-2.6,3.8-6,3.8-9.5v-1.4c0-0.7,0.5-1.2,1.2-1.2h34.1c0.7,0,1.2,0.5,1.2,1.2V37.8z"/> |  | ||||||
| <path class="st0" d="M63.4,31.7h-7.3c-0.7,0-1.2,0.5-1.2,1.2s0.5,1.2,1.2,1.2h7.3c0.7,0,1.2-0.5,1.2-1.2S64.1,31.7,63.4,31.7z"/> |  | ||||||
| <path class="st0" d="M80.5,31.7H68.3c-0.7,0-1.2,0.5-1.2,1.2s0.5,1.2,1.2,1.2h12.2c0.7,0,1.2-0.5,1.2-1.2S81.1,31.7,80.5,31.7z"/> |  | ||||||
| <path class="st0" d="M85.3,46.3H51.2c-2,0-3.7,1.6-3.7,3.7v8.7c0,4-2.1,7.7-5.5,9.7c-0.6,0.4-0.7,1.1-0.3,1.7 |  | ||||||
| 	c0.2,0.3,0.6,0.5,0.9,0.5h42.6c2,0,3.7-1.6,3.7-3.7V50C89,48,87.3,46.3,85.3,46.3z M86.5,67.1c0,0.7-0.5,1.2-1.2,1.2H46.2 |  | ||||||
| 	c2.5-2.6,3.8-6,3.8-9.5V50c0-0.7,0.5-1.2,1.2-1.2h34.1c0.7,0,1.2,0.5,1.2,1.2V67.1z"/> |  | ||||||
| <path class="st0" d="M56.1,56.1H61c0.7,0,1.2-0.5,1.2-1.2s-0.5-1.2-1.2-1.2h-4.9c-0.7,0-1.2,0.5-1.2,1.2S55.4,56.1,56.1,56.1z"/> |  | ||||||
| <path class="st0" d="M80.5,53.7H65.8c-0.7,0-1.2,0.5-1.2,1.2s0.5,1.2,1.2,1.2h14.6c0.7,0,1.2-0.5,1.2-1.2S81.1,53.7,80.5,53.7z"/> |  | ||||||
| <path class="st0" d="M65.8,62.2h-9.7c-0.7,0-1.2,0.5-1.2,1.2c0,0.7,0.5,1.2,1.2,1.2h9.7c0.7,0,1.2-0.5,1.2-1.2 |  | ||||||
| 	C67.1,62.7,66.5,62.2,65.8,62.2z"/> |  | ||||||
| <path class="st0" d="M80.5,62.2h-9.7c-0.7,0-1.2,0.5-1.2,1.2c0,0.7,0.5,1.2,1.2,1.2h9.7c0.7,0,1.2-0.5,1.2-1.2 |  | ||||||
| 	C81.7,62.7,81.1,62.2,80.5,62.2z"/> |  | ||||||
| <path d="M23.2,35.4c-2.7,0-4.9,2.2-4.9,4.9c0,2.7,2.2,4.9,4.9,4.9s4.9-2.2,4.9-4.9C28.1,37.6,25.9,35.4,23.2,35.4z M23.2,42.7 |  | ||||||
| 	c-1.3,0-2.4-1.1-2.4-2.4c0-1.3,1.1-2.4,2.4-2.4c1.3,0,2.4,1.1,2.4,2.4C25.6,41.6,24.5,42.7,23.2,42.7z"/> |  | ||||||
| <path d="M23.2,64.6c-2.7,0-4.9,2.2-4.9,4.9c0,2.7,2.2,4.9,4.9,4.9s4.9-2.2,4.9-4.9C28.1,66.8,25.9,64.6,23.2,64.6z M23.2,71.9 |  | ||||||
| 	c-1.3,0-2.4-1.1-2.4-2.4s1.1-2.4,2.4-2.4c1.3,0,2.4,1.1,2.4,2.4S24.5,71.9,23.2,71.9z"/> |  | ||||||
| <path d="M31.7,37.8h4.9c0.7,0,1.2-0.5,1.2-1.2s-0.5-1.2-1.2-1.2h-4.9c-0.7,0-1.2,0.5-1.2,1.2S31.1,37.8,31.7,37.8z"/> |  | ||||||
| <path d="M31.7,45.1h4.9c0.7,0,1.2-0.5,1.2-1.2s-0.5-1.2-1.2-1.2h-4.9c-0.7,0-1.2,0.5-1.2,1.2S31.1,45.1,31.7,45.1z"/> |  | ||||||
| <path d="M42.7,51.2c0-0.7-0.5-1.2-1.2-1.2h-9.7c-0.7,0-1.2,0.5-1.2,1.2s0.5,1.2,1.2,1.2h9.7C42.1,52.4,42.7,51.9,42.7,51.2z"/> |  | ||||||
| <path d="M31.7,67.1h4.9c0.7,0,1.2-0.5,1.2-1.2c0-0.7-0.5-1.2-1.2-1.2h-4.9c-0.7,0-1.2,0.5-1.2,1.2C30.5,66.5,31.1,67.1,31.7,67.1z" |  | ||||||
| 	/> |  | ||||||
| <path d="M31.7,74.4h4.9c0.7,0,1.2-0.5,1.2-1.2c0-0.7-0.5-1.2-1.2-1.2h-4.9c-0.7,0-1.2,0.5-1.2,1.2C30.5,73.8,31.1,74.4,31.7,74.4z" |  | ||||||
| 	/> |  | ||||||
| <path d="M31.7,81.7h24.4c0.7,0,1.2-0.5,1.2-1.2c0-0.7-0.5-1.2-1.2-1.2H31.7c-0.7,0-1.2,0.5-1.2,1.2C30.5,81.1,31.1,81.7,31.7,81.7z" |  | ||||||
| 	/> |  | ||||||
| </svg> |  | ||||||
| Before Width: | Height: | Size: 3.3 KiB | 
| Before Width: | Height: | Size: 728 KiB | 
| Before Width: | Height: | Size: 848 KiB | 
| Before Width: | Height: | Size: 944 KiB | 
| Before Width: | Height: | Size: 852 KiB | 
| Before Width: | Height: | Size: 948 KiB | 
| Before Width: | Height: | Size: 835 KiB | 
| Before Width: | Height: | Size: 367 KiB | 
| Before Width: | Height: | Size: 433 KiB | 
| Before Width: | Height: | Size: 912 KiB | 
| Before Width: | Height: | Size: 1003 KiB | 
| Before Width: | Height: | Size: 932 KiB | 
| Before Width: | Height: | Size: 847 KiB | 
| Before Width: | Height: | Size: 943 KiB | 
| Before Width: | Height: | Size: 841 KiB | 
| Before Width: | Height: | Size: 938 KiB | 
| Before Width: | Height: | Size: 949 KiB | 
| @ -1,229 +0,0 @@ | |||||||
| <!DOCTYPE HTML> |  | ||||||
| <html lang="en" class="sidebar-visible no-js light"> |  | ||||||
|     <head> |  | ||||||
|         <!-- Book generated using mdBook --> |  | ||||||
|         <meta charset="UTF-8"> |  | ||||||
|         <title>What is this ? - Doc Server</title> |  | ||||||
|         <base href="/docserver/"> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <!-- Custom HTML head --> |  | ||||||
|          |  | ||||||
|         <meta name="description" content="Doc Server"> |  | ||||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> |  | ||||||
|         <meta name="theme-color" content="#ffffff" /> |  | ||||||
| 
 |  | ||||||
|         <link rel="icon" href="/docserver/favicon.svg"> |  | ||||||
|         <link rel="shortcut icon" href="/docserver/favicon.png"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/variables.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/general.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/chrome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/print.css" media="print"> |  | ||||||
| 
 |  | ||||||
|         <!-- Fonts --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/FontAwesome/css/font-awesome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/fonts/fonts.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Highlight.js Stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/highlight.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/tomorrow-night.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/ayu-highlight.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom theme stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/custom.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/mdbook-admonish.css"> |  | ||||||
| 
 |  | ||||||
|     </head> |  | ||||||
|     <body> |  | ||||||
|     <div id="body-container"> |  | ||||||
|         <!-- Provide site root to javascript --> |  | ||||||
|         <script> |  | ||||||
|             var path_to_root = "/docserver/"; |  | ||||||
|             var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light"; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Work around some values being stored in localStorage wrapped in quotes --> |  | ||||||
|         <script> |  | ||||||
|             try { |  | ||||||
|                 var theme = localStorage.getItem('mdbook-theme'); |  | ||||||
|                 var sidebar = localStorage.getItem('mdbook-sidebar'); |  | ||||||
| 
 |  | ||||||
|                 if (theme.startsWith('"') && theme.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (sidebar.startsWith('"') && sidebar.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); |  | ||||||
|                 } |  | ||||||
|             } catch (e) { } |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Set the theme before any content is loaded, prevents flash --> |  | ||||||
|         <script> |  | ||||||
|             var theme; |  | ||||||
|             try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } |  | ||||||
|             if (theme === null || theme === undefined) { theme = default_theme; } |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             html.classList.remove('no-js') |  | ||||||
|             html.classList.remove('light') |  | ||||||
|             html.classList.add(theme); |  | ||||||
|             html.classList.add('js'); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Hide / unhide sidebar before it is displayed --> |  | ||||||
|         <script> |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             var sidebar = null; |  | ||||||
|             if (document.body.clientWidth >= 1080) { |  | ||||||
|                 try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } |  | ||||||
|                 sidebar = sidebar || 'visible'; |  | ||||||
|             } else { |  | ||||||
|                 sidebar = 'hidden'; |  | ||||||
|             } |  | ||||||
|             html.classList.remove('sidebar-visible'); |  | ||||||
|             html.classList.add("sidebar-" + sidebar); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <nav id="sidebar" class="sidebar" aria-label="Table of contents"> |  | ||||||
|             <div class="sidebar-scrollbox"> |  | ||||||
|                 <ol class="chapter"><li class="chapter-item "><a href="/docserver/introduction.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li class="chapter-item expanded "><a href="/docserver/index.html" class="active"><strong aria-hidden="true">2.</strong> What is this ?</a></li><li class="chapter-item "><a href="/docserver/features.html"><strong aria-hidden="true">3.</strong> Features</a></li><li class="chapter-item "><a href="/docserver/howto.html"><strong aria-hidden="true">4.</strong> How to</a></li><li class="chapter-item "><a href="/docserver/quick-start.html"><strong aria-hidden="true">5.</strong> Quick Start</a></li><li class="spacer"></li><li class="chapter-item affix "><li class="part-title">Server and Content</li><li class="chapter-item "><a href="/docserver/one_server.html"><strong aria-hidden="true">6.</strong> One web server instance</a></li><li class="chapter-item "><a href="/docserver/server_modes.html"><strong aria-hidden="true">7.</strong> Server modes</a></li><li class="chapter-item "><a href="/docserver/static_content.html"><strong aria-hidden="true">8.</strong> Static contents</a></li><li class="chapter-item "><a href="/docserver/url_path.html"><strong aria-hidden="true">9.</strong> url_path prefix</a></li><li class="chapter-item "><a href="/docserver/protect_access.html"><strong aria-hidden="true">10.</strong> Protect access</a></li><li class="chapter-item affix "><li class="part-title">Users and Policies</li><li class="chapter-item "><a href="/docserver/users.html"><strong aria-hidden="true">11.</strong> Users</a></li><li class="chapter-item "><a href="/docserver/users_sql.html"><strong aria-hidden="true">12.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/users_file_storage.html"><strong aria-hidden="true">13.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/roles.html"><strong aria-hidden="true">14.</strong> Roles</a></li><li class="chapter-item "><a href="/docserver/auths.html"><strong aria-hidden="true">15.</strong> Users auths</a></li><li class="chapter-item "><a href="/docserver/policies.html"><strong aria-hidden="true">16.</strong> Access policies</a></li><li class="chapter-item "><a href="/docserver/adminusers.html"><strong aria-hidden="true">17.</strong> Users Admin</a></li><li class="chapter-item affix "><li class="part-title">Sessions</li><li class="chapter-item "><a href="/docserver/sessions.html"><strong aria-hidden="true">18.</strong> Session data</a></li><li class="chapter-item "><a href="/docserver/pasetoken.html"><strong aria-hidden="true">19.</strong> Pasetoken</a></li><li class="chapter-item "><a href="/docserver/sessions_sql.html"><strong aria-hidden="true">20.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/sessions_file_storage.html"><strong aria-hidden="true">21.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/cookie.html"><strong aria-hidden="true">22.</strong> Cookie set</a></li><li class="chapter-item affix "><li class="part-title">Logs and Trace</li><li class="chapter-item "><a href="/docserver/trace.html"><strong aria-hidden="true">23.</strong> Traced</a></li><li class="chapter-item "><a href="/docserver/logs.html"><strong aria-hidden="true">24.</strong> Sessions logs</a></li><li class="chapter-item affix "><li class="part-title">Configuration</li><li class="chapter-item "><a href="/docserver/configuration.html"><strong aria-hidden="true">25.</strong> Configurable service</a></li><li class="chapter-item "><a href="/docserver/settings.html"><strong aria-hidden="true">26.</strong> Config settings</a></li><li class="spacer"></li></ol> |  | ||||||
|             </div> |  | ||||||
|             <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> |  | ||||||
|         </nav> |  | ||||||
| 
 |  | ||||||
|         <div id="page-wrapper" class="page-wrapper"> |  | ||||||
| 
 |  | ||||||
|             <div class="page"> |  | ||||||
|                                 <div id="menu-bar-hover-placeholder"></div> |  | ||||||
|                 <div id="menu-bar" class="menu-bar sticky bordered"> |  | ||||||
|                     <div class="left-buttons"> |  | ||||||
|                         <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> |  | ||||||
|                             <i class="fa fa-bars"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="sidebar-toggle" onclick="location.href='/'" class="icon-button" type="button" title="Home" aria-label="Home" aria-controls=""> |  | ||||||
|                             <i class="fa fa-home"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> |  | ||||||
|                             <i class="fa fa-paint-brush"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> |  | ||||||
|                         </ul> |  | ||||||
|                         <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> |  | ||||||
|                             <i class="fa fa-search"></i> |  | ||||||
|                         </button> |  | ||||||
|                     </div> |  | ||||||
| 
 |  | ||||||
|                     <h1 class="menu-title">Doc Server</h1> |  | ||||||
| 
 |  | ||||||
|                     <div class="right-buttons"> |  | ||||||
|                         <a href="/docserver/print.html" title="Print this book" aria-label="Print this book"> |  | ||||||
|                             <i id="print-button" class="fa fa-print"></i> |  | ||||||
|                         </a> |  | ||||||
|                         <a href="/logout" title="Sing out" aria-label="Sign out"> |  | ||||||
|                             <i id="logout-button" class="fa fa-sign-out"></i> |  | ||||||
|                         </a> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div id="search-wrapper" class="hidden"> |  | ||||||
|                     <form id="searchbar-outer" class="searchbar-outer"> |  | ||||||
|                         <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> |  | ||||||
|                     </form> |  | ||||||
|                     <div id="searchresults-outer" class="searchresults-outer hidden"> |  | ||||||
|                         <div id="searchresults-header" class="searchresults-header"></div> |  | ||||||
|                         <ul id="searchresults"> |  | ||||||
|                         </ul> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> |  | ||||||
|                 <script> |  | ||||||
|                     document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); |  | ||||||
|                     document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); |  | ||||||
|                     Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { |  | ||||||
|                         link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); |  | ||||||
|                     }); |  | ||||||
|                 </script> |  | ||||||
| 
 |  | ||||||
|                 <div id="content" class="content"> |  | ||||||
|                     <main> |  | ||||||
|                         <p><a href="/docserver/">Doc Server</a> is a <strong>Web Server</strong> in <a href="https://www.rust-lang.org">Rust</a> for <a href="/docserver/static_content.html">static content</a> |  | ||||||
| with <strong>Control access</strong>  via <a href="/docserver/auths.html">authorizations</a>, fully customizable with <a href="/docserver/settings.html">settings</a>.</p> |  | ||||||
| <p><svg style="display:none"><symbol id="symbl-check" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> <path stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path></symbol></svg></p> |  | ||||||
| <div class="box"><img src="images/docserver.svg" class="logo" /></div> |  | ||||||
| <h2 id="one-server"><a class="header" href="#one-server">One Server</a></h2> |  | ||||||
| <p>Most of documentation or <a href="static_content.html">static content</a> is generated to be served from a WebServer using <strong>absoulte</strong>, <strong>relative</strong> <a href="https://www.w3.org/TR/WD-html40-970917/htmlweb.html">URL</a> or a <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base">document base URL</a>, this is a big issue to  handle several at once  from one unique server under <a href="https://en.wikipedia.org/wiki/URL">url paths</a> if are not set properly. In many cases there is no need for a dedicated web server for each documentation or <a href="static_content.html">static content</a> that needs to be published or served. Some documentation generators are more or less configurables to use some <a href="https://www.w3.org/TR/WD-html40-970917/htmlweb.html">URL</a> <strong>relative path</strong>, this should include pages and assets (images, css, js, etc.).</p> |  | ||||||
| <h2 id="protect-access-content"><a class="header" href="#protect-access-content">Protect access content</a></h2> |  | ||||||
| <p>In many case some <a href="protect_access.html">protect access content</a> mode is mandatory, from private infos to restricted documentation or development docs, whether it is for internal  use or new versions not delivered yet.</p> |  | ||||||
| <p><a href="https://en.wikipedia.org/wiki/Basic_access_authentication">Basic authentication</a> or via one <a href="https://en.wikipedia.org/wiki/JSON_Web_Token">token</a> could be too simple and flat to tailor specific contexts, so a full real <a href="sessions.html">sessions</a> handling should implement  <a href="users.html">users</a> (identity entities), <a href="roles.html">roles</a> (groups),  <a href="policies.html">policies</a> (permissions) and <a href="pasetoken.html">secure tokens</a> (as data container).</p> |  | ||||||
| <h2 id="secure-sessions"><a class="header" href="#secure-sessions">Secure sessions</a></h2> |  | ||||||
| <p><a href="sessions.html">Sessions management</a> to content access with <u>secure storage</u> (some kind of persistence has to be provided among requests) and exchange with clients upon requests. Their data will allow <a href="https://en.wikipedia.org/wiki/Web_server">webserver</a> to allow or deny  an <a href="https://www.w3.org/TR/WD-html40-970917/htmlweb.html">URL</a> access request in a <a href="https://en.wikipedia.org/wiki/Middleware">middleware</a> stage.</p> |  | ||||||
| <h2 id="users"><a class="header" href="#users">Users</a></h2> |  | ||||||
| <p>At least a simple <a href="users.html">users management</a> creation, identification and admin to link <a href="sessions.html">sessions</a> to an identified entity. Signin access should use  secure passwords and <a href="https://en.wikipedia.org/wiki/Multi-factor_authentication">2FA</a> with optional mail service for notifications. Signup modes should be also provided for close or open contexts.</p> |  | ||||||
| <p>Some requests responses are created by a <a href="https://github.com/Keats/tera">template engine</a>, so can be customized to some use cases.</p> |  | ||||||
| <h2 id="logging"><a class="header" href="#logging">Logging</a></h2> |  | ||||||
| <p>Some kind of mechanism for <a href="logs.html">logs</a> storages and <a href="trace.html">trace access</a> to know what is happening and how is it used.</p> |  | ||||||
| <h2 id="configuration-settings"><a class="header" href="#configuration-settings">Configuration settings</a></h2> |  | ||||||
| <p><a href="configuration.html">Service configuration</a> with <a href="settings.html">settings</a> via <a href="https://en.wikipedia.org/wiki/TOML">TOML</a> file will help to customize server and services to context and needs.</p> |  | ||||||
| 
 |  | ||||||
|                     </main> |  | ||||||
| 
 |  | ||||||
|                     <nav class="nav-wrapper" aria-label="Page navigation"> |  | ||||||
|                         <!-- Mobile navigation buttons --> |  | ||||||
|                             <a rel="prev" href="introduction.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                                 <i class="fa fa-angle-left"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                             <a rel="next" href="features.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                                 <i class="fa fa-angle-right"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                         <div style="clear: both"></div> |  | ||||||
|                     </nav> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
| 
 |  | ||||||
|             <nav class="nav-wide-wrapper" aria-label="Page navigation"> |  | ||||||
|                     <a rel="prev" href="introduction.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                         <i class="fa fa-angle-left"></i> |  | ||||||
|                     </a> |  | ||||||
| 
 |  | ||||||
|                     <a rel="next" href="features.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                         <i class="fa fa-angle-right"></i> |  | ||||||
|                     </a> |  | ||||||
|             </nav> |  | ||||||
| 
 |  | ||||||
|         </div> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <script> |  | ||||||
|             window.playground_copyable = true; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/ace.js"></script> |  | ||||||
|         <script src="/docserver/editor.js"></script> |  | ||||||
|         <script src="/docserver/mode-rust.js"></script> |  | ||||||
|         <script src="/docserver/theme-dawn.js"></script> |  | ||||||
|         <script src="/docserver/theme-tomorrow_night.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/elasticlunr.min.js"></script> |  | ||||||
|         <script src="/docserver/mark.min.js"></script> |  | ||||||
|         <script src="/docserver/searcher.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/clipboard.min.js"></script> |  | ||||||
|         <script src="/docserver/highlight.js"></script> |  | ||||||
|         <script src="/docserver/book.js"></script> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom JS scripts --> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     </div> |  | ||||||
|     </body> |  | ||||||
| </html> |  | ||||||
| @ -1,253 +0,0 @@ | |||||||
| <!DOCTYPE HTML> |  | ||||||
| <html lang="en" class="sidebar-visible no-js light"> |  | ||||||
|     <head> |  | ||||||
|         <!-- Book generated using mdBook --> |  | ||||||
|         <meta charset="UTF-8"> |  | ||||||
|         <title>Introduction - Doc Server</title> |  | ||||||
|         <base href="/docserver/"> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <!-- Custom HTML head --> |  | ||||||
|          |  | ||||||
|         <meta name="description" content="Doc Server"> |  | ||||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> |  | ||||||
|         <meta name="theme-color" content="#ffffff" /> |  | ||||||
| 
 |  | ||||||
|         <link rel="icon" href="/docserver/favicon.svg"> |  | ||||||
|         <link rel="shortcut icon" href="/docserver/favicon.png"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/variables.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/general.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/chrome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/print.css" media="print"> |  | ||||||
| 
 |  | ||||||
|         <!-- Fonts --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/FontAwesome/css/font-awesome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/fonts/fonts.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Highlight.js Stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/highlight.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/tomorrow-night.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/ayu-highlight.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom theme stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/custom.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/mdbook-admonish.css"> |  | ||||||
| 
 |  | ||||||
|     </head> |  | ||||||
|     <body> |  | ||||||
|     <div id="body-container"> |  | ||||||
|         <!-- Provide site root to javascript --> |  | ||||||
|         <script> |  | ||||||
|             var path_to_root = "/docserver/"; |  | ||||||
|             var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light"; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Work around some values being stored in localStorage wrapped in quotes --> |  | ||||||
|         <script> |  | ||||||
|             try { |  | ||||||
|                 var theme = localStorage.getItem('mdbook-theme'); |  | ||||||
|                 var sidebar = localStorage.getItem('mdbook-sidebar'); |  | ||||||
| 
 |  | ||||||
|                 if (theme.startsWith('"') && theme.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (sidebar.startsWith('"') && sidebar.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); |  | ||||||
|                 } |  | ||||||
|             } catch (e) { } |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Set the theme before any content is loaded, prevents flash --> |  | ||||||
|         <script> |  | ||||||
|             var theme; |  | ||||||
|             try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } |  | ||||||
|             if (theme === null || theme === undefined) { theme = default_theme; } |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             html.classList.remove('no-js') |  | ||||||
|             html.classList.remove('light') |  | ||||||
|             html.classList.add(theme); |  | ||||||
|             html.classList.add('js'); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Hide / unhide sidebar before it is displayed --> |  | ||||||
|         <script> |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             var sidebar = null; |  | ||||||
|             if (document.body.clientWidth >= 1080) { |  | ||||||
|                 try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } |  | ||||||
|                 sidebar = sidebar || 'visible'; |  | ||||||
|             } else { |  | ||||||
|                 sidebar = 'hidden'; |  | ||||||
|             } |  | ||||||
|             html.classList.remove('sidebar-visible'); |  | ||||||
|             html.classList.add("sidebar-" + sidebar); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <nav id="sidebar" class="sidebar" aria-label="Table of contents"> |  | ||||||
|             <div class="sidebar-scrollbox"> |  | ||||||
|                 <ol class="chapter"><li class="chapter-item expanded "><a href="/docserver/introduction.html" class="active"><strong aria-hidden="true">1.</strong> Introduction</a></li><li class="chapter-item "><a href="/docserver/index.html"><strong aria-hidden="true">2.</strong> What is this ?</a></li><li class="chapter-item "><a href="/docserver/features.html"><strong aria-hidden="true">3.</strong> Features</a></li><li class="chapter-item "><a href="/docserver/howto.html"><strong aria-hidden="true">4.</strong> How to</a></li><li class="chapter-item "><a href="/docserver/quick-start.html"><strong aria-hidden="true">5.</strong> Quick Start</a></li><li class="spacer"></li><li class="chapter-item affix "><li class="part-title">Server and Content</li><li class="chapter-item "><a href="/docserver/one_server.html"><strong aria-hidden="true">6.</strong> One web server instance</a></li><li class="chapter-item "><a href="/docserver/server_modes.html"><strong aria-hidden="true">7.</strong> Server modes</a></li><li class="chapter-item "><a href="/docserver/static_content.html"><strong aria-hidden="true">8.</strong> Static contents</a></li><li class="chapter-item "><a href="/docserver/url_path.html"><strong aria-hidden="true">9.</strong> url_path prefix</a></li><li class="chapter-item "><a href="/docserver/protect_access.html"><strong aria-hidden="true">10.</strong> Protect access</a></li><li class="chapter-item affix "><li class="part-title">Users and Policies</li><li class="chapter-item "><a href="/docserver/users.html"><strong aria-hidden="true">11.</strong> Users</a></li><li class="chapter-item "><a href="/docserver/users_sql.html"><strong aria-hidden="true">12.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/users_file_storage.html"><strong aria-hidden="true">13.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/roles.html"><strong aria-hidden="true">14.</strong> Roles</a></li><li class="chapter-item "><a href="/docserver/auths.html"><strong aria-hidden="true">15.</strong> Users auths</a></li><li class="chapter-item "><a href="/docserver/policies.html"><strong aria-hidden="true">16.</strong> Access policies</a></li><li class="chapter-item "><a href="/docserver/adminusers.html"><strong aria-hidden="true">17.</strong> Users Admin</a></li><li class="chapter-item affix "><li class="part-title">Sessions</li><li class="chapter-item "><a href="/docserver/sessions.html"><strong aria-hidden="true">18.</strong> Session data</a></li><li class="chapter-item "><a href="/docserver/pasetoken.html"><strong aria-hidden="true">19.</strong> Pasetoken</a></li><li class="chapter-item "><a href="/docserver/sessions_sql.html"><strong aria-hidden="true">20.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/sessions_file_storage.html"><strong aria-hidden="true">21.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/cookie.html"><strong aria-hidden="true">22.</strong> Cookie set</a></li><li class="chapter-item affix "><li class="part-title">Logs and Trace</li><li class="chapter-item "><a href="/docserver/trace.html"><strong aria-hidden="true">23.</strong> Traced</a></li><li class="chapter-item "><a href="/docserver/logs.html"><strong aria-hidden="true">24.</strong> Sessions logs</a></li><li class="chapter-item affix "><li class="part-title">Configuration</li><li class="chapter-item "><a href="/docserver/configuration.html"><strong aria-hidden="true">25.</strong> Configurable service</a></li><li class="chapter-item "><a href="/docserver/settings.html"><strong aria-hidden="true">26.</strong> Config settings</a></li><li class="spacer"></li></ol> |  | ||||||
|             </div> |  | ||||||
|             <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> |  | ||||||
|         </nav> |  | ||||||
| 
 |  | ||||||
|         <div id="page-wrapper" class="page-wrapper"> |  | ||||||
| 
 |  | ||||||
|             <div class="page"> |  | ||||||
|                                 <div id="menu-bar-hover-placeholder"></div> |  | ||||||
|                 <div id="menu-bar" class="menu-bar sticky bordered"> |  | ||||||
|                     <div class="left-buttons"> |  | ||||||
|                         <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> |  | ||||||
|                             <i class="fa fa-bars"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="sidebar-toggle" onclick="location.href='/'" class="icon-button" type="button" title="Home" aria-label="Home" aria-controls=""> |  | ||||||
|                             <i class="fa fa-home"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> |  | ||||||
|                             <i class="fa fa-paint-brush"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> |  | ||||||
|                         </ul> |  | ||||||
|                         <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> |  | ||||||
|                             <i class="fa fa-search"></i> |  | ||||||
|                         </button> |  | ||||||
|                     </div> |  | ||||||
| 
 |  | ||||||
|                     <h1 class="menu-title">Doc Server</h1> |  | ||||||
| 
 |  | ||||||
|                     <div class="right-buttons"> |  | ||||||
|                         <a href="/docserver/print.html" title="Print this book" aria-label="Print this book"> |  | ||||||
|                             <i id="print-button" class="fa fa-print"></i> |  | ||||||
|                         </a> |  | ||||||
|                         <a href="/logout" title="Sing out" aria-label="Sign out"> |  | ||||||
|                             <i id="logout-button" class="fa fa-sign-out"></i> |  | ||||||
|                         </a> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div id="search-wrapper" class="hidden"> |  | ||||||
|                     <form id="searchbar-outer" class="searchbar-outer"> |  | ||||||
|                         <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> |  | ||||||
|                     </form> |  | ||||||
|                     <div id="searchresults-outer" class="searchresults-outer hidden"> |  | ||||||
|                         <div id="searchresults-header" class="searchresults-header"></div> |  | ||||||
|                         <ul id="searchresults"> |  | ||||||
|                         </ul> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> |  | ||||||
|                 <script> |  | ||||||
|                     document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); |  | ||||||
|                     document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); |  | ||||||
|                     Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { |  | ||||||
|                         link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); |  | ||||||
|                     }); |  | ||||||
|                 </script> |  | ||||||
| 
 |  | ||||||
|                 <div id="content" class="content"> |  | ||||||
|                     <main> |  | ||||||
|                         <p><a href="/docserver/">Doc Server</a> is a <strong>Web Server</strong> in <a href="https://www.rust-lang.org">Rust</a> for <a href="/docserver/static_content.html">static content</a> |  | ||||||
| with <strong>Control access</strong>  via <a href="/docserver/auths.html">authorizations</a>, fully customizable with <a href="/docserver/settings.html">settings</a>.</p> |  | ||||||
| <p><svg style="display:none"><symbol id="symbl-check" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> <path stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path></symbol></svg></p> |  | ||||||
| <div class="box"><img src="images/docserver.svg" class="logo" /></div> |  | ||||||
| <p><a href="README.html">DocServer</a> is created to:</p> |  | ||||||
| <ul> |  | ||||||
| <li> |  | ||||||
| <p>Serve several <a href="static_content.html">static contents</a> paths from <a href="one_server.html">one web server instance</a> at once. Server is based in <a href="https://www.rust-lang.org">Rust</a> <a href="https://github.com/tokio-rs/axum">Axum</a> crate under <a href="https://github.com/tokio-rs/tokio">Tokio</a>, with a lot of <a href="configuration.html">config settings</a> to customize in a config <a href="https://en.wikipedia.org/wiki/TOML">TOML</a> file: SSL, Paths, Menus, Keys, Contents, Roles, etc.</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>Use <a href="static_content.html">static contents</a> from <a href="https://rust-lang.github.io/mdBook/">mdbooks</a> with <a href="https://github.com/JesusPerez/mdBook">fixed absolute links via site-url</a> or <a href="https://doc.rust-lang.org/rust-by-example/meta/doc.html">code docs</a> from <a href="https://doc.rust-lang.org/cargo/commands/cargo-doc.html">Cargo doc</a>.</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><a href="protect_access.html">Protect access</a> to <a href="static_content.html">static contents</a> with <a href="auths.html">users authentication and authorizations</a> by <a href="url_path.html">url_path prefix</a>, <a href="roles.html">roles</a> or <a href="users.html">users</a> login names or emails.</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>Define <a href="policies.html">access policies</a> to <strong>enfoce</strong> for content access with <a href="https://github.com/casbin/casbin-rs">Casbin</a></p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>Handle <a href="users.html">user</a> defininition: Create/Invite, SignIn/SignOut, Settings, Roles, Administration. Several users modes can be set via <a href="settings.html">config settings</a>.</p> |  | ||||||
| <ul> |  | ||||||
| <li> |  | ||||||
| <p>For <a href="users.html">user</a> authentication use Argon2 for password and <a href="https://en.wikipedia.org/wiki/Time-based_one-time_password">TOPT</a> as <a href="https://en.wikipedia.org/wiki/Multi-factor_authentication">2FA</a> with optional mail service for notifications</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><a href="sessions.html">Sessions</a> are stored in async <a href="https://github.com/launchbadge/sqlx">sqlx</a> to <a href="sqlite.html">Sqlite</a> or <a href="file_storage.html">File</a> storages and keys handled via <a href="cookie.html">cookie set</a>, for larger use <a href="https://github.com/launchbadge/sqlx">sqlx</a> as <u>Database Agnostic provides other <a href="https://en.wikipedia.org/wiki/SQL">SQL</a> options</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><a href="sessions.html">Session data</a> is saved as a <a href="pasetoken.html">Pasetoken</a> with asymmetric encripted data without passwords or <a href="https://en.wikipedia.org/wiki/Time-based_one-time_password">TOPT</a> codes.</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>Some requests responses are created by a <a href="https://github.com/Keats/tera">template engine</a>, so can be customized to some use cases.</p> |  | ||||||
| </li> |  | ||||||
| </ul> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>Optionally request can be <a href="trace.html">traced</a> in <a href="logs.html">sessions logs</a></p> |  | ||||||
| </li> |  | ||||||
| </ul> |  | ||||||
| <div id="admonition-main-purpose" class="admonition note"> |  | ||||||
| <div class="admonition-title"> |  | ||||||
| <p>Main purpose</p> |  | ||||||
| <p><a class="admonition-anchor-link" href="#admonition-main-purpose"></a></p> |  | ||||||
| </div> |  | ||||||
| <div> |  | ||||||
| <p><strong>Control access</strong> to <a href="static_content.html">static contents</a> paths from <a href="one_server.html">one web server instance</a> </p> |  | ||||||
| <p>Tested with <a href="https://rust-lang.github.io/mdBook/">mdbooks</a> with <a href="https://github.com/JesusPerez/mdBook">fixed absolute links via site-url</a> or <a href="https://doc.rust-lang.org/rust-by-example/meta/doc.html">code docs</a></p> |  | ||||||
| </div> |  | ||||||
| </div> |  | ||||||
|                     </main> |  | ||||||
| 
 |  | ||||||
|                     <nav class="nav-wrapper" aria-label="Page navigation"> |  | ||||||
|                         <!-- Mobile navigation buttons --> |  | ||||||
| 
 |  | ||||||
|                             <a rel="next" href="index.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                                 <i class="fa fa-angle-right"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                         <div style="clear: both"></div> |  | ||||||
|                     </nav> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
| 
 |  | ||||||
|             <nav class="nav-wide-wrapper" aria-label="Page navigation"> |  | ||||||
| 
 |  | ||||||
|                     <a rel="next" href="index.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                         <i class="fa fa-angle-right"></i> |  | ||||||
|                     </a> |  | ||||||
|             </nav> |  | ||||||
| 
 |  | ||||||
|         </div> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <script> |  | ||||||
|             window.playground_copyable = true; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/ace.js"></script> |  | ||||||
|         <script src="/docserver/editor.js"></script> |  | ||||||
|         <script src="/docserver/mode-rust.js"></script> |  | ||||||
|         <script src="/docserver/theme-dawn.js"></script> |  | ||||||
|         <script src="/docserver/theme-tomorrow_night.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/elasticlunr.min.js"></script> |  | ||||||
|         <script src="/docserver/mark.min.js"></script> |  | ||||||
|         <script src="/docserver/searcher.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/clipboard.min.js"></script> |  | ||||||
|         <script src="/docserver/highlight.js"></script> |  | ||||||
|         <script src="/docserver/book.js"></script> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom JS scripts --> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     </div> |  | ||||||
|     </body> |  | ||||||
| </html> |  | ||||||
| @ -1,212 +0,0 @@ | |||||||
| <!DOCTYPE HTML> |  | ||||||
| <html lang="en" class="sidebar-visible no-js light"> |  | ||||||
|     <head> |  | ||||||
|         <!-- Book generated using mdBook --> |  | ||||||
|         <meta charset="UTF-8"> |  | ||||||
|         <title>Sessions logs - Doc Server</title> |  | ||||||
|         <base href="/docserver/"> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <!-- Custom HTML head --> |  | ||||||
|          |  | ||||||
|         <meta name="description" content="Doc Server"> |  | ||||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> |  | ||||||
|         <meta name="theme-color" content="#ffffff" /> |  | ||||||
| 
 |  | ||||||
|         <link rel="icon" href="/docserver/favicon.svg"> |  | ||||||
|         <link rel="shortcut icon" href="/docserver/favicon.png"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/variables.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/general.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/chrome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/print.css" media="print"> |  | ||||||
| 
 |  | ||||||
|         <!-- Fonts --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/FontAwesome/css/font-awesome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/fonts/fonts.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Highlight.js Stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/highlight.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/tomorrow-night.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/ayu-highlight.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom theme stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/custom.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/mdbook-admonish.css"> |  | ||||||
| 
 |  | ||||||
|     </head> |  | ||||||
|     <body> |  | ||||||
|     <div id="body-container"> |  | ||||||
|         <!-- Provide site root to javascript --> |  | ||||||
|         <script> |  | ||||||
|             var path_to_root = "/docserver/"; |  | ||||||
|             var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light"; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Work around some values being stored in localStorage wrapped in quotes --> |  | ||||||
|         <script> |  | ||||||
|             try { |  | ||||||
|                 var theme = localStorage.getItem('mdbook-theme'); |  | ||||||
|                 var sidebar = localStorage.getItem('mdbook-sidebar'); |  | ||||||
| 
 |  | ||||||
|                 if (theme.startsWith('"') && theme.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (sidebar.startsWith('"') && sidebar.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); |  | ||||||
|                 } |  | ||||||
|             } catch (e) { } |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Set the theme before any content is loaded, prevents flash --> |  | ||||||
|         <script> |  | ||||||
|             var theme; |  | ||||||
|             try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } |  | ||||||
|             if (theme === null || theme === undefined) { theme = default_theme; } |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             html.classList.remove('no-js') |  | ||||||
|             html.classList.remove('light') |  | ||||||
|             html.classList.add(theme); |  | ||||||
|             html.classList.add('js'); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Hide / unhide sidebar before it is displayed --> |  | ||||||
|         <script> |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             var sidebar = null; |  | ||||||
|             if (document.body.clientWidth >= 1080) { |  | ||||||
|                 try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } |  | ||||||
|                 sidebar = sidebar || 'visible'; |  | ||||||
|             } else { |  | ||||||
|                 sidebar = 'hidden'; |  | ||||||
|             } |  | ||||||
|             html.classList.remove('sidebar-visible'); |  | ||||||
|             html.classList.add("sidebar-" + sidebar); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <nav id="sidebar" class="sidebar" aria-label="Table of contents"> |  | ||||||
|             <div class="sidebar-scrollbox"> |  | ||||||
|                 <ol class="chapter"><li class="chapter-item "><a href="/docserver/introduction.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li class="chapter-item "><a href="/docserver/index.html"><strong aria-hidden="true">2.</strong> What is this ?</a></li><li class="chapter-item "><a href="/docserver/features.html"><strong aria-hidden="true">3.</strong> Features</a></li><li class="chapter-item "><a href="/docserver/howto.html"><strong aria-hidden="true">4.</strong> How to</a></li><li class="chapter-item "><a href="/docserver/quick-start.html"><strong aria-hidden="true">5.</strong> Quick Start</a></li><li class="spacer"></li><li class="chapter-item affix "><li class="part-title">Server and Content</li><li class="chapter-item "><a href="/docserver/one_server.html"><strong aria-hidden="true">6.</strong> One web server instance</a></li><li class="chapter-item "><a href="/docserver/server_modes.html"><strong aria-hidden="true">7.</strong> Server modes</a></li><li class="chapter-item "><a href="/docserver/static_content.html"><strong aria-hidden="true">8.</strong> Static contents</a></li><li class="chapter-item "><a href="/docserver/url_path.html"><strong aria-hidden="true">9.</strong> url_path prefix</a></li><li class="chapter-item "><a href="/docserver/protect_access.html"><strong aria-hidden="true">10.</strong> Protect access</a></li><li class="chapter-item affix "><li class="part-title">Users and Policies</li><li class="chapter-item "><a href="/docserver/users.html"><strong aria-hidden="true">11.</strong> Users</a></li><li class="chapter-item "><a href="/docserver/users_sql.html"><strong aria-hidden="true">12.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/users_file_storage.html"><strong aria-hidden="true">13.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/roles.html"><strong aria-hidden="true">14.</strong> Roles</a></li><li class="chapter-item "><a href="/docserver/auths.html"><strong aria-hidden="true">15.</strong> Users auths</a></li><li class="chapter-item "><a href="/docserver/policies.html"><strong aria-hidden="true">16.</strong> Access policies</a></li><li class="chapter-item "><a href="/docserver/adminusers.html"><strong aria-hidden="true">17.</strong> Users Admin</a></li><li class="chapter-item affix "><li class="part-title">Sessions</li><li class="chapter-item "><a href="/docserver/sessions.html"><strong aria-hidden="true">18.</strong> Session data</a></li><li class="chapter-item "><a href="/docserver/pasetoken.html"><strong aria-hidden="true">19.</strong> Pasetoken</a></li><li class="chapter-item "><a href="/docserver/sessions_sql.html"><strong aria-hidden="true">20.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/sessions_file_storage.html"><strong aria-hidden="true">21.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/cookie.html"><strong aria-hidden="true">22.</strong> Cookie set</a></li><li class="chapter-item affix "><li class="part-title">Logs and Trace</li><li class="chapter-item "><a href="/docserver/trace.html"><strong aria-hidden="true">23.</strong> Traced</a></li><li class="chapter-item expanded "><a href="/docserver/logs.html" class="active"><strong aria-hidden="true">24.</strong> Sessions logs</a></li><li class="chapter-item affix "><li class="part-title">Configuration</li><li class="chapter-item "><a href="/docserver/configuration.html"><strong aria-hidden="true">25.</strong> Configurable service</a></li><li class="chapter-item "><a href="/docserver/settings.html"><strong aria-hidden="true">26.</strong> Config settings</a></li><li class="spacer"></li></ol> |  | ||||||
|             </div> |  | ||||||
|             <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> |  | ||||||
|         </nav> |  | ||||||
| 
 |  | ||||||
|         <div id="page-wrapper" class="page-wrapper"> |  | ||||||
| 
 |  | ||||||
|             <div class="page"> |  | ||||||
|                                 <div id="menu-bar-hover-placeholder"></div> |  | ||||||
|                 <div id="menu-bar" class="menu-bar sticky bordered"> |  | ||||||
|                     <div class="left-buttons"> |  | ||||||
|                         <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> |  | ||||||
|                             <i class="fa fa-bars"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="sidebar-toggle" onclick="location.href='/'" class="icon-button" type="button" title="Home" aria-label="Home" aria-controls=""> |  | ||||||
|                             <i class="fa fa-home"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> |  | ||||||
|                             <i class="fa fa-paint-brush"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> |  | ||||||
|                         </ul> |  | ||||||
|                         <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> |  | ||||||
|                             <i class="fa fa-search"></i> |  | ||||||
|                         </button> |  | ||||||
|                     </div> |  | ||||||
| 
 |  | ||||||
|                     <h1 class="menu-title">Doc Server</h1> |  | ||||||
| 
 |  | ||||||
|                     <div class="right-buttons"> |  | ||||||
|                         <a href="/docserver/print.html" title="Print this book" aria-label="Print this book"> |  | ||||||
|                             <i id="print-button" class="fa fa-print"></i> |  | ||||||
|                         </a> |  | ||||||
|                         <a href="/logout" title="Sing out" aria-label="Sign out"> |  | ||||||
|                             <i id="logout-button" class="fa fa-sign-out"></i> |  | ||||||
|                         </a> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div id="search-wrapper" class="hidden"> |  | ||||||
|                     <form id="searchbar-outer" class="searchbar-outer"> |  | ||||||
|                         <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> |  | ||||||
|                     </form> |  | ||||||
|                     <div id="searchresults-outer" class="searchresults-outer hidden"> |  | ||||||
|                         <div id="searchresults-header" class="searchresults-header"></div> |  | ||||||
|                         <ul id="searchresults"> |  | ||||||
|                         </ul> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> |  | ||||||
|                 <script> |  | ||||||
|                     document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); |  | ||||||
|                     document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); |  | ||||||
|                     Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { |  | ||||||
|                         link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); |  | ||||||
|                     }); |  | ||||||
|                 </script> |  | ||||||
| 
 |  | ||||||
|                 <div id="content" class="content"> |  | ||||||
|                     <main> |  | ||||||
|                         <h1 id="sessions-logs"><a class="header" href="#sessions-logs">Sessions logs</a></h1> |  | ||||||
| 
 |  | ||||||
|                     </main> |  | ||||||
| 
 |  | ||||||
|                     <nav class="nav-wrapper" aria-label="Page navigation"> |  | ||||||
|                         <!-- Mobile navigation buttons --> |  | ||||||
|                             <a rel="prev" href="trace.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                                 <i class="fa fa-angle-left"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                             <a rel="next" href="configuration.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                                 <i class="fa fa-angle-right"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                         <div style="clear: both"></div> |  | ||||||
|                     </nav> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
| 
 |  | ||||||
|             <nav class="nav-wide-wrapper" aria-label="Page navigation"> |  | ||||||
|                     <a rel="prev" href="trace.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                         <i class="fa fa-angle-left"></i> |  | ||||||
|                     </a> |  | ||||||
| 
 |  | ||||||
|                     <a rel="next" href="configuration.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                         <i class="fa fa-angle-right"></i> |  | ||||||
|                     </a> |  | ||||||
|             </nav> |  | ||||||
| 
 |  | ||||||
|         </div> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <script> |  | ||||||
|             window.playground_copyable = true; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/ace.js"></script> |  | ||||||
|         <script src="/docserver/editor.js"></script> |  | ||||||
|         <script src="/docserver/mode-rust.js"></script> |  | ||||||
|         <script src="/docserver/theme-dawn.js"></script> |  | ||||||
|         <script src="/docserver/theme-tomorrow_night.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/elasticlunr.min.js"></script> |  | ||||||
|         <script src="/docserver/mark.min.js"></script> |  | ||||||
|         <script src="/docserver/searcher.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/clipboard.min.js"></script> |  | ||||||
|         <script src="/docserver/highlight.js"></script> |  | ||||||
|         <script src="/docserver/book.js"></script> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom JS scripts --> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     </div> |  | ||||||
|     </body> |  | ||||||
| </html> |  | ||||||
| @ -1,200 +0,0 @@ | |||||||
| <!DOCTYPE HTML> |  | ||||||
| <html lang="en" class="sidebar-visible no-js light"> |  | ||||||
|     <head> |  | ||||||
|         <!-- Book generated using mdBook --> |  | ||||||
|         <meta charset="UTF-8"> |  | ||||||
|         <title>Page not found - Doc Server</title> |  | ||||||
|         <base href="/docserver/"> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <!-- Custom HTML head --> |  | ||||||
|          |  | ||||||
|         <meta name="description" content="Doc Server"> |  | ||||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> |  | ||||||
|         <meta name="theme-color" content="#ffffff" /> |  | ||||||
| 
 |  | ||||||
|         <link rel="icon" href="favicon.svg"> |  | ||||||
|         <link rel="shortcut icon" href="favicon.png"> |  | ||||||
|         <link rel="stylesheet" href="css/variables.css"> |  | ||||||
|         <link rel="stylesheet" href="css/general.css"> |  | ||||||
|         <link rel="stylesheet" href="css/chrome.css"> |  | ||||||
|         <link rel="stylesheet" href="css/print.css" media="print"> |  | ||||||
| 
 |  | ||||||
|         <!-- Fonts --> |  | ||||||
|         <link rel="stylesheet" href="FontAwesome/css/font-awesome.css"> |  | ||||||
|         <link rel="stylesheet" href="fonts/fonts.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Highlight.js Stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="highlight.css"> |  | ||||||
|         <link rel="stylesheet" href="tomorrow-night.css"> |  | ||||||
|         <link rel="stylesheet" href="ayu-highlight.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom theme stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="assets/css/custom.css"> |  | ||||||
|         <link rel="stylesheet" href="assets/css/mdbook-admonish.css"> |  | ||||||
| 
 |  | ||||||
|     </head> |  | ||||||
|     <body> |  | ||||||
|     <div id="body-container"> |  | ||||||
|         <!-- Provide site root to javascript --> |  | ||||||
|         <script> |  | ||||||
|             var path_to_root = ""; |  | ||||||
|             var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light"; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Work around some values being stored in localStorage wrapped in quotes --> |  | ||||||
|         <script> |  | ||||||
|             try { |  | ||||||
|                 var theme = localStorage.getItem('mdbook-theme'); |  | ||||||
|                 var sidebar = localStorage.getItem('mdbook-sidebar'); |  | ||||||
| 
 |  | ||||||
|                 if (theme.startsWith('"') && theme.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (sidebar.startsWith('"') && sidebar.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); |  | ||||||
|                 } |  | ||||||
|             } catch (e) { } |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Set the theme before any content is loaded, prevents flash --> |  | ||||||
|         <script> |  | ||||||
|             var theme; |  | ||||||
|             try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } |  | ||||||
|             if (theme === null || theme === undefined) { theme = default_theme; } |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             html.classList.remove('no-js') |  | ||||||
|             html.classList.remove('light') |  | ||||||
|             html.classList.add(theme); |  | ||||||
|             html.classList.add('js'); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Hide / unhide sidebar before it is displayed --> |  | ||||||
|         <script> |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             var sidebar = null; |  | ||||||
|             if (document.body.clientWidth >= 1080) { |  | ||||||
|                 try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } |  | ||||||
|                 sidebar = sidebar || 'visible'; |  | ||||||
|             } else { |  | ||||||
|                 sidebar = 'hidden'; |  | ||||||
|             } |  | ||||||
|             html.classList.remove('sidebar-visible'); |  | ||||||
|             html.classList.add("sidebar-" + sidebar); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <nav id="sidebar" class="sidebar" aria-label="Table of contents"> |  | ||||||
|             <div class="sidebar-scrollbox"> |  | ||||||
|                 <ol class="chapter"><li class="chapter-item "><a href="/docserver/introduction.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li class="chapter-item "><a href="/docserver/index.html"><strong aria-hidden="true">2.</strong> What is this ?</a></li><li class="chapter-item "><a href="/docserver/features.html"><strong aria-hidden="true">3.</strong> Features</a></li><li class="chapter-item "><a href="/docserver/howto.html"><strong aria-hidden="true">4.</strong> How to</a></li><li class="chapter-item "><a href="/docserver/quick-start.html"><strong aria-hidden="true">5.</strong> Quick Start</a></li><li class="spacer"></li><li class="chapter-item affix "><li class="part-title">Server and Content</li><li class="chapter-item "><a href="/docserver/one_server.html"><strong aria-hidden="true">6.</strong> One web server instance</a></li><li class="chapter-item "><a href="/docserver/server_modes.html"><strong aria-hidden="true">7.</strong> Server modes</a></li><li class="chapter-item "><a href="/docserver/static_content.html"><strong aria-hidden="true">8.</strong> Static contents</a></li><li class="chapter-item "><a href="/docserver/url_path.html"><strong aria-hidden="true">9.</strong> url_path prefix</a></li><li class="chapter-item "><a href="/docserver/protect_access.html"><strong aria-hidden="true">10.</strong> Protect access</a></li><li class="chapter-item affix "><li class="part-title">Users and Policies</li><li class="chapter-item "><a href="/docserver/users.html"><strong aria-hidden="true">11.</strong> Users</a></li><li class="chapter-item "><a href="/docserver/users_sql.html"><strong aria-hidden="true">12.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/users_file_storage.html"><strong aria-hidden="true">13.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/roles.html"><strong aria-hidden="true">14.</strong> Roles</a></li><li class="chapter-item "><a href="/docserver/auths.html"><strong aria-hidden="true">15.</strong> Users auths</a></li><li class="chapter-item "><a href="/docserver/policies.html"><strong aria-hidden="true">16.</strong> Access policies</a></li><li class="chapter-item "><a href="/docserver/adminusers.html"><strong aria-hidden="true">17.</strong> Users Admin</a></li><li class="chapter-item affix "><li class="part-title">Sessions</li><li class="chapter-item "><a href="/docserver/sessions.html"><strong aria-hidden="true">18.</strong> Session data</a></li><li class="chapter-item "><a href="/docserver/pasetoken.html"><strong aria-hidden="true">19.</strong> Pasetoken</a></li><li class="chapter-item "><a href="/docserver/sessions_sql.html"><strong aria-hidden="true">20.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/sessions_file_storage.html"><strong aria-hidden="true">21.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/cookie.html"><strong aria-hidden="true">22.</strong> Cookie set</a></li><li class="chapter-item affix "><li class="part-title">Logs and Trace</li><li class="chapter-item "><a href="/docserver/trace.html"><strong aria-hidden="true">23.</strong> Traced</a></li><li class="chapter-item "><a href="/docserver/logs.html"><strong aria-hidden="true">24.</strong> Sessions logs</a></li><li class="chapter-item affix "><li class="part-title">Configuration</li><li class="chapter-item "><a href="/docserver/configuration.html"><strong aria-hidden="true">25.</strong> Configurable service</a></li><li class="chapter-item "><a href="/docserver/settings.html"><strong aria-hidden="true">26.</strong> Config settings</a></li><li class="spacer"></li></ol> |  | ||||||
|             </div> |  | ||||||
|             <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> |  | ||||||
|         </nav> |  | ||||||
| 
 |  | ||||||
|         <div id="page-wrapper" class="page-wrapper"> |  | ||||||
| 
 |  | ||||||
|             <div class="page"> |  | ||||||
|                                 <div id="menu-bar-hover-placeholder"></div> |  | ||||||
|                 <div id="menu-bar" class="menu-bar sticky bordered"> |  | ||||||
|                     <div class="left-buttons"> |  | ||||||
|                         <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> |  | ||||||
|                             <i class="fa fa-bars"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="sidebar-toggle" onclick="location.href='/'" class="icon-button" type="button" title="Home" aria-label="Home" aria-controls=""> |  | ||||||
|                             <i class="fa fa-home"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> |  | ||||||
|                             <i class="fa fa-paint-brush"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> |  | ||||||
|                         </ul> |  | ||||||
|                         <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> |  | ||||||
|                             <i class="fa fa-search"></i> |  | ||||||
|                         </button> |  | ||||||
|                     </div> |  | ||||||
| 
 |  | ||||||
|                     <h1 class="menu-title">Doc Server</h1> |  | ||||||
| 
 |  | ||||||
|                     <div class="right-buttons"> |  | ||||||
|                         <a href="print.html" title="Print this book" aria-label="Print this book"> |  | ||||||
|                             <i id="print-button" class="fa fa-print"></i> |  | ||||||
|                         </a> |  | ||||||
|                         <a href="/logout" title="Sing out" aria-label="Sign out"> |  | ||||||
|                             <i id="logout-button" class="fa fa-sign-out"></i> |  | ||||||
|                         </a> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div id="search-wrapper" class="hidden"> |  | ||||||
|                     <form id="searchbar-outer" class="searchbar-outer"> |  | ||||||
|                         <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> |  | ||||||
|                     </form> |  | ||||||
|                     <div id="searchresults-outer" class="searchresults-outer hidden"> |  | ||||||
|                         <div id="searchresults-header" class="searchresults-header"></div> |  | ||||||
|                         <ul id="searchresults"> |  | ||||||
|                         </ul> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> |  | ||||||
|                 <script> |  | ||||||
|                     document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); |  | ||||||
|                     document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); |  | ||||||
|                     Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { |  | ||||||
|                         link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); |  | ||||||
|                     }); |  | ||||||
|                 </script> |  | ||||||
| 
 |  | ||||||
|                 <div id="content" class="content"> |  | ||||||
|                     <main> |  | ||||||
|                         <p>NOT Found</p> |  | ||||||
| 
 |  | ||||||
|                     </main> |  | ||||||
| 
 |  | ||||||
|                     <nav class="nav-wrapper" aria-label="Page navigation"> |  | ||||||
|                         <!-- Mobile navigation buttons --> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|                         <div style="clear: both"></div> |  | ||||||
|                     </nav> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
| 
 |  | ||||||
|             <nav class="nav-wide-wrapper" aria-label="Page navigation"> |  | ||||||
| 
 |  | ||||||
|             </nav> |  | ||||||
| 
 |  | ||||||
|         </div> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <script> |  | ||||||
|             window.playground_copyable = true; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <script src="ace.js"></script> |  | ||||||
|         <script src="editor.js"></script> |  | ||||||
|         <script src="mode-rust.js"></script> |  | ||||||
|         <script src="theme-dawn.js"></script> |  | ||||||
|         <script src="theme-tomorrow_night.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="elasticlunr.min.js"></script> |  | ||||||
|         <script src="mark.min.js"></script> |  | ||||||
|         <script src="searcher.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="clipboard.min.js"></script> |  | ||||||
|         <script src="highlight.js"></script> |  | ||||||
|         <script src="book.js"></script> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom JS scripts --> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     </div> |  | ||||||
|     </body> |  | ||||||
| </html> |  | ||||||
| @ -1,212 +0,0 @@ | |||||||
| <!DOCTYPE HTML> |  | ||||||
| <html lang="en" class="sidebar-visible no-js light"> |  | ||||||
|     <head> |  | ||||||
|         <!-- Book generated using mdBook --> |  | ||||||
|         <meta charset="UTF-8"> |  | ||||||
|         <title>One web server instance - Doc Server</title> |  | ||||||
|         <base href="/docserver/"> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <!-- Custom HTML head --> |  | ||||||
|          |  | ||||||
|         <meta name="description" content="Doc Server"> |  | ||||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> |  | ||||||
|         <meta name="theme-color" content="#ffffff" /> |  | ||||||
| 
 |  | ||||||
|         <link rel="icon" href="/docserver/favicon.svg"> |  | ||||||
|         <link rel="shortcut icon" href="/docserver/favicon.png"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/variables.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/general.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/chrome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/print.css" media="print"> |  | ||||||
| 
 |  | ||||||
|         <!-- Fonts --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/FontAwesome/css/font-awesome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/fonts/fonts.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Highlight.js Stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/highlight.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/tomorrow-night.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/ayu-highlight.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom theme stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/custom.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/mdbook-admonish.css"> |  | ||||||
| 
 |  | ||||||
|     </head> |  | ||||||
|     <body> |  | ||||||
|     <div id="body-container"> |  | ||||||
|         <!-- Provide site root to javascript --> |  | ||||||
|         <script> |  | ||||||
|             var path_to_root = "/docserver/"; |  | ||||||
|             var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light"; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Work around some values being stored in localStorage wrapped in quotes --> |  | ||||||
|         <script> |  | ||||||
|             try { |  | ||||||
|                 var theme = localStorage.getItem('mdbook-theme'); |  | ||||||
|                 var sidebar = localStorage.getItem('mdbook-sidebar'); |  | ||||||
| 
 |  | ||||||
|                 if (theme.startsWith('"') && theme.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (sidebar.startsWith('"') && sidebar.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); |  | ||||||
|                 } |  | ||||||
|             } catch (e) { } |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Set the theme before any content is loaded, prevents flash --> |  | ||||||
|         <script> |  | ||||||
|             var theme; |  | ||||||
|             try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } |  | ||||||
|             if (theme === null || theme === undefined) { theme = default_theme; } |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             html.classList.remove('no-js') |  | ||||||
|             html.classList.remove('light') |  | ||||||
|             html.classList.add(theme); |  | ||||||
|             html.classList.add('js'); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Hide / unhide sidebar before it is displayed --> |  | ||||||
|         <script> |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             var sidebar = null; |  | ||||||
|             if (document.body.clientWidth >= 1080) { |  | ||||||
|                 try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } |  | ||||||
|                 sidebar = sidebar || 'visible'; |  | ||||||
|             } else { |  | ||||||
|                 sidebar = 'hidden'; |  | ||||||
|             } |  | ||||||
|             html.classList.remove('sidebar-visible'); |  | ||||||
|             html.classList.add("sidebar-" + sidebar); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <nav id="sidebar" class="sidebar" aria-label="Table of contents"> |  | ||||||
|             <div class="sidebar-scrollbox"> |  | ||||||
|                 <ol class="chapter"><li class="chapter-item "><a href="/docserver/introduction.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li class="chapter-item "><a href="/docserver/index.html"><strong aria-hidden="true">2.</strong> What is this ?</a></li><li class="chapter-item "><a href="/docserver/features.html"><strong aria-hidden="true">3.</strong> Features</a></li><li class="chapter-item "><a href="/docserver/howto.html"><strong aria-hidden="true">4.</strong> How to</a></li><li class="chapter-item "><a href="/docserver/quick-start.html"><strong aria-hidden="true">5.</strong> Quick Start</a></li><li class="spacer"></li><li class="chapter-item affix "><li class="part-title">Server and Content</li><li class="chapter-item expanded "><a href="/docserver/one_server.html" class="active"><strong aria-hidden="true">6.</strong> One web server instance</a></li><li class="chapter-item "><a href="/docserver/server_modes.html"><strong aria-hidden="true">7.</strong> Server modes</a></li><li class="chapter-item "><a href="/docserver/static_content.html"><strong aria-hidden="true">8.</strong> Static contents</a></li><li class="chapter-item "><a href="/docserver/url_path.html"><strong aria-hidden="true">9.</strong> url_path prefix</a></li><li class="chapter-item "><a href="/docserver/protect_access.html"><strong aria-hidden="true">10.</strong> Protect access</a></li><li class="chapter-item affix "><li class="part-title">Users and Policies</li><li class="chapter-item "><a href="/docserver/users.html"><strong aria-hidden="true">11.</strong> Users</a></li><li class="chapter-item "><a href="/docserver/users_sql.html"><strong aria-hidden="true">12.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/users_file_storage.html"><strong aria-hidden="true">13.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/roles.html"><strong aria-hidden="true">14.</strong> Roles</a></li><li class="chapter-item "><a href="/docserver/auths.html"><strong aria-hidden="true">15.</strong> Users auths</a></li><li class="chapter-item "><a href="/docserver/policies.html"><strong aria-hidden="true">16.</strong> Access policies</a></li><li class="chapter-item "><a href="/docserver/adminusers.html"><strong aria-hidden="true">17.</strong> Users Admin</a></li><li class="chapter-item affix "><li class="part-title">Sessions</li><li class="chapter-item "><a href="/docserver/sessions.html"><strong aria-hidden="true">18.</strong> Session data</a></li><li class="chapter-item "><a href="/docserver/pasetoken.html"><strong aria-hidden="true">19.</strong> Pasetoken</a></li><li class="chapter-item "><a href="/docserver/sessions_sql.html"><strong aria-hidden="true">20.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/sessions_file_storage.html"><strong aria-hidden="true">21.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/cookie.html"><strong aria-hidden="true">22.</strong> Cookie set</a></li><li class="chapter-item affix "><li class="part-title">Logs and Trace</li><li class="chapter-item "><a href="/docserver/trace.html"><strong aria-hidden="true">23.</strong> Traced</a></li><li class="chapter-item "><a href="/docserver/logs.html"><strong aria-hidden="true">24.</strong> Sessions logs</a></li><li class="chapter-item affix "><li class="part-title">Configuration</li><li class="chapter-item "><a href="/docserver/configuration.html"><strong aria-hidden="true">25.</strong> Configurable service</a></li><li class="chapter-item "><a href="/docserver/settings.html"><strong aria-hidden="true">26.</strong> Config settings</a></li><li class="spacer"></li></ol> |  | ||||||
|             </div> |  | ||||||
|             <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> |  | ||||||
|         </nav> |  | ||||||
| 
 |  | ||||||
|         <div id="page-wrapper" class="page-wrapper"> |  | ||||||
| 
 |  | ||||||
|             <div class="page"> |  | ||||||
|                                 <div id="menu-bar-hover-placeholder"></div> |  | ||||||
|                 <div id="menu-bar" class="menu-bar sticky bordered"> |  | ||||||
|                     <div class="left-buttons"> |  | ||||||
|                         <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> |  | ||||||
|                             <i class="fa fa-bars"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="sidebar-toggle" onclick="location.href='/'" class="icon-button" type="button" title="Home" aria-label="Home" aria-controls=""> |  | ||||||
|                             <i class="fa fa-home"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> |  | ||||||
|                             <i class="fa fa-paint-brush"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> |  | ||||||
|                         </ul> |  | ||||||
|                         <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> |  | ||||||
|                             <i class="fa fa-search"></i> |  | ||||||
|                         </button> |  | ||||||
|                     </div> |  | ||||||
| 
 |  | ||||||
|                     <h1 class="menu-title">Doc Server</h1> |  | ||||||
| 
 |  | ||||||
|                     <div class="right-buttons"> |  | ||||||
|                         <a href="/docserver/print.html" title="Print this book" aria-label="Print this book"> |  | ||||||
|                             <i id="print-button" class="fa fa-print"></i> |  | ||||||
|                         </a> |  | ||||||
|                         <a href="/logout" title="Sing out" aria-label="Sign out"> |  | ||||||
|                             <i id="logout-button" class="fa fa-sign-out"></i> |  | ||||||
|                         </a> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div id="search-wrapper" class="hidden"> |  | ||||||
|                     <form id="searchbar-outer" class="searchbar-outer"> |  | ||||||
|                         <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> |  | ||||||
|                     </form> |  | ||||||
|                     <div id="searchresults-outer" class="searchresults-outer hidden"> |  | ||||||
|                         <div id="searchresults-header" class="searchresults-header"></div> |  | ||||||
|                         <ul id="searchresults"> |  | ||||||
|                         </ul> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> |  | ||||||
|                 <script> |  | ||||||
|                     document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); |  | ||||||
|                     document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); |  | ||||||
|                     Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { |  | ||||||
|                         link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); |  | ||||||
|                     }); |  | ||||||
|                 </script> |  | ||||||
| 
 |  | ||||||
|                 <div id="content" class="content"> |  | ||||||
|                     <main> |  | ||||||
|                         <h1 id="one-web-server-instance"><a class="header" href="#one-web-server-instance">One web server instance</a></h1> |  | ||||||
| 
 |  | ||||||
|                     </main> |  | ||||||
| 
 |  | ||||||
|                     <nav class="nav-wrapper" aria-label="Page navigation"> |  | ||||||
|                         <!-- Mobile navigation buttons --> |  | ||||||
|                             <a rel="prev" href="quick-start.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                                 <i class="fa fa-angle-left"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                             <a rel="next" href="server_modes.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                                 <i class="fa fa-angle-right"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                         <div style="clear: both"></div> |  | ||||||
|                     </nav> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
| 
 |  | ||||||
|             <nav class="nav-wide-wrapper" aria-label="Page navigation"> |  | ||||||
|                     <a rel="prev" href="quick-start.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                         <i class="fa fa-angle-left"></i> |  | ||||||
|                     </a> |  | ||||||
| 
 |  | ||||||
|                     <a rel="next" href="server_modes.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                         <i class="fa fa-angle-right"></i> |  | ||||||
|                     </a> |  | ||||||
|             </nav> |  | ||||||
| 
 |  | ||||||
|         </div> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <script> |  | ||||||
|             window.playground_copyable = true; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/ace.js"></script> |  | ||||||
|         <script src="/docserver/editor.js"></script> |  | ||||||
|         <script src="/docserver/mode-rust.js"></script> |  | ||||||
|         <script src="/docserver/theme-dawn.js"></script> |  | ||||||
|         <script src="/docserver/theme-tomorrow_night.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/elasticlunr.min.js"></script> |  | ||||||
|         <script src="/docserver/mark.min.js"></script> |  | ||||||
|         <script src="/docserver/searcher.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/clipboard.min.js"></script> |  | ||||||
|         <script src="/docserver/highlight.js"></script> |  | ||||||
|         <script src="/docserver/book.js"></script> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom JS scripts --> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     </div> |  | ||||||
|     </body> |  | ||||||
| </html> |  | ||||||
| @ -1,255 +0,0 @@ | |||||||
| <!DOCTYPE HTML> |  | ||||||
| <html lang="en" class="sidebar-visible no-js light"> |  | ||||||
|     <head> |  | ||||||
|         <!-- Book generated using mdBook --> |  | ||||||
|         <meta charset="UTF-8"> |  | ||||||
|         <title>Pasetoken - Doc Server</title> |  | ||||||
|         <base href="/docserver/"> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <!-- Custom HTML head --> |  | ||||||
|          |  | ||||||
|         <meta name="description" content="Doc Server"> |  | ||||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> |  | ||||||
|         <meta name="theme-color" content="#ffffff" /> |  | ||||||
| 
 |  | ||||||
|         <link rel="icon" href="/docserver/favicon.svg"> |  | ||||||
|         <link rel="shortcut icon" href="/docserver/favicon.png"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/variables.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/general.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/chrome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/print.css" media="print"> |  | ||||||
| 
 |  | ||||||
|         <!-- Fonts --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/FontAwesome/css/font-awesome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/fonts/fonts.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Highlight.js Stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/highlight.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/tomorrow-night.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/ayu-highlight.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom theme stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/custom.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/mdbook-admonish.css"> |  | ||||||
| 
 |  | ||||||
|     </head> |  | ||||||
|     <body> |  | ||||||
|     <div id="body-container"> |  | ||||||
|         <!-- Provide site root to javascript --> |  | ||||||
|         <script> |  | ||||||
|             var path_to_root = "/docserver/"; |  | ||||||
|             var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light"; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Work around some values being stored in localStorage wrapped in quotes --> |  | ||||||
|         <script> |  | ||||||
|             try { |  | ||||||
|                 var theme = localStorage.getItem('mdbook-theme'); |  | ||||||
|                 var sidebar = localStorage.getItem('mdbook-sidebar'); |  | ||||||
| 
 |  | ||||||
|                 if (theme.startsWith('"') && theme.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (sidebar.startsWith('"') && sidebar.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); |  | ||||||
|                 } |  | ||||||
|             } catch (e) { } |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Set the theme before any content is loaded, prevents flash --> |  | ||||||
|         <script> |  | ||||||
|             var theme; |  | ||||||
|             try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } |  | ||||||
|             if (theme === null || theme === undefined) { theme = default_theme; } |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             html.classList.remove('no-js') |  | ||||||
|             html.classList.remove('light') |  | ||||||
|             html.classList.add(theme); |  | ||||||
|             html.classList.add('js'); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Hide / unhide sidebar before it is displayed --> |  | ||||||
|         <script> |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             var sidebar = null; |  | ||||||
|             if (document.body.clientWidth >= 1080) { |  | ||||||
|                 try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } |  | ||||||
|                 sidebar = sidebar || 'visible'; |  | ||||||
|             } else { |  | ||||||
|                 sidebar = 'hidden'; |  | ||||||
|             } |  | ||||||
|             html.classList.remove('sidebar-visible'); |  | ||||||
|             html.classList.add("sidebar-" + sidebar); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <nav id="sidebar" class="sidebar" aria-label="Table of contents"> |  | ||||||
|             <div class="sidebar-scrollbox"> |  | ||||||
|                 <ol class="chapter"><li class="chapter-item "><a href="/docserver/introduction.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li class="chapter-item "><a href="/docserver/index.html"><strong aria-hidden="true">2.</strong> What is this ?</a></li><li class="chapter-item "><a href="/docserver/features.html"><strong aria-hidden="true">3.</strong> Features</a></li><li class="chapter-item "><a href="/docserver/howto.html"><strong aria-hidden="true">4.</strong> How to</a></li><li class="chapter-item "><a href="/docserver/quick-start.html"><strong aria-hidden="true">5.</strong> Quick Start</a></li><li class="spacer"></li><li class="chapter-item affix "><li class="part-title">Server and Content</li><li class="chapter-item "><a href="/docserver/one_server.html"><strong aria-hidden="true">6.</strong> One web server instance</a></li><li class="chapter-item "><a href="/docserver/server_modes.html"><strong aria-hidden="true">7.</strong> Server modes</a></li><li class="chapter-item "><a href="/docserver/static_content.html"><strong aria-hidden="true">8.</strong> Static contents</a></li><li class="chapter-item "><a href="/docserver/url_path.html"><strong aria-hidden="true">9.</strong> url_path prefix</a></li><li class="chapter-item "><a href="/docserver/protect_access.html"><strong aria-hidden="true">10.</strong> Protect access</a></li><li class="chapter-item affix "><li class="part-title">Users and Policies</li><li class="chapter-item "><a href="/docserver/users.html"><strong aria-hidden="true">11.</strong> Users</a></li><li class="chapter-item "><a href="/docserver/users_sql.html"><strong aria-hidden="true">12.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/users_file_storage.html"><strong aria-hidden="true">13.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/roles.html"><strong aria-hidden="true">14.</strong> Roles</a></li><li class="chapter-item "><a href="/docserver/auths.html"><strong aria-hidden="true">15.</strong> Users auths</a></li><li class="chapter-item "><a href="/docserver/policies.html"><strong aria-hidden="true">16.</strong> Access policies</a></li><li class="chapter-item "><a href="/docserver/adminusers.html"><strong aria-hidden="true">17.</strong> Users Admin</a></li><li class="chapter-item affix "><li class="part-title">Sessions</li><li class="chapter-item "><a href="/docserver/sessions.html"><strong aria-hidden="true">18.</strong> Session data</a></li><li class="chapter-item expanded "><a href="/docserver/pasetoken.html" class="active"><strong aria-hidden="true">19.</strong> Pasetoken</a></li><li class="chapter-item "><a href="/docserver/sessions_sql.html"><strong aria-hidden="true">20.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/sessions_file_storage.html"><strong aria-hidden="true">21.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/cookie.html"><strong aria-hidden="true">22.</strong> Cookie set</a></li><li class="chapter-item affix "><li class="part-title">Logs and Trace</li><li class="chapter-item "><a href="/docserver/trace.html"><strong aria-hidden="true">23.</strong> Traced</a></li><li class="chapter-item "><a href="/docserver/logs.html"><strong aria-hidden="true">24.</strong> Sessions logs</a></li><li class="chapter-item affix "><li class="part-title">Configuration</li><li class="chapter-item "><a href="/docserver/configuration.html"><strong aria-hidden="true">25.</strong> Configurable service</a></li><li class="chapter-item "><a href="/docserver/settings.html"><strong aria-hidden="true">26.</strong> Config settings</a></li><li class="spacer"></li></ol> |  | ||||||
|             </div> |  | ||||||
|             <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> |  | ||||||
|         </nav> |  | ||||||
| 
 |  | ||||||
|         <div id="page-wrapper" class="page-wrapper"> |  | ||||||
| 
 |  | ||||||
|             <div class="page"> |  | ||||||
|                                 <div id="menu-bar-hover-placeholder"></div> |  | ||||||
|                 <div id="menu-bar" class="menu-bar sticky bordered"> |  | ||||||
|                     <div class="left-buttons"> |  | ||||||
|                         <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> |  | ||||||
|                             <i class="fa fa-bars"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="sidebar-toggle" onclick="location.href='/'" class="icon-button" type="button" title="Home" aria-label="Home" aria-controls=""> |  | ||||||
|                             <i class="fa fa-home"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> |  | ||||||
|                             <i class="fa fa-paint-brush"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> |  | ||||||
|                         </ul> |  | ||||||
|                         <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> |  | ||||||
|                             <i class="fa fa-search"></i> |  | ||||||
|                         </button> |  | ||||||
|                     </div> |  | ||||||
| 
 |  | ||||||
|                     <h1 class="menu-title">Doc Server</h1> |  | ||||||
| 
 |  | ||||||
|                     <div class="right-buttons"> |  | ||||||
|                         <a href="/docserver/print.html" title="Print this book" aria-label="Print this book"> |  | ||||||
|                             <i id="print-button" class="fa fa-print"></i> |  | ||||||
|                         </a> |  | ||||||
|                         <a href="/logout" title="Sing out" aria-label="Sign out"> |  | ||||||
|                             <i id="logout-button" class="fa fa-sign-out"></i> |  | ||||||
|                         </a> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div id="search-wrapper" class="hidden"> |  | ||||||
|                     <form id="searchbar-outer" class="searchbar-outer"> |  | ||||||
|                         <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> |  | ||||||
|                     </form> |  | ||||||
|                     <div id="searchresults-outer" class="searchresults-outer hidden"> |  | ||||||
|                         <div id="searchresults-header" class="searchresults-header"></div> |  | ||||||
|                         <ul id="searchresults"> |  | ||||||
|                         </ul> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> |  | ||||||
|                 <script> |  | ||||||
|                     document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); |  | ||||||
|                     document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); |  | ||||||
|                     Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { |  | ||||||
|                         link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); |  | ||||||
|                     }); |  | ||||||
|                 </script> |  | ||||||
| 
 |  | ||||||
|                 <div id="content" class="content"> |  | ||||||
|                     <main> |  | ||||||
|                         <h1 id="pasetoken"><a class="header" href="#pasetoken">Pasetoken</a></h1> |  | ||||||
| <p><a href="/docserver/">Doc Server</a> use <a href="https://github.com/paseto-standard/paseto-spec">PASETO: Platform-Agnostic Security Tokens</a> as a way to generate <a href="sessions.html">Session data</a> before to <a href="iconfiguration.html#stores">store</a> it for persistance as a simple <strong>key</strong> <strong>value</strong>. It requires extra computation efforts but it is more secure and efficient, <a href="users.html">user</a> data are only load in login or singup tasks, all the necessary informations for <u>access control</u> should be  in <a href="sessions.html">session-data</a>.</p> |  | ||||||
| <p><a href="https://github.com/paseto-standard/paseto-spec">Paseto</a> is everything you love about JOSE (JWT, JWE, JWS) without any of the many design deficits that plague the JOSE standards.</p> |  | ||||||
| <p><a href="/docserver/">Doc Server</a> <a href="sessions.html">Session data</a> is saved as a <a href="pasetoken.html">Pasetoken</a> with asymmetric encripted data without passwords or <a href="https://en.wikipedia.org/wiki/Time-based_one-time_password">TOPT</a> codes.</p> |  | ||||||
| <p>To handle tokens a self library <strong>pasetoken-lib</strong> was developed for basic tasks like generate, parse, get claims, etc.</p> |  | ||||||
| <h2 id="generate-keys"><a class="header" href="#generate-keys">Generate keys</a></h2> |  | ||||||
| <p><a href="/docserver/">Doc Server</a> executable can generate <strong>public</strong> and <strong>secret</strong> keys: </p> |  | ||||||
| <pre><code class="language-bash">[ ! -d "paseto" ] && mkdir -p paseto  |  | ||||||
| docserver -p paseto  |  | ||||||
| </code></pre> |  | ||||||
| <p>This command will generate: <strong>paseto/publick.ky</strong> and <strong>paseto/secret.ky</strong>, if not test for directory to exist keys will be overwritten.</p> |  | ||||||
| <p>Genereated key files can be used in <a href="settings.html">configuration paseto settings</a></p> |  | ||||||
| <pre><code class="language-toml">[paseto]  |  | ||||||
|   public_path = "paseto/public.ky" |  | ||||||
|   secret_path = "paseto/secret.ky" |  | ||||||
| </code></pre> |  | ||||||
| <details id="admonition-paseto-keys-changes" class="admonition warning"> |  | ||||||
| <summary class="admonition-title"> |  | ||||||
| <p><b>Paseto keys</b> Changes</p> |  | ||||||
| <p><a class="admonition-anchor-link" href="#admonition-paseto-keys-changes"></a></p> |  | ||||||
| </summary> |  | ||||||
| <div> |  | ||||||
| <p>Change <strong>paseto keys</strong> will affect existing valid session tokens and others settings like <strong>smtp_auth</strong> value for <a href="/configuration.html#mail-service">Mail configuration</a></p> |  | ||||||
| <p>There is no problem if current valid sessions are dismissed or not need and <strong>smtp_auth</strong> value in configuration is set by using new keys.</p> |  | ||||||
| </div> |  | ||||||
| </details> |  | ||||||
| <div id="admonition-paseto-settings" class="admonition note"> |  | ||||||
| <div class="admonition-title"> |  | ||||||
| <p><b>Paseto</b> Settings</p> |  | ||||||
| <p><a class="admonition-anchor-link" href="#admonition-paseto-settings"></a></p> |  | ||||||
| </div> |  | ||||||
| <div> |  | ||||||
| <p>As <a href="/docserver/">Doc Server</a> <a href="sessions.html">Session data</a> are not sent to clients, only keys are handled via <a href="cookie.html">cookie set</a>, there would be not need to extra settings to make more complex and secure tokens, which in the end add extra efforts for handling.</p> |  | ||||||
| </div> |  | ||||||
| </div> |  | ||||||
| <pre><code class="language-toml">[paseto]  |  | ||||||
|   public_path = "paseto/public.ky" |  | ||||||
|   secret_path = "paseto/secret.ky" |  | ||||||
|   is_bin = false |  | ||||||
|   assert_val = "" |  | ||||||
|   expire = true |  | ||||||
| [paseto.map_footer] |  | ||||||
| [paseto.data] |  | ||||||
| </code></pre> |  | ||||||
| 
 |  | ||||||
|                     </main> |  | ||||||
| 
 |  | ||||||
|                     <nav class="nav-wrapper" aria-label="Page navigation"> |  | ||||||
|                         <!-- Mobile navigation buttons --> |  | ||||||
|                             <a rel="prev" href="sessions.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                                 <i class="fa fa-angle-left"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                             <a rel="next" href="sessions_sql.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                                 <i class="fa fa-angle-right"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                         <div style="clear: both"></div> |  | ||||||
|                     </nav> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
| 
 |  | ||||||
|             <nav class="nav-wide-wrapper" aria-label="Page navigation"> |  | ||||||
|                     <a rel="prev" href="sessions.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                         <i class="fa fa-angle-left"></i> |  | ||||||
|                     </a> |  | ||||||
| 
 |  | ||||||
|                     <a rel="next" href="sessions_sql.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                         <i class="fa fa-angle-right"></i> |  | ||||||
|                     </a> |  | ||||||
|             </nav> |  | ||||||
| 
 |  | ||||||
|         </div> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <script> |  | ||||||
|             window.playground_copyable = true; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/ace.js"></script> |  | ||||||
|         <script src="/docserver/editor.js"></script> |  | ||||||
|         <script src="/docserver/mode-rust.js"></script> |  | ||||||
|         <script src="/docserver/theme-dawn.js"></script> |  | ||||||
|         <script src="/docserver/theme-tomorrow_night.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/elasticlunr.min.js"></script> |  | ||||||
|         <script src="/docserver/mark.min.js"></script> |  | ||||||
|         <script src="/docserver/searcher.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/clipboard.min.js"></script> |  | ||||||
|         <script src="/docserver/highlight.js"></script> |  | ||||||
|         <script src="/docserver/book.js"></script> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom JS scripts --> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     </div> |  | ||||||
|     </body> |  | ||||||
| </html> |  | ||||||
| @ -1,212 +0,0 @@ | |||||||
| <!DOCTYPE HTML> |  | ||||||
| <html lang="en" class="sidebar-visible no-js light"> |  | ||||||
|     <head> |  | ||||||
|         <!-- Book generated using mdBook --> |  | ||||||
|         <meta charset="UTF-8"> |  | ||||||
|         <title>Access policies - Doc Server</title> |  | ||||||
|         <base href="/docserver/"> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <!-- Custom HTML head --> |  | ||||||
|          |  | ||||||
|         <meta name="description" content="Doc Server"> |  | ||||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> |  | ||||||
|         <meta name="theme-color" content="#ffffff" /> |  | ||||||
| 
 |  | ||||||
|         <link rel="icon" href="/docserver/favicon.svg"> |  | ||||||
|         <link rel="shortcut icon" href="/docserver/favicon.png"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/variables.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/general.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/chrome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/print.css" media="print"> |  | ||||||
| 
 |  | ||||||
|         <!-- Fonts --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/FontAwesome/css/font-awesome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/fonts/fonts.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Highlight.js Stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/highlight.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/tomorrow-night.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/ayu-highlight.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom theme stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/custom.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/mdbook-admonish.css"> |  | ||||||
| 
 |  | ||||||
|     </head> |  | ||||||
|     <body> |  | ||||||
|     <div id="body-container"> |  | ||||||
|         <!-- Provide site root to javascript --> |  | ||||||
|         <script> |  | ||||||
|             var path_to_root = "/docserver/"; |  | ||||||
|             var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light"; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Work around some values being stored in localStorage wrapped in quotes --> |  | ||||||
|         <script> |  | ||||||
|             try { |  | ||||||
|                 var theme = localStorage.getItem('mdbook-theme'); |  | ||||||
|                 var sidebar = localStorage.getItem('mdbook-sidebar'); |  | ||||||
| 
 |  | ||||||
|                 if (theme.startsWith('"') && theme.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (sidebar.startsWith('"') && sidebar.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); |  | ||||||
|                 } |  | ||||||
|             } catch (e) { } |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Set the theme before any content is loaded, prevents flash --> |  | ||||||
|         <script> |  | ||||||
|             var theme; |  | ||||||
|             try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } |  | ||||||
|             if (theme === null || theme === undefined) { theme = default_theme; } |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             html.classList.remove('no-js') |  | ||||||
|             html.classList.remove('light') |  | ||||||
|             html.classList.add(theme); |  | ||||||
|             html.classList.add('js'); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Hide / unhide sidebar before it is displayed --> |  | ||||||
|         <script> |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             var sidebar = null; |  | ||||||
|             if (document.body.clientWidth >= 1080) { |  | ||||||
|                 try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } |  | ||||||
|                 sidebar = sidebar || 'visible'; |  | ||||||
|             } else { |  | ||||||
|                 sidebar = 'hidden'; |  | ||||||
|             } |  | ||||||
|             html.classList.remove('sidebar-visible'); |  | ||||||
|             html.classList.add("sidebar-" + sidebar); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <nav id="sidebar" class="sidebar" aria-label="Table of contents"> |  | ||||||
|             <div class="sidebar-scrollbox"> |  | ||||||
|                 <ol class="chapter"><li class="chapter-item "><a href="/docserver/introduction.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li class="chapter-item "><a href="/docserver/index.html"><strong aria-hidden="true">2.</strong> What is this ?</a></li><li class="chapter-item "><a href="/docserver/features.html"><strong aria-hidden="true">3.</strong> Features</a></li><li class="chapter-item "><a href="/docserver/howto.html"><strong aria-hidden="true">4.</strong> How to</a></li><li class="chapter-item "><a href="/docserver/quick-start.html"><strong aria-hidden="true">5.</strong> Quick Start</a></li><li class="spacer"></li><li class="chapter-item affix "><li class="part-title">Server and Content</li><li class="chapter-item "><a href="/docserver/one_server.html"><strong aria-hidden="true">6.</strong> One web server instance</a></li><li class="chapter-item "><a href="/docserver/server_modes.html"><strong aria-hidden="true">7.</strong> Server modes</a></li><li class="chapter-item "><a href="/docserver/static_content.html"><strong aria-hidden="true">8.</strong> Static contents</a></li><li class="chapter-item "><a href="/docserver/url_path.html"><strong aria-hidden="true">9.</strong> url_path prefix</a></li><li class="chapter-item "><a href="/docserver/protect_access.html"><strong aria-hidden="true">10.</strong> Protect access</a></li><li class="chapter-item affix "><li class="part-title">Users and Policies</li><li class="chapter-item "><a href="/docserver/users.html"><strong aria-hidden="true">11.</strong> Users</a></li><li class="chapter-item "><a href="/docserver/users_sql.html"><strong aria-hidden="true">12.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/users_file_storage.html"><strong aria-hidden="true">13.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/roles.html"><strong aria-hidden="true">14.</strong> Roles</a></li><li class="chapter-item "><a href="/docserver/auths.html"><strong aria-hidden="true">15.</strong> Users auths</a></li><li class="chapter-item expanded "><a href="/docserver/policies.html" class="active"><strong aria-hidden="true">16.</strong> Access policies</a></li><li class="chapter-item "><a href="/docserver/adminusers.html"><strong aria-hidden="true">17.</strong> Users Admin</a></li><li class="chapter-item affix "><li class="part-title">Sessions</li><li class="chapter-item "><a href="/docserver/sessions.html"><strong aria-hidden="true">18.</strong> Session data</a></li><li class="chapter-item "><a href="/docserver/pasetoken.html"><strong aria-hidden="true">19.</strong> Pasetoken</a></li><li class="chapter-item "><a href="/docserver/sessions_sql.html"><strong aria-hidden="true">20.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/sessions_file_storage.html"><strong aria-hidden="true">21.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/cookie.html"><strong aria-hidden="true">22.</strong> Cookie set</a></li><li class="chapter-item affix "><li class="part-title">Logs and Trace</li><li class="chapter-item "><a href="/docserver/trace.html"><strong aria-hidden="true">23.</strong> Traced</a></li><li class="chapter-item "><a href="/docserver/logs.html"><strong aria-hidden="true">24.</strong> Sessions logs</a></li><li class="chapter-item affix "><li class="part-title">Configuration</li><li class="chapter-item "><a href="/docserver/configuration.html"><strong aria-hidden="true">25.</strong> Configurable service</a></li><li class="chapter-item "><a href="/docserver/settings.html"><strong aria-hidden="true">26.</strong> Config settings</a></li><li class="spacer"></li></ol> |  | ||||||
|             </div> |  | ||||||
|             <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> |  | ||||||
|         </nav> |  | ||||||
| 
 |  | ||||||
|         <div id="page-wrapper" class="page-wrapper"> |  | ||||||
| 
 |  | ||||||
|             <div class="page"> |  | ||||||
|                                 <div id="menu-bar-hover-placeholder"></div> |  | ||||||
|                 <div id="menu-bar" class="menu-bar sticky bordered"> |  | ||||||
|                     <div class="left-buttons"> |  | ||||||
|                         <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> |  | ||||||
|                             <i class="fa fa-bars"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="sidebar-toggle" onclick="location.href='/'" class="icon-button" type="button" title="Home" aria-label="Home" aria-controls=""> |  | ||||||
|                             <i class="fa fa-home"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> |  | ||||||
|                             <i class="fa fa-paint-brush"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> |  | ||||||
|                         </ul> |  | ||||||
|                         <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> |  | ||||||
|                             <i class="fa fa-search"></i> |  | ||||||
|                         </button> |  | ||||||
|                     </div> |  | ||||||
| 
 |  | ||||||
|                     <h1 class="menu-title">Doc Server</h1> |  | ||||||
| 
 |  | ||||||
|                     <div class="right-buttons"> |  | ||||||
|                         <a href="/docserver/print.html" title="Print this book" aria-label="Print this book"> |  | ||||||
|                             <i id="print-button" class="fa fa-print"></i> |  | ||||||
|                         </a> |  | ||||||
|                         <a href="/logout" title="Sing out" aria-label="Sign out"> |  | ||||||
|                             <i id="logout-button" class="fa fa-sign-out"></i> |  | ||||||
|                         </a> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div id="search-wrapper" class="hidden"> |  | ||||||
|                     <form id="searchbar-outer" class="searchbar-outer"> |  | ||||||
|                         <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> |  | ||||||
|                     </form> |  | ||||||
|                     <div id="searchresults-outer" class="searchresults-outer hidden"> |  | ||||||
|                         <div id="searchresults-header" class="searchresults-header"></div> |  | ||||||
|                         <ul id="searchresults"> |  | ||||||
|                         </ul> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> |  | ||||||
|                 <script> |  | ||||||
|                     document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); |  | ||||||
|                     document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); |  | ||||||
|                     Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { |  | ||||||
|                         link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); |  | ||||||
|                     }); |  | ||||||
|                 </script> |  | ||||||
| 
 |  | ||||||
|                 <div id="content" class="content"> |  | ||||||
|                     <main> |  | ||||||
|                         <h1 id="access-policies"><a class="header" href="#access-policies">Access policies</a></h1> |  | ||||||
| 
 |  | ||||||
|                     </main> |  | ||||||
| 
 |  | ||||||
|                     <nav class="nav-wrapper" aria-label="Page navigation"> |  | ||||||
|                         <!-- Mobile navigation buttons --> |  | ||||||
|                             <a rel="prev" href="auths.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                                 <i class="fa fa-angle-left"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                             <a rel="next" href="adminusers.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                                 <i class="fa fa-angle-right"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                         <div style="clear: both"></div> |  | ||||||
|                     </nav> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
| 
 |  | ||||||
|             <nav class="nav-wide-wrapper" aria-label="Page navigation"> |  | ||||||
|                     <a rel="prev" href="auths.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                         <i class="fa fa-angle-left"></i> |  | ||||||
|                     </a> |  | ||||||
| 
 |  | ||||||
|                     <a rel="next" href="adminusers.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                         <i class="fa fa-angle-right"></i> |  | ||||||
|                     </a> |  | ||||||
|             </nav> |  | ||||||
| 
 |  | ||||||
|         </div> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <script> |  | ||||||
|             window.playground_copyable = true; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/ace.js"></script> |  | ||||||
|         <script src="/docserver/editor.js"></script> |  | ||||||
|         <script src="/docserver/mode-rust.js"></script> |  | ||||||
|         <script src="/docserver/theme-dawn.js"></script> |  | ||||||
|         <script src="/docserver/theme-tomorrow_night.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/elasticlunr.min.js"></script> |  | ||||||
|         <script src="/docserver/mark.min.js"></script> |  | ||||||
|         <script src="/docserver/searcher.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/clipboard.min.js"></script> |  | ||||||
|         <script src="/docserver/highlight.js"></script> |  | ||||||
|         <script src="/docserver/book.js"></script> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom JS scripts --> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     </div> |  | ||||||
|     </body> |  | ||||||
| </html> |  | ||||||
| @ -1,863 +0,0 @@ | |||||||
| <!DOCTYPE HTML> |  | ||||||
| <html lang="en" class="sidebar-visible no-js light"> |  | ||||||
|     <head> |  | ||||||
|         <!-- Book generated using mdBook --> |  | ||||||
|         <meta charset="UTF-8"> |  | ||||||
|         <title>Doc Server</title> |  | ||||||
|         <meta name="robots" content="noindex" /> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <!-- Custom HTML head --> |  | ||||||
|          |  | ||||||
|         <meta name="description" content="Doc Server"> |  | ||||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> |  | ||||||
|         <meta name="theme-color" content="#ffffff" /> |  | ||||||
| 
 |  | ||||||
|         <link rel="icon" href="favicon.svg"> |  | ||||||
|         <link rel="shortcut icon" href="favicon.png"> |  | ||||||
|         <link rel="stylesheet" href="css/variables.css"> |  | ||||||
|         <link rel="stylesheet" href="css/general.css"> |  | ||||||
|         <link rel="stylesheet" href="css/chrome.css"> |  | ||||||
|         <link rel="stylesheet" href="css/print.css" media="print"> |  | ||||||
| 
 |  | ||||||
|         <!-- Fonts --> |  | ||||||
|         <link rel="stylesheet" href="FontAwesome/css/font-awesome.css"> |  | ||||||
|         <link rel="stylesheet" href="fonts/fonts.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Highlight.js Stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="highlight.css"> |  | ||||||
|         <link rel="stylesheet" href="tomorrow-night.css"> |  | ||||||
|         <link rel="stylesheet" href="ayu-highlight.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom theme stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="assets/css/custom.css"> |  | ||||||
|         <link rel="stylesheet" href="assets/css/mdbook-admonish.css"> |  | ||||||
| 
 |  | ||||||
|     </head> |  | ||||||
|     <body> |  | ||||||
|     <div id="body-container"> |  | ||||||
|         <!-- Provide site root to javascript --> |  | ||||||
|         <script> |  | ||||||
|             var path_to_root = ""; |  | ||||||
|             var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light"; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Work around some values being stored in localStorage wrapped in quotes --> |  | ||||||
|         <script> |  | ||||||
|             try { |  | ||||||
|                 var theme = localStorage.getItem('mdbook-theme'); |  | ||||||
|                 var sidebar = localStorage.getItem('mdbook-sidebar'); |  | ||||||
| 
 |  | ||||||
|                 if (theme.startsWith('"') && theme.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (sidebar.startsWith('"') && sidebar.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); |  | ||||||
|                 } |  | ||||||
|             } catch (e) { } |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Set the theme before any content is loaded, prevents flash --> |  | ||||||
|         <script> |  | ||||||
|             var theme; |  | ||||||
|             try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } |  | ||||||
|             if (theme === null || theme === undefined) { theme = default_theme; } |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             html.classList.remove('no-js') |  | ||||||
|             html.classList.remove('light') |  | ||||||
|             html.classList.add(theme); |  | ||||||
|             html.classList.add('js'); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Hide / unhide sidebar before it is displayed --> |  | ||||||
|         <script> |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             var sidebar = null; |  | ||||||
|             if (document.body.clientWidth >= 1080) { |  | ||||||
|                 try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } |  | ||||||
|                 sidebar = sidebar || 'visible'; |  | ||||||
|             } else { |  | ||||||
|                 sidebar = 'hidden'; |  | ||||||
|             } |  | ||||||
|             html.classList.remove('sidebar-visible'); |  | ||||||
|             html.classList.add("sidebar-" + sidebar); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <nav id="sidebar" class="sidebar" aria-label="Table of contents"> |  | ||||||
|             <div class="sidebar-scrollbox"> |  | ||||||
|                 <ol class="chapter"><li class="chapter-item "><a href="introduction.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li class="chapter-item "><a href="index.html"><strong aria-hidden="true">2.</strong> What is this ?</a></li><li class="chapter-item "><a href="features.html"><strong aria-hidden="true">3.</strong> Features</a></li><li class="chapter-item "><a href="howto.html"><strong aria-hidden="true">4.</strong> How to</a></li><li class="chapter-item "><a href="quick-start.html"><strong aria-hidden="true">5.</strong> Quick Start</a></li><li class="spacer"></li><li class="chapter-item affix "><li class="part-title">Server and Content</li><li class="chapter-item "><a href="one_server.html"><strong aria-hidden="true">6.</strong> One web server instance</a></li><li class="chapter-item "><a href="server_modes.html"><strong aria-hidden="true">7.</strong> Server modes</a></li><li class="chapter-item "><a href="static_content.html"><strong aria-hidden="true">8.</strong> Static contents</a></li><li class="chapter-item "><a href="url_path.html"><strong aria-hidden="true">9.</strong> url_path prefix</a></li><li class="chapter-item "><a href="protect_access.html"><strong aria-hidden="true">10.</strong> Protect access</a></li><li class="chapter-item affix "><li class="part-title">Users and Policies</li><li class="chapter-item "><a href="users.html"><strong aria-hidden="true">11.</strong> Users</a></li><li class="chapter-item "><a href="users_sql.html"><strong aria-hidden="true">12.</strong> SQL storage</a></li><li class="chapter-item "><a href="users_file_storage.html"><strong aria-hidden="true">13.</strong> File storage</a></li><li class="chapter-item "><a href="roles.html"><strong aria-hidden="true">14.</strong> Roles</a></li><li class="chapter-item "><a href="auths.html"><strong aria-hidden="true">15.</strong> Users auths</a></li><li class="chapter-item "><a href="policies.html"><strong aria-hidden="true">16.</strong> Access policies</a></li><li class="chapter-item "><a href="adminusers.html"><strong aria-hidden="true">17.</strong> Users Admin</a></li><li class="chapter-item affix "><li class="part-title">Sessions</li><li class="chapter-item "><a href="sessions.html"><strong aria-hidden="true">18.</strong> Session data</a></li><li class="chapter-item "><a href="pasetoken.html"><strong aria-hidden="true">19.</strong> Pasetoken</a></li><li class="chapter-item "><a href="sessions_sql.html"><strong aria-hidden="true">20.</strong> SQL storage</a></li><li class="chapter-item "><a href="sessions_file_storage.html"><strong aria-hidden="true">21.</strong> File storage</a></li><li class="chapter-item "><a href="cookie.html"><strong aria-hidden="true">22.</strong> Cookie set</a></li><li class="chapter-item affix "><li class="part-title">Logs and Trace</li><li class="chapter-item "><a href="trace.html"><strong aria-hidden="true">23.</strong> Traced</a></li><li class="chapter-item "><a href="logs.html"><strong aria-hidden="true">24.</strong> Sessions logs</a></li><li class="chapter-item affix "><li class="part-title">Configuration</li><li class="chapter-item "><a href="configuration.html"><strong aria-hidden="true">25.</strong> Configurable service</a></li><li class="chapter-item "><a href="settings.html"><strong aria-hidden="true">26.</strong> Config settings</a></li><li class="spacer"></li></ol> |  | ||||||
|             </div> |  | ||||||
|             <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> |  | ||||||
|         </nav> |  | ||||||
| 
 |  | ||||||
|         <div id="page-wrapper" class="page-wrapper"> |  | ||||||
| 
 |  | ||||||
|             <div class="page"> |  | ||||||
|                                 <div id="menu-bar-hover-placeholder"></div> |  | ||||||
|                 <div id="menu-bar" class="menu-bar sticky bordered"> |  | ||||||
|                     <div class="left-buttons"> |  | ||||||
|                         <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> |  | ||||||
|                             <i class="fa fa-bars"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="sidebar-toggle" onclick="location.href='/'" class="icon-button" type="button" title="Home" aria-label="Home" aria-controls=""> |  | ||||||
|                             <i class="fa fa-home"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> |  | ||||||
|                             <i class="fa fa-paint-brush"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> |  | ||||||
|                         </ul> |  | ||||||
|                         <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> |  | ||||||
|                             <i class="fa fa-search"></i> |  | ||||||
|                         </button> |  | ||||||
|                     </div> |  | ||||||
| 
 |  | ||||||
|                     <h1 class="menu-title">Doc Server</h1> |  | ||||||
| 
 |  | ||||||
|                     <div class="right-buttons"> |  | ||||||
|                         <a href="print.html" title="Print this book" aria-label="Print this book"> |  | ||||||
|                             <i id="print-button" class="fa fa-print"></i> |  | ||||||
|                         </a> |  | ||||||
|                         <a href="/logout" title="Sing out" aria-label="Sign out"> |  | ||||||
|                             <i id="logout-button" class="fa fa-sign-out"></i> |  | ||||||
|                         </a> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div id="search-wrapper" class="hidden"> |  | ||||||
|                     <form id="searchbar-outer" class="searchbar-outer"> |  | ||||||
|                         <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> |  | ||||||
|                     </form> |  | ||||||
|                     <div id="searchresults-outer" class="searchresults-outer hidden"> |  | ||||||
|                         <div id="searchresults-header" class="searchresults-header"></div> |  | ||||||
|                         <ul id="searchresults"> |  | ||||||
|                         </ul> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> |  | ||||||
|                 <script> |  | ||||||
|                     document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); |  | ||||||
|                     document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); |  | ||||||
|                     Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { |  | ||||||
|                         link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); |  | ||||||
|                     }); |  | ||||||
|                 </script> |  | ||||||
| 
 |  | ||||||
|                 <div id="content" class="content"> |  | ||||||
|                     <main> |  | ||||||
|                         <p><a href="./">Doc Server</a> is a <strong>Web Server</strong> in <a href="https://www.rust-lang.org">Rust</a> for <a href="./static_content.html">static content</a> |  | ||||||
| with <strong>Control access</strong>  via <a href="./auths.html">authorizations</a>, fully customizable with <a href="./settings.html">settings</a>.</p> |  | ||||||
| <p><svg style="display:none"><symbol id="symbl-check" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> <path stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path></symbol></svg></p> |  | ||||||
| <div class="box"><img src="images/docserver.svg" class="logo" /></div> |  | ||||||
| <p><a href="README.html">DocServer</a> is created to:</p> |  | ||||||
| <ul> |  | ||||||
| <li> |  | ||||||
| <p>Serve several <a href="static_content.html">static contents</a> paths from <a href="one_server.html">one web server instance</a> at once. Server is based in <a href="https://www.rust-lang.org">Rust</a> <a href="https://github.com/tokio-rs/axum">Axum</a> crate under <a href="https://github.com/tokio-rs/tokio">Tokio</a>, with a lot of <a href="configuration.html">config settings</a> to customize in a config <a href="https://en.wikipedia.org/wiki/TOML">TOML</a> file: SSL, Paths, Menus, Keys, Contents, Roles, etc.</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>Use <a href="static_content.html">static contents</a> from <a href="https://rust-lang.github.io/mdBook/">mdbooks</a> with <a href="https://github.com/JesusPerez/mdBook">fixed absolute links via site-url</a> or <a href="https://doc.rust-lang.org/rust-by-example/meta/doc.html">code docs</a> from <a href="https://doc.rust-lang.org/cargo/commands/cargo-doc.html">Cargo doc</a>.</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><a href="protect_access.html">Protect access</a> to <a href="static_content.html">static contents</a> with <a href="auths.html">users authentication and authorizations</a> by <a href="url_path.html">url_path prefix</a>, <a href="roles.html">roles</a> or <a href="users.html">users</a> login names or emails.</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>Define <a href="policies.html">access policies</a> to <strong>enfoce</strong> for content access with <a href="https://github.com/casbin/casbin-rs">Casbin</a></p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>Handle <a href="users.html">user</a> defininition: Create/Invite, SignIn/SignOut, Settings, Roles, Administration. Several users modes can be set via <a href="settings.html">config settings</a>.</p> |  | ||||||
| <ul> |  | ||||||
| <li> |  | ||||||
| <p>For <a href="users.html">user</a> authentication use Argon2 for password and <a href="https://en.wikipedia.org/wiki/Time-based_one-time_password">TOPT</a> as <a href="https://en.wikipedia.org/wiki/Multi-factor_authentication">2FA</a> with optional mail service for notifications</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><a href="sessions.html">Sessions</a> are stored in async <a href="https://github.com/launchbadge/sqlx">sqlx</a> to <a href="sqlite.html">Sqlite</a> or <a href="file_storage.html">File</a> storages and keys handled via <a href="cookie.html">cookie set</a>, for larger use <a href="https://github.com/launchbadge/sqlx">sqlx</a> as <u>Database Agnostic provides other <a href="https://en.wikipedia.org/wiki/SQL">SQL</a> options</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><a href="sessions.html">Session data</a> is saved as a <a href="pasetoken.html">Pasetoken</a> with asymmetric encripted data without passwords or <a href="https://en.wikipedia.org/wiki/Time-based_one-time_password">TOPT</a> codes.</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>Some requests responses are created by a <a href="https://github.com/Keats/tera">template engine</a>, so can be customized to some use cases.</p> |  | ||||||
| </li> |  | ||||||
| </ul> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>Optionally request can be <a href="trace.html">traced</a> in <a href="logs.html">sessions logs</a></p> |  | ||||||
| </li> |  | ||||||
| </ul> |  | ||||||
| <div id="admonition-main-purpose" class="admonition note"> |  | ||||||
| <div class="admonition-title"> |  | ||||||
| <p>Main purpose</p> |  | ||||||
| <p><a class="admonition-anchor-link" href="introduction.html#admonition-main-purpose"></a></p> |  | ||||||
| </div> |  | ||||||
| <div> |  | ||||||
| <p><strong>Control access</strong> to <a href="static_content.html">static contents</a> paths from <a href="one_server.html">one web server instance</a> </p> |  | ||||||
| <p>Tested with <a href="https://rust-lang.github.io/mdBook/">mdbooks</a> with <a href="https://github.com/JesusPerez/mdBook">fixed absolute links via site-url</a> or <a href="https://doc.rust-lang.org/rust-by-example/meta/doc.html">code docs</a></p> |  | ||||||
| </div> |  | ||||||
| </div><div style="break-before: page; page-break-before: always;"></div><p><a href="./">Doc Server</a> is a <strong>Web Server</strong> in <a href="https://www.rust-lang.org">Rust</a> for <a href="./static_content.html">static content</a> |  | ||||||
| with <strong>Control access</strong>  via <a href="./auths.html">authorizations</a>, fully customizable with <a href="./settings.html">settings</a>.</p> |  | ||||||
| <p><svg style="display:none"><symbol id="symbl-check" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> <path stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path></symbol></svg></p> |  | ||||||
| <div class="box"><img src="images/docserver.svg" class="logo" /></div> |  | ||||||
| <h2 id="one-server"><a class="header" href="#one-server">One Server</a></h2> |  | ||||||
| <p>Most of documentation or <a href="static_content.html">static content</a> is generated to be served from a WebServer using <strong>absoulte</strong>, <strong>relative</strong> <a href="https://www.w3.org/TR/WD-html40-970917/htmlweb.html">URL</a> or a <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base">document base URL</a>, this is a big issue to  handle several at once  from one unique server under <a href="https://en.wikipedia.org/wiki/URL">url paths</a> if are not set properly. In many cases there is no need for a dedicated web server for each documentation or <a href="static_content.html">static content</a> that needs to be published or served. Some documentation generators are more or less configurables to use some <a href="https://www.w3.org/TR/WD-html40-970917/htmlweb.html">URL</a> <strong>relative path</strong>, this should include pages and assets (images, css, js, etc.).</p> |  | ||||||
| <h2 id="protect-access-content"><a class="header" href="#protect-access-content">Protect access content</a></h2> |  | ||||||
| <p>In many case some <a href="protect_access.html">protect access content</a> mode is mandatory, from private infos to restricted documentation or development docs, whether it is for internal  use or new versions not delivered yet.</p> |  | ||||||
| <p><a href="https://en.wikipedia.org/wiki/Basic_access_authentication">Basic authentication</a> or via one <a href="https://en.wikipedia.org/wiki/JSON_Web_Token">token</a> could be too simple and flat to tailor specific contexts, so a full real <a href="sessions.html">sessions</a> handling should implement  <a href="users.html">users</a> (identity entities), <a href="roles.html">roles</a> (groups),  <a href="policies.html">policies</a> (permissions) and <a href="pasetoken.html">secure tokens</a> (as data container).</p> |  | ||||||
| <h2 id="secure-sessions"><a class="header" href="#secure-sessions">Secure sessions</a></h2> |  | ||||||
| <p><a href="sessions.html">Sessions management</a> to content access with <u>secure storage</u> (some kind of persistence has to be provided among requests) and exchange with clients upon requests. Their data will allow <a href="https://en.wikipedia.org/wiki/Web_server">webserver</a> to allow or deny  an <a href="https://www.w3.org/TR/WD-html40-970917/htmlweb.html">URL</a> access request in a <a href="https://en.wikipedia.org/wiki/Middleware">middleware</a> stage.</p> |  | ||||||
| <h2 id="users"><a class="header" href="#users">Users</a></h2> |  | ||||||
| <p>At least a simple <a href="users.html">users management</a> creation, identification and admin to link <a href="sessions.html">sessions</a> to an identified entity. Signin access should use  secure passwords and <a href="https://en.wikipedia.org/wiki/Multi-factor_authentication">2FA</a> with optional mail service for notifications. Signup modes should be also provided for close or open contexts.</p> |  | ||||||
| <p>Some requests responses are created by a <a href="https://github.com/Keats/tera">template engine</a>, so can be customized to some use cases.</p> |  | ||||||
| <h2 id="logging"><a class="header" href="#logging">Logging</a></h2> |  | ||||||
| <p>Some kind of mechanism for <a href="logs.html">logs</a> storages and <a href="trace.html">trace access</a> to know what is happening and how is it used.</p> |  | ||||||
| <h2 id="configuration-settings"><a class="header" href="#configuration-settings">Configuration settings</a></h2> |  | ||||||
| <p><a href="configuration.html">Service configuration</a> with <a href="settings.html">settings</a> via <a href="https://en.wikipedia.org/wiki/TOML">TOML</a> file will help to customize server and services to context and needs.</p> |  | ||||||
| <div style="break-before: page; page-break-before: always;"></div><h1 id="features"><a class="header" href="#features">Features</a></h1> |  | ||||||
| <ol> |  | ||||||
| <li> |  | ||||||
| <p>Server severals <a href="static_content.html">static contents</a> paths from one web server instance</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><a href="protect_access.html">Protect access content</a> with <a href="auths.html">users authentication and authorizations</a></p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>Create keys and <a href="sessions.html">sessions</a> to content access with <a href="pasetoken.html">asymmetric encrypted</a></p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>Handle and stored <a href="sessions.html">secure sessions</a> and exchange it via <a href="cookies.html">cookies</a></p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>Provides <a href="users.html">users management</a> creation, identification and admin with password and <a href="https://en.wikipedia.org/wiki/Multi-factor_authentication">2FA</a> with optional mail service for notifications</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>Some requests responses are created by a <a href="https://github.com/Keats/tera">template engine</a>, so can be customized to some use cases.</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>Can <a href="trace.html">trace access</a> to <a href="logs.html">logs</a> storages</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><a href="configuration.html">Configurable service</a> with <a href="settings.html">settings</a> via <a href="https://en.wikipedia.org/wiki/TOML">TOML</a> file</p> |  | ||||||
| </li> |  | ||||||
| </ol> |  | ||||||
| <div style="break-before: page; page-break-before: always;"></div><h1 id="how-to"><a class="header" href="#how-to">How to</a></h1> |  | ||||||
| <div style="break-before: page; page-break-before: always;"></div><h1 id="quick-start"><a class="header" href="#quick-start">Quick Start</a></h1> |  | ||||||
| <ol> |  | ||||||
| <li> |  | ||||||
| <p>Set <a href="/configuration.html#main">Main</a> values: <strong>root_path</strong>, <strong>templates_path</strong>, <strong>assets_url</strong>.</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>To enable <a href="/configuration.html#signup">Signup</a>:</p> |  | ||||||
| <ul> |  | ||||||
| <li>In <strong>open</strong> mode: set <strong>signup_mode = “open”</strong></li> |  | ||||||
| <li>In <strong>invitation</strong> mode: <strong>signup_mode = “invitation”</strong> (if is necessary fix <strong>invite_expire</strong> seconds)</li> |  | ||||||
| </ul> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>To use <a href="/configuration.html#https">HTTPS</a>:</p> |  | ||||||
| <ul> |  | ||||||
| <li>Set paths for <strong>cert_file</strong> and <strong>key_file</strong></li> |  | ||||||
| <li>Set <strong>protocol = “https”</strong></li> |  | ||||||
| </ul> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>To use <a href="/configuration.html#totp">TOPT</a>:</p> |  | ||||||
| <ul> |  | ||||||
| <li>Set <strong>totp_mode = “optional”</strong>  or <strong>totp_mode = “mandatory”</strong></li> |  | ||||||
| </ul> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>To use <a href="/configuration.html#mail-service">Mail service</a>:</p> |  | ||||||
| <ul> |  | ||||||
| <li>Set <strong>use_mail=true</strong></li> |  | ||||||
| <li>Set <strong>[paseto]</strong> section (<strong>public_path</strong> and <strong>secret_path</strong>)</li> |  | ||||||
| <li>Run <strong>tools/get_mail_token.sh</strong> script to generate <strong>smtp_auth</strong> value with  MAIL_USER and MAIL_PASSWORD</li> |  | ||||||
| <li>Complete values: <strong>smtp_auth</strong> and <strong>mail_from</strong></li> |  | ||||||
| </ul> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>Define <a href="/configuration.html#stores">Stores</a> for service:</p> |  | ||||||
| <p>For <a href="sessions.html">Sessions</a> |  | ||||||
| For [Users](users .md)</p> |  | ||||||
| <ul> |  | ||||||
| <li> |  | ||||||
| <p>For <a href="https://www.sqlite.org/index.html">SQLite</a>:</p> |  | ||||||
| <ul> |  | ||||||
| <li>Create <strong>users_store_uri</strong> = “sqlite:PATH_TO_users.db”</li> |  | ||||||
| <li>set <strong>users_store_uri</strong> = “sqlite:PATH_TO_users.db”</li> |  | ||||||
| <li>Create <strong>sessions_store_uri</strong> = “sqlite:PATH_TO_sessions.db”</li> |  | ||||||
| <li>set <strong>sessions_store_uri</strong> = “sqlite:PATH_TO_sessions.db”</li> |  | ||||||
| </ul> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>For <strong>FILE</strong> mode:</p> |  | ||||||
| <ul> |  | ||||||
| <li>set <strong>users_store_uri</strong> = “file:///PATH_TO_users_DIRECTORY”</li> |  | ||||||
| <li>set <strong>sessions_store_uri</strong> = “file:///PATH_TO_sessions_DIRECTORY”</li> |  | ||||||
| </ul> |  | ||||||
| </li> |  | ||||||
| </ul> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><a href="policies.html">Access policies</a> to <strong>enfoce</strong> for content access with <a href="https://github.com/casbin/casbin-rs">Casbin</a>:</p> |  | ||||||
| <ul> |  | ||||||
| <li>Set <a href="/configuration.html#policies">Policies paths</a>: <strong>authz_model_path</strong> and <strong>authz_policy_path</strong></li> |  | ||||||
| <li>Set an entry for each <a href="static_content.html">static_content</a> like in example bellow</li> |  | ||||||
| <li>Be sure <a href="policies.html">Access policies</a> for each <strong>serve_path</strong> <strong>url_path</strong> are properly set in <strong>authz_policy_path</strong> file</li> |  | ||||||
| </ul> |  | ||||||
| </li> |  | ||||||
| </ol> |  | ||||||
| <div style="margin-left:4em"> |  | ||||||
| Example (<b>url_path</b> /appdoc): |  | ||||||
| <pre><code class="language-toml">[[serve_paths]] |  | ||||||
| # Server relative Directory Path (sitehome/appdoc) |  | ||||||
| srv_path = "Server DIRECTORY_PATH" |  | ||||||
| # Absolute URL path for resquests |  | ||||||
| url_path = "/appdoc" |  | ||||||
| # Not found URL to be redirect  |  | ||||||
| not_found = "" |  | ||||||
| # URL to be redirect if is not authorization found |  | ||||||
| not_auth = "/login" |  | ||||||
| # true or false to access control or not to this PATH |  | ||||||
| is_restricted = true |  | ||||||
| </code></pre> |  | ||||||
| </div> |  | ||||||
| <div style="margin-left:4em"> |  | ||||||
| Policy content for <b>url_path</b> = "/appdoc" method GET: |  | ||||||
| <p>For <a href="roles.html">Role</a> <b>dev</b>:</p> |  | ||||||
| <pre><code class="language-text">p, dev, /appdoc, GET |  | ||||||
| </code></pre> |  | ||||||
| <p>For specific user only:</p> |  | ||||||
| <pre><code class="language-text">p, user@test.com, /appdoc, GET |  | ||||||
| </code></pre> |  | ||||||
| </div> |  | ||||||
| <ol start="8"> |  | ||||||
| <li>Generate <a href="pasetoken.html#generate-keys">Pasetoken keys</a> to generate <a href="sessions.html">Session data</a></li> |  | ||||||
| </ol> |  | ||||||
| <div style="break-before: page; page-break-before: always;"></div><h1 id="one-web-server-instance"><a class="header" href="#one-web-server-instance">One web server instance</a></h1> |  | ||||||
| <div style="break-before: page; page-break-before: always;"></div><h1 id="server-modes"><a class="header" href="#server-modes">Server modes</a></h1> |  | ||||||
| <div style="break-before: page; page-break-before: always;"></div><h1 id="static-contents"><a class="header" href="#static-contents">Static contents</a></h1> |  | ||||||
| <div style="break-before: page; page-break-before: always;"></div><h1 id="url_path-prefix"><a class="header" href="#url_path-prefix">url_path prefix</a></h1> |  | ||||||
| <div style="break-before: page; page-break-before: always;"></div><h1 id="protect-access"><a class="header" href="#protect-access">Protect access</a></h1> |  | ||||||
| <div style="break-before: page; page-break-before: always;"></div><h1 id="users-1"><a class="header" href="#users-1">Users</a></h1> |  | ||||||
| <div style="break-before: page; page-break-before: always;"></div><h1 id="sql-storage"><a class="header" href="#sql-storage">SQL storage</a></h1> |  | ||||||
| <p><a href="./">Doc Server</a> <a href="users.html">users</a> use <a href="https://www.rust-lang.org">Rust</a> crate <a href="https://github.com/launchbadge/sqlx">SQLx</a></p> |  | ||||||
| <p>As <u>Dataabse Agnostic</u> can it easily support the following databases:</p> |  | ||||||
| <ul> |  | ||||||
| <li><a href="http://postgresql.org/">PostgreSQL</a></li> |  | ||||||
| <li><a href="https://www.mysql.com/">MySQL</a></li> |  | ||||||
| <li><a href="https://sqlite.org/">SQLite</a></li> |  | ||||||
| <li><a href="https://www.microsoft.com/en-us/sql-server">MSSQL</a></li> |  | ||||||
| </ul> |  | ||||||
| <p><a href="https://docs.rs/sqlx/latest/sqlx/any/index.html">sqlx::any</a> is used so:</p> |  | ||||||
| <blockquote> |  | ||||||
| <p><a href="./">Doc Server</a> for <a href="users.html">users</a> use a Generic database driver with the specific driver selected at runtime.</p> |  | ||||||
| </blockquote> |  | ||||||
| <p><a href="https://github.com/launchbadge/sqlx">SQLx</a> is also used for <a href="sessions.html">sessions</a> <a href="sessions_sql.html">SQL storage</a>.</p> |  | ||||||
| <div style="break-before: page; page-break-before: always;"></div><h1 id="file-storage"><a class="header" href="#file-storage">File storage</a></h1> |  | ||||||
| <div style="break-before: page; page-break-before: always;"></div><h1 id="roles"><a class="header" href="#roles">Roles</a></h1> |  | ||||||
| <div style="break-before: page; page-break-before: always;"></div><h1 id="users-authentication-and-authorizations"><a class="header" href="#users-authentication-and-authorizations">Users authentication and authorizations</a></h1> |  | ||||||
| <div style="break-before: page; page-break-before: always;"></div><h1 id="access-policies"><a class="header" href="#access-policies">Access policies</a></h1> |  | ||||||
| <div style="break-before: page; page-break-before: always;"></div><h1 id="users-admin"><a class="header" href="#users-admin">Users Admin</a></h1> |  | ||||||
| <div style="break-before: page; page-break-before: always;"></div><h1 id="session-data"><a class="header" href="#session-data">Session data</a></h1> |  | ||||||
| <div style="break-before: page; page-break-before: always;"></div><h1 id="pasetoken"><a class="header" href="#pasetoken">Pasetoken</a></h1> |  | ||||||
| <p><a href="./">Doc Server</a> use <a href="https://github.com/paseto-standard/paseto-spec">PASETO: Platform-Agnostic Security Tokens</a> as a way to generate <a href="sessions.html">Session data</a> before to <a href="iconfiguration.html#stores">store</a> it for persistance as a simple <strong>key</strong> <strong>value</strong>. It requires extra computation efforts but it is more secure and efficient, <a href="users.html">user</a> data are only load in login or singup tasks, all the necessary informations for <u>access control</u> should be  in <a href="sessions.html">session-data</a>.</p> |  | ||||||
| <p><a href="https://github.com/paseto-standard/paseto-spec">Paseto</a> is everything you love about JOSE (JWT, JWE, JWS) without any of the many design deficits that plague the JOSE standards.</p> |  | ||||||
| <p><a href="./">Doc Server</a> <a href="sessions.html">Session data</a> is saved as a <a href="pasetoken.html">Pasetoken</a> with asymmetric encripted data without passwords or <a href="https://en.wikipedia.org/wiki/Time-based_one-time_password">TOPT</a> codes.</p> |  | ||||||
| <p>To handle tokens a self library <strong>pasetoken-lib</strong> was developed for basic tasks like generate, parse, get claims, etc.</p> |  | ||||||
| <h2 id="generate-keys"><a class="header" href="#generate-keys">Generate keys</a></h2> |  | ||||||
| <p><a href="./">Doc Server</a> executable can generate <strong>public</strong> and <strong>secret</strong> keys: </p> |  | ||||||
| <pre><code class="language-bash">[ ! -d "paseto" ] && mkdir -p paseto  |  | ||||||
| docserver -p paseto  |  | ||||||
| </code></pre> |  | ||||||
| <p>This command will generate: <strong>paseto/publick.ky</strong> and <strong>paseto/secret.ky</strong>, if not test for directory to exist keys will be overwritten.</p> |  | ||||||
| <p>Genereated key files can be used in <a href="settings.html">configuration paseto settings</a></p> |  | ||||||
| <pre><code class="language-toml">[paseto]  |  | ||||||
|   public_path = "paseto/public.ky" |  | ||||||
|   secret_path = "paseto/secret.ky" |  | ||||||
| </code></pre> |  | ||||||
| <details id="admonition-paseto-keys-changes" class="admonition warning"> |  | ||||||
| <summary class="admonition-title"> |  | ||||||
| <p><b>Paseto keys</b> Changes</p> |  | ||||||
| <p><a class="admonition-anchor-link" href="pasetoken.html#admonition-paseto-keys-changes"></a></p> |  | ||||||
| </summary> |  | ||||||
| <div> |  | ||||||
| <p>Change <strong>paseto keys</strong> will affect existing valid session tokens and others settings like <strong>smtp_auth</strong> value for <a href="/configuration.html#mail-service">Mail configuration</a></p> |  | ||||||
| <p>There is no problem if current valid sessions are dismissed or not need and <strong>smtp_auth</strong> value in configuration is set by using new keys.</p> |  | ||||||
| </div> |  | ||||||
| </details> |  | ||||||
| <div id="admonition-paseto-settings" class="admonition note"> |  | ||||||
| <div class="admonition-title"> |  | ||||||
| <p><b>Paseto</b> Settings</p> |  | ||||||
| <p><a class="admonition-anchor-link" href="pasetoken.html#admonition-paseto-settings"></a></p> |  | ||||||
| </div> |  | ||||||
| <div> |  | ||||||
| <p>As <a href="./">Doc Server</a> <a href="sessions.html">Session data</a> are not sent to clients, only keys are handled via <a href="cookie.html">cookie set</a>, there would be not need to extra settings to make more complex and secure tokens, which in the end add extra efforts for handling.</p> |  | ||||||
| </div> |  | ||||||
| </div> |  | ||||||
| <pre><code class="language-toml">[paseto]  |  | ||||||
|   public_path = "paseto/public.ky" |  | ||||||
|   secret_path = "paseto/secret.ky" |  | ||||||
|   is_bin = false |  | ||||||
|   assert_val = "" |  | ||||||
|   expire = true |  | ||||||
| [paseto.map_footer] |  | ||||||
| [paseto.data] |  | ||||||
| </code></pre> |  | ||||||
| <div style="break-before: page; page-break-before: always;"></div><h1 id="sql-storage-1"><a class="header" href="#sql-storage-1">SQL storage</a></h1> |  | ||||||
| <p><a href="./">Doc Server</a> <a href="sessions.html">Sesssions</a> use <a href="https://www.rust-lang.org">Rust</a> crate <a href="https://github.com/http-rs/async-session">async_session</a> for storage or data persistence, so bassically there are several stores to use.</p> |  | ||||||
| <p>To keep it small and simple <a href="https://github.com/jbr/async-sqlx-session">async-sqlx-session</a> is implemented by default with <a href="https://sqlite.org">SQLite</a> but as it is based on <a href="https://github.com/launchbadge/sqlx">SQLx</a> is is <u>Database Agnostic</u> and it easily support any other choice: <a href="http://postgresql.org/">PostgreSQL</a>, <a href="https://www.mysql.com/">MySQL</a>, <a href="https://sqlite.org/">SQLite</a>, and <a href="https://www.microsoft.com/en-us/sql-server">MSSQL</a>.</p> |  | ||||||
| <p><a href="https://github.com/launchbadge/sqlx">SQLx</a> is also used for <a href="users.html">users</a> <a href="users_sql.html">SQL storage</a>.</p> |  | ||||||
| <div id="admonition-sessions-store-criteria" class="admonition note"> |  | ||||||
| <div class="admonition-title"> |  | ||||||
| <p>Sessions store criteria</p> |  | ||||||
| <p><a class="admonition-anchor-link" href="sessions_sql.html#admonition-sessions-store-criteria"></a></p> |  | ||||||
| </div> |  | ||||||
| <div> |  | ||||||
| <p><strong>Control access</strong> to <a href="static_content.html">static contents</a> paths requires <a href="sessions.html">Session data</a> stored in database, <a href="cookies.html">cookies</a> contains basically a <a href="sessions.html">Session ID</a> with no extra content, all other (<a href="users.html">user</a> or <a href="sessions.html">session</a>) data require database access.</p> |  | ||||||
| <p>If many concurrent sessions are expected to be supported, probalby will be better to use other database option for perforrmance, rather than send more data to clients.</p> |  | ||||||
| </div> |  | ||||||
| </div> |  | ||||||
| <div id="admonition-separate-databases-for-session-and-users" class="admonition warning"> |  | ||||||
| <div class="admonition-title"> |  | ||||||
| <p>Separate databases for Session and Users</p> |  | ||||||
| <p><a class="admonition-anchor-link" href="sessions_sql.html#admonition-separate-databases-for-session-and-users"></a></p> |  | ||||||
| </div> |  | ||||||
| <div> |  | ||||||
| <p><a href="sessions.html">Sessions</a> and <a href="users.html">Users</a> can use same database store by simply using same <strong>uri config values</strong>:</p> |  | ||||||
| </div> |  | ||||||
| </div> |  | ||||||
| <h2 id="setup"><a class="header" href="#setup">Setup</a></h2> |  | ||||||
| <p><a href="https://github.com/tokio-rs/axum">Axum</a></p> |  | ||||||
| <div style="break-before: page; page-break-before: always;"></div><h1 id="file-storage-1"><a class="header" href="#file-storage-1">File storage</a></h1> |  | ||||||
| <div style="break-before: page; page-break-before: always;"></div><h1 id="cookie-set"><a class="header" href="#cookie-set">Cookie set</a></h1> |  | ||||||
| <div style="break-before: page; page-break-before: always;"></div><h1 id="traced"><a class="header" href="#traced">Traced</a></h1> |  | ||||||
| <div style="break-before: page; page-break-before: always;"></div><h1 id="sessions-logs"><a class="header" href="#sessions-logs">Sessions logs</a></h1> |  | ||||||
| <div style="break-before: page; page-break-before: always;"></div><h1 id="configurable-service"><a class="header" href="#configurable-service">Configurable service</a></h1> |  | ||||||
| <p><a href="./">Doc Server</a> can be adjusted to differents <a href="configuration.html#modes">modes</a> with <a href="settings.html">Settings</a> in <a href="configuration.html#config-file">Config file</a>.</p> |  | ||||||
| <div class="box"><img src="images/docserver.svg" class="logo" /></div> |  | ||||||
| <h2 id="config-file"><a class="header" href="#config-file">Config file</a></h2> |  | ||||||
| <p><strong>Config file</strong> path with <a href="settings.html">Settings</a> is passed as argument to <a href="./">Doc Server</a> executable as:</p> |  | ||||||
| <pre><code class="language-bash">docserver --config <CONFIG_PATH>  |  | ||||||
| </code></pre> |  | ||||||
| <p>It should be a <strong><a href="https://en.wikipedia.org/wiki/TOML">TOML</a> file-path with Configuration <a href="settings.html">settings</a> to run <code>WebServer</code></strong>, it is REQUIRED to run  <a href="./">Doc Server</a></p> |  | ||||||
| <p>It is composed by the following parts:</p> |  | ||||||
| <ul> |  | ||||||
| <li> |  | ||||||
| <p><a href="configuration.html#main">Paths, URLs, Web Server main settings</a> (port, host, protocol, SSL certificates, etc)</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><a href="configuration.html#signup">Signup and Signin</a> settings: <a href="configuration.html#password-score">password</a>, <a href="configuration.html#totp">TOTP</a>,  <a href="configuration.html#admin-user-fields">admin fields</a>, etc.</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><a href="configuration.html#mail-service">Mail</a> settings if enabled</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><a href="configuration.html#stores">Stores</a> locations for Users, Auths and Sessions</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><a href="configuration.html#templates">Templates</a>: <strong>tpls</strong> to render requests responses</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><a href="pasetoken.html">Pasetoken</a>: <strong>paseto</strong> for token configurations</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><a href="configuration.html#ui">UI</a> where major user interface are defined:</p> |  | ||||||
| <ul> |  | ||||||
| <li> |  | ||||||
| <p><strong>Assets links</strong> for JS and CSS</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><strong>web_menu_items</strong> as items to show in top menu navigator</p> |  | ||||||
| </li> |  | ||||||
| </ul> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><a href="configuration.html#serv-paths">serv_paths</a>  where <a href="static_content.html">static content</a> path are defined as <strong>is_restricted</strong> and with allowed <a href="roles.html">roles</a></p> |  | ||||||
| </li> |  | ||||||
| </ul> |  | ||||||
| <h2 id="main"><a class="header" href="#main">Main</a></h2> |  | ||||||
| <p>On top of <strong>Configuration file</strong>:</p> |  | ||||||
| <ul> |  | ||||||
| <li> |  | ||||||
| <p><strong>root_path</strong> = “sitehome”, the most important as <u>root path</u>, other settings attibutes ending with <strong>_path</strong> can have relative path to this one or their own absolute or relative paths.</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><strong>name</strong> = “docserver” is a name for service</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><strong>org</strong> = “ORG” an organization name</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><strong>verbose</strong> = 2  some debug info in requests handling is shown with values over 0</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><strong>templates_path</strong> = “templates”, <a href="configuration.html#templates">templates</a> path</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><strong>assets_url</strong> = “/assets” assets path for <a href="configuration.html#templates">templates</a></p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><strong>allow_origin</strong> = [“http://localhost:8080”] allow origins for  <a href="https://developer.mozilla.org/es/docs/Web/HTTP/Headers/Access-Control-Allow-Origin">access control allow origin</a> webserver directive</p> |  | ||||||
| </li> |  | ||||||
| </ul> |  | ||||||
| <h2 id="https"><a class="header" href="#https">HTTPS</a></h2> |  | ||||||
| <p><a href="https://en.wikipedia.org/wiki/Transport_Layer_Security">TLS</a> certificates path can be provided in:</p> |  | ||||||
| <pre><code class="language-toml">cert_file = "cert/fullchain.pem" |  | ||||||
| key_file = "cert/privkey.pem" |  | ||||||
| </code></pre> |  | ||||||
| <p>To use <strong>HTTPS</strong> traffic set <strong>protocol</strong> to <strong>https</strong> rather than <strong>http</strong></p> |  | ||||||
| <pre><code class="language-toml">protocol = "https" |  | ||||||
| </code></pre> |  | ||||||
| <h2 id="signup"><a class="header" href="#signup">Signup</a></h2> |  | ||||||
| <p>It is about how new users will be created, there are two option:</p> |  | ||||||
| <ul> |  | ||||||
| <li> |  | ||||||
| <p><strong>Open</strong> by using a <strong>signup</strong> form with all details.</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><strong>invitation</strong> by <strong>adminitrators</strong>, new user would receive an <strong>invitation link</strong> (it would include some details like email, roles,etc) connected to a <a href="sesions.html">session</a> token with <strong>expiration time</strong> in seconds, this link can be sent by email if is set in config. By using an <strong>invitation link</strong> new user can fill a <strong>signup</strong> form with all details.</p> |  | ||||||
| </li> |  | ||||||
| </ul> |  | ||||||
| <pre><code class="language-toml">## How to signup by 'invitation' or 'open' |  | ||||||
| signup_mode = "invitation" |  | ||||||
| invite_expire = 900 # in seconds |  | ||||||
| </code></pre> |  | ||||||
| <h2 id="totp"><a class="header" href="#totp">TOTP</a></h2> |  | ||||||
| <p><a href="https://en.wikipedia.org/wiki/Time-based_one-time_password">TOPT</a> as <a href="https://en.wikipedia.org/wiki/Multi-factor_authentication">2FA</a> by default is set to <strong>no</strong>  but it can also be:</p> |  | ||||||
| <ul> |  | ||||||
| <li> |  | ||||||
| <p><strong>optional</strong> to users settings, so they can activate or deactivate in <strong>signup</strong> and <u>user settings</u> edition.</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><strong>mandatory</strong> means users have to configure in <strong>signup</strong> process.</p> |  | ||||||
| </li> |  | ||||||
| </ul> |  | ||||||
| <p><a href="https://en.wikipedia.org/wiki/Time-based_one-time_password">TOPT</a> can only be reset by <strong>user settings</strong>  or <strong>administrators</strong>  via <strong>user edition form</strong></p> |  | ||||||
| <pre><code class="language-toml"># topt Mode: mandatory, optional, no (default)   |  | ||||||
| totp_mode = "optional" |  | ||||||
| # totp Digits: 6 (default) or 8  |  | ||||||
| totp_digits = 6 |  | ||||||
| # topt Algorithm: sha1 (default), sha256, sha512 |  | ||||||
| totp_algorithm = "sha256" |  | ||||||
| </code></pre> |  | ||||||
| <h2 id="password-score"><a class="header" href="#password-score">Password score</a></h2> |  | ||||||
| <p><a href="./">Doc Server</a> use <a href="https://www.rust-lang.org">Rust</a> crate <a href="https://github.com/shssoichiro/zxcvbn-rs">zxcvbn</a> for password strength estimator, it can be enforced to a value:</p> |  | ||||||
| <pre><code class="language-toml">password_score = 3 |  | ||||||
| </code></pre> |  | ||||||
| <h2 id="admin-user-fields"><a class="header" href="#admin-user-fields">Admin user fields</a></h2> |  | ||||||
| <p><strong>admin_fields</strong> is a list of user fields or attributes to change only by <strong>administrators</strong>, user can only see their values.</p> |  | ||||||
| <pre><code class="language-toml">admin_fields = "roles,otp_base32,status" |  | ||||||
| </code></pre> |  | ||||||
| <h2 id="mail-service"><a class="header" href="#mail-service">Mail service</a></h2> |  | ||||||
| <p>It can be set as <strong>true</strong> or <strong>false</strong>, <strong>smtp_auth</strong> is token encrypted that can be generated by <strong>script</strong>  <strong>tools/get_mail_token.sh</strong> that runs <a href="./">Doc Server</a> program using credentials from <a href="pasetoken.html">paseto</a> section (<strong>public_path</strong> and <strong>secret_path</strong>), it can be included not encrypted but is highly not recomended.</p> |  | ||||||
| <blockquote> |  | ||||||
| <p>tools/get_mail_token.sh [mail_user] [mail_password] |  | ||||||
| Provides a token based in srcv pasetoken settings</p> |  | ||||||
| </blockquote> |  | ||||||
| <p>As an option enviroment variables MAIL_USER and MAIL_PASSWORD can also be set before to run <strong>tools/get_mail_token.sh</strong></p> |  | ||||||
| <pre><code class="language-toml">use_mail = true |  | ||||||
| smtp = "mail.example.com" |  | ||||||
| smtp_auth = "v4.public..." |  | ||||||
| mail_from ="admini@example.com" |  | ||||||
| </code></pre> |  | ||||||
| <h2 id="stores"><a class="header" href="#stores">Stores</a></h2> |  | ||||||
| <p><a href="users.html">Users</a> and <a href="sessions.html">Sessions</a> are stored in async <a href="https://github.com/launchbadge/sqlx">sqlx</a> to <a href="sqlite.html">Sqlite</a> or <a href="file_storage.html">File</a> storages, for larger use <a href="https://github.com/launchbadge/sqlx">sqlx</a> as <u>Database Agnostic</u> provides other <a href="https://en.wikipedia.org/wiki/SQL">SQL</a> options</p> |  | ||||||
| <blockquote> |  | ||||||
| <p>Prefix <strong>sqlite::</strong> is for <a href="https://www.sqlite.org/index.html">SQLite</a> storage, usually a file ends with <strong>.db</strong> suffix.</p> |  | ||||||
| </blockquote> |  | ||||||
| <pre><code class="language-toml">users_store_uri = "sqlite:PATH_TO_users.db" |  | ||||||
| session_store_uri = "sqlite:PATH_TO_sessions.db" |  | ||||||
| session_expire = 300 |  | ||||||
| </code></pre> |  | ||||||
| <blockquote> |  | ||||||
| <p>Prefix <strong>file:///</strong> if for <strong>FILE</strong> storage, value should be a directory. <strong>session_store_file</strong> value will be final file prefix follow by <a href="https://en.wikipedia.org/wiki/Timestamp">timestamp</a> autogenerated value.</p> |  | ||||||
| </blockquote> |  | ||||||
| <pre><code class="language-toml">users_store_uri = "file:///PATH_TO_users_DIRECTORY" |  | ||||||
| session_store_uri = "file:///PATH_TO_sessions_DIRECTORY" |  | ||||||
| session_store_file = "session" |  | ||||||
| session_expire = 300 |  | ||||||
| </code></pre> |  | ||||||
| <blockquote> |  | ||||||
| <p><strong>session_expire</strong> is a value in seconds for a session to expire ir is not used, with each request expire session is extended for same value.</p> |  | ||||||
| </blockquote> |  | ||||||
| <h2 id="policies"><a class="header" href="#policies">Policies</a></h2> |  | ||||||
| <p><a href="policies.html">Access policies</a> to be <strong>enfoced</strong> for content access with <a href="https://github.com/casbin/casbin-rs">Casbin</a> require two file path:</p> |  | ||||||
| <pre><code class="language-toml">authz_model_path = "PATH_TO_model.conf" |  | ||||||
| authz_policy_path = "PATH_TO_policy.csv" |  | ||||||
| </code></pre> |  | ||||||
| <h2 id="templates"><a class="header" href="#templates">Templates</a></h2> |  | ||||||
| <p><a href="https://tera.netlify.app/">Tera template engine</a> is used to to render response requests. Most of templates are <strong>HTML</strong> and in many cases use to include others from <strong>partials</strong> directory. Pre-render process is in charge of values setting.</p> |  | ||||||
| <p>Templates suffixes indicate if is <strong>html</strong> or <strong>txt</strong> and ends with <strong>j2</strong> as standard extension for <a href="https://jinja.palletsprojects.com/en/3.1.x/">jinja2</a> templating engine.</p> |  | ||||||
| <p>Default <strong>templates_path</strong> = “templates” directory layout:</p> |  | ||||||
| <pre><code class="language-text">├── home.html.j2 |  | ||||||
| ├── invite_create.html.j2 |  | ||||||
| ├── invite_mail.html.j2 |  | ||||||
| ├── invite_mail.txt.j2 |  | ||||||
| ├── invite_output.html.j2 |  | ||||||
| ├── login.html.j2 |  | ||||||
| ├── logout.html.j2 |  | ||||||
| ├── pages |  | ||||||
| │   └── terms-conditions.html.j2 |  | ||||||
| ├── partials |  | ||||||
| │   ├── footer.html.j2 |  | ||||||
| │   ├── form-password.html.j2 |  | ||||||
| │   ├── form-totp.html.j2 |  | ||||||
| │   ├── form-user.html.j2 |  | ||||||
| │   ├── header.html.j2 |  | ||||||
| │   ├── loading.html.j2 |  | ||||||
| │   ├── mini_navbar.html.j2 |  | ||||||
| │   ├── modal_edit_user.html.j2 |  | ||||||
| │   ├── _navbar.html.j2 |  | ||||||
| │   ├── navbar.html.j2 |  | ||||||
| │   └── symbols.html.j2 |  | ||||||
| ├── signup.html.j2 |  | ||||||
| ├── user_settings.html.j2 |  | ||||||
| └── users.html.j2 |  | ||||||
| </code></pre> |  | ||||||
| <p>Current templates use <a href="https://unocss.dev/">UnoCSS</a> as CSS engine (compatible with <a href="https://tailwindcss.com/">Tailwindcss</a>) and <a href="https://flowbite.com/docs/getting-started/introduction/">FLowbyte</a> as CSS and JS component library, so they are added from <a href="configuration.html#ui">UI</a> configuration values</p> |  | ||||||
| <pre><code class="language-toml">[ui] |  | ||||||
| css_link = "https://cdn.jsdelivr.net/npm/@unocss/reset/tailwind.min.css" |  | ||||||
| js_link = "https://cdn.jsdelivr.net/npm/@unocss/runtime" |  | ||||||
| other_css_link = "https://cdnjs.cloudflare.com/ajax/libs/flowbite/1.6.5/flowbite.min.css" |  | ||||||
| other_js_link="https://cdnjs.cloudflare.com/ajax/libs/flowbite/1.6.5/flowbite.min.js" |  | ||||||
| </code></pre> |  | ||||||
| <p>Other <strong>JS</strong> values are used for basic tasks in page interaction:</p> |  | ||||||
| <pre><code class="language-toml">[ui] |  | ||||||
| main_js_link = "/assets/js/main.js" |  | ||||||
| utils_js_link = "/assets/js/utils.js" |  | ||||||
| </code></pre> |  | ||||||
| <p>A <strong>main.css</strong> is used for customized <strong>CSS</strong>, is loaded in <strong>partials/header.html.j2</strong> template as (pay attention to <strong>asserts_url</strong>):</p> |  | ||||||
| <pre><code class="language-python">/css/main.css |  | ||||||
| </code></pre> |  | ||||||
| <p>Values under <strong>[tpls]</strong>  section are mapped values for <strong>template filename</strong> used in <a href="./">Doc Server</a> request handlers to render a response, so basically filenames in <strong>templates_path</strong> value directory.</p> |  | ||||||
| <h2 id="ui"><a class="header" href="#ui">UI</a></h2> |  | ||||||
| <p>Contains values for <a href="/configuration.html#templates">templates</a> render for <strong>assets</strong> files: <strong>js</strong>, <strong>css</strong>.</p> |  | ||||||
| <p>Each <strong>web_menu_items</strong> entry set values (<strong>text</strong>, <strong>url</strong>, <strong>roles</strong>) for each <strong>navigation menu</strong> template used in pages.</p> |  | ||||||
| <h2 id="serv-paths"><a class="header" href="#serv-paths">Serv Paths</a></h2> |  | ||||||
| <p>An entry for each <a href="static_content.html">static_content</a> like in example bellow</p> |  | ||||||
| <p>Example:</p> |  | ||||||
| <pre><code class="language-toml">[[serve_paths]] |  | ||||||
| # Server relative Directory Path (sitehome/appdoc) |  | ||||||
| srv_path = "Server DIRECTORY_PATH" |  | ||||||
| # Absolute URL path for resquests |  | ||||||
| url_path = "/appdoc" |  | ||||||
| # Not found URL to be redirect  |  | ||||||
| not_found = "" |  | ||||||
| # URL to be redirect if is not authorization found |  | ||||||
| not_auth = "/login" |  | ||||||
| # true or false to access control or not to this PATH |  | ||||||
| is_restricted = true |  | ||||||
| </code></pre> |  | ||||||
| <blockquote> |  | ||||||
| <p>Access <a href="%7B%7D">policies</a> for <strong>serve_path.url_path</strong>  should be in <strong>authz_policy_path</strong> file</p> |  | ||||||
| </blockquote> |  | ||||||
| <div style="break-before: page; page-break-before: always;"></div><h1 id="config-settings"><a class="header" href="#config-settings">Config settings</a></h1> |  | ||||||
| <p>This is an example of <a href="/connfiguration.html">configuration file</a></p> |  | ||||||
| <p>Most of settings have default values to “/”  for paths or “” for text or false for boolean, if are not set properly <a href="./">Doc Server</a> config loadd will dispplay ain error an will not abort running.</p> |  | ||||||
| <p>Attributes order does not matter, in case of file path attributes relative path (the ones ending with path“) is tried and finally <strong>root_path</strong> valued as root path for values. Pay attention to <strong>cert</strong> and <strong>key</strong> paths</p> |  | ||||||
| <p>Base layout for example below as <strong>config.toml</strong>:</p> |  | ||||||
| <pre><code class="language-text">── Cargo.lock |  | ||||||
| ├── Cargo.toml |  | ||||||
| ├── certs  |  | ||||||
| │   ├── fullchain.pem |  | ||||||
| │   └── privkey.pem |  | ||||||
| ├── config.toml |  | ||||||
| ├── data |  | ||||||
| │   ├── users.db |  | ||||||
| │   └── sessions.db |  | ||||||
| ├── mdbook |  | ||||||
| ├── migrations |  | ||||||
| │   ├── users.sql |  | ||||||
| │   └── view.sql |  | ||||||
| ├── sitehome |  | ||||||
| │   ├── assets |  | ||||||
| │   ├── appdoc |  | ||||||
| │   ├── html |  | ||||||
| │   └── templates |  | ||||||
| ├── src |  | ||||||
| ├── paseto |  | ||||||
| │   ├── public.ky |  | ||||||
| │   └── secret.ky |  | ||||||
| └── tools |  | ||||||
|     └── get_mail_token.sh |  | ||||||
| </code></pre> |  | ||||||
| <pre><code class="language-toml">root_path = "sitehome" |  | ||||||
| name = "docserver" |  | ||||||
| org = "ORG" |  | ||||||
| verbose = 2 |  | ||||||
| home_path = "" |  | ||||||
| prefix = "" |  | ||||||
| resources_path = "resources" |  | ||||||
| 
 |  | ||||||
| # Certs for SSL  |  | ||||||
| cert_file = "certs/fullchain.pem" |  | ||||||
| key_file = "certs/privkey.pem" |  | ||||||
| 
 |  | ||||||
| templates_path = "templates" |  | ||||||
| defaults_path = "resources/defaults" |  | ||||||
| 
 |  | ||||||
| html_url = "/html" |  | ||||||
| assets_url = "/assets" |  | ||||||
| 
 |  | ||||||
| allow_origin = ["http://localhost:8080"] |  | ||||||
| 
 |  | ||||||
| # HOST ip or name for Web service |  | ||||||
| hostport = "docs.example.com:8800" |  | ||||||
| bnd = "0.0.0.0" |  | ||||||
| 
 |  | ||||||
| # PORT for Web service |  | ||||||
| port = 8800 |  | ||||||
| protocol = "http" |  | ||||||
| 
 |  | ||||||
| # Availables Langs |  | ||||||
| langs = ["en","es"] |  | ||||||
| dflt_lang = "en" |  | ||||||
| 
 |  | ||||||
| ## How to signup by 'invitation' or 'open' |  | ||||||
| signup_mode = "open" |  | ||||||
| invite_expire = 900 # in seconds |  | ||||||
| 
 |  | ||||||
| # topt Mode: mandatory, optional, no (default)   |  | ||||||
| totp_mode = "no" |  | ||||||
| # totp Digits: 6 (default) or 8  |  | ||||||
| totp_digits = 6 |  | ||||||
| # topt Algorithm: sha1 (default), sha256, sha512 |  | ||||||
| totp_algorithm = "sha256" |  | ||||||
| 
 |  | ||||||
| password_score = 3 |  | ||||||
| admin_fields = "roles,otp_base32,status" |  | ||||||
| 
 |  | ||||||
| use_mail = false |  | ||||||
| smtp = "mail.example.com" |  | ||||||
| smtp_auth = "v4.public..." |  | ||||||
| mail_from ="admini@example.com" |  | ||||||
| 
 |  | ||||||
| #users_store_uri = "file:///data/users" |  | ||||||
| users_store_uri = "sqlite:data/users.db" |  | ||||||
| user_store_access = "access" |  | ||||||
| authz_model_path = "srvc/model.conf" |  | ||||||
| authz_policy_path = "srvc/policy.csv" |  | ||||||
| #session_store_uri = "file:///data/sessions" |  | ||||||
| session_store_uri = "sqlite:data/sessions.db" |  | ||||||
| session_store_file = "session" |  | ||||||
| session_expire = 300 |  | ||||||
| 
 |  | ||||||
| [tpls] |  | ||||||
|   url = "http://docs.example.com/" |  | ||||||
|   main = "home.html.j2" |  | ||||||
|   info = "info.html.j2" |  | ||||||
|   help = "help.html.j2" |  | ||||||
|   notfound = "notfound.html.j2" |  | ||||||
|   notauth = "notauth.html.j2" |  | ||||||
|   login = "login.html.j2" |  | ||||||
|   logout = "logout.html.j2" |  | ||||||
|   signup = "signup.html.j2" |  | ||||||
|   user_settings = "user_settings.html.j2" |  | ||||||
|   invite_create = "invite_create.html.j2" |  | ||||||
|   invite_output = "invite_output.html.j2" |  | ||||||
|   invite_mail_html = "invite_mail.html.j2" |  | ||||||
|   invite_maili_txt = "invite_mail.txt.j2" |  | ||||||
|   users = "users.html.j2" |  | ||||||
|   trylater = "trylater.j2" |  | ||||||
|   session  = "session.j2" |  | ||||||
|   js = "js" |  | ||||||
|   css = "" |  | ||||||
| 
 |  | ||||||
| [paseto]  |  | ||||||
|   public_path = "paseto/public.ky" |  | ||||||
|   secret_path = "paseto/secret.ky" |  | ||||||
|   is_bin = false |  | ||||||
|   assert_val = "" |  | ||||||
|   expire = true |  | ||||||
| [paseto.map_footer] |  | ||||||
| [paseto.data] |  | ||||||
| 
 |  | ||||||
| [ui] |  | ||||||
| css_link = "https://cdn.jsdelivr.net/npm/@unocss/reset/tailwind.min.css" |  | ||||||
| js_link = "https://cdn.jsdelivr.net/npm/@unocss/runtime" |  | ||||||
| main_js_link = "/assets/js/main.js" |  | ||||||
| utils_js_link = "/assets/js/utils.js" |  | ||||||
| other_css_link = "https://cdnjs.cloudflare.com/ajax/libs/flowbite/1.6.5/flowbite.min.css" |  | ||||||
| other_js_link="https://cdnjs.cloudflare.com/ajax/libs/flowbite/1.6.5/flowbite.min.js" |  | ||||||
| 
 |  | ||||||
| [[ui.web_menu_items]] |  | ||||||
| # ~home text part will be removed, it is to indicate it is a home link |  | ||||||
| text = "~home" |  | ||||||
| url = "/" |  | ||||||
| roles = [] |  | ||||||
| 
 |  | ||||||
| [[ui.web_menu_items]] |  | ||||||
| text = "AppDoc" |  | ||||||
| url = "/appdoc" |  | ||||||
| roles = ["dev"] |  | ||||||
| 
 |  | ||||||
| [[ui.web_menu_items]] |  | ||||||
| text = "Users" |  | ||||||
| url = "/users" |  | ||||||
| roles = ["admin"] |  | ||||||
| 
 |  | ||||||
| [[serv_paths]] |  | ||||||
| src_path = "appdoc" |  | ||||||
| url_path = "/appdoc" |  | ||||||
| not_found = "" |  | ||||||
| roles = "dev" |  | ||||||
| redirect_to = "/login" |  | ||||||
| not_auth = "/login" |  | ||||||
| is_restricted = true |  | ||||||
| </code></pre> |  | ||||||
| 
 |  | ||||||
|                     </main> |  | ||||||
| 
 |  | ||||||
|                     <nav class="nav-wrapper" aria-label="Page navigation"> |  | ||||||
|                         <!-- Mobile navigation buttons --> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|                         <div style="clear: both"></div> |  | ||||||
|                     </nav> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
| 
 |  | ||||||
|             <nav class="nav-wide-wrapper" aria-label="Page navigation"> |  | ||||||
| 
 |  | ||||||
|             </nav> |  | ||||||
| 
 |  | ||||||
|         </div> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <script> |  | ||||||
|             window.playground_copyable = true; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <script src="ace.js"></script> |  | ||||||
|         <script src="editor.js"></script> |  | ||||||
|         <script src="mode-rust.js"></script> |  | ||||||
|         <script src="theme-dawn.js"></script> |  | ||||||
|         <script src="theme-tomorrow_night.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="elasticlunr.min.js"></script> |  | ||||||
|         <script src="mark.min.js"></script> |  | ||||||
|         <script src="searcher.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="clipboard.min.js"></script> |  | ||||||
|         <script src="highlight.js"></script> |  | ||||||
|         <script src="book.js"></script> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom JS scripts --> |  | ||||||
| 
 |  | ||||||
|         <script> |  | ||||||
|         window.addEventListener('load', function() { |  | ||||||
|             window.setTimeout(window.print, 100); |  | ||||||
|         }); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|     </div> |  | ||||||
|     </body> |  | ||||||
| </html> |  | ||||||
| @ -1,212 +0,0 @@ | |||||||
| <!DOCTYPE HTML> |  | ||||||
| <html lang="en" class="sidebar-visible no-js light"> |  | ||||||
|     <head> |  | ||||||
|         <!-- Book generated using mdBook --> |  | ||||||
|         <meta charset="UTF-8"> |  | ||||||
|         <title>Protect access - Doc Server</title> |  | ||||||
|         <base href="/docserver/"> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <!-- Custom HTML head --> |  | ||||||
|          |  | ||||||
|         <meta name="description" content="Doc Server"> |  | ||||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> |  | ||||||
|         <meta name="theme-color" content="#ffffff" /> |  | ||||||
| 
 |  | ||||||
|         <link rel="icon" href="/docserver/favicon.svg"> |  | ||||||
|         <link rel="shortcut icon" href="/docserver/favicon.png"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/variables.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/general.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/chrome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/print.css" media="print"> |  | ||||||
| 
 |  | ||||||
|         <!-- Fonts --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/FontAwesome/css/font-awesome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/fonts/fonts.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Highlight.js Stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/highlight.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/tomorrow-night.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/ayu-highlight.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom theme stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/custom.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/mdbook-admonish.css"> |  | ||||||
| 
 |  | ||||||
|     </head> |  | ||||||
|     <body> |  | ||||||
|     <div id="body-container"> |  | ||||||
|         <!-- Provide site root to javascript --> |  | ||||||
|         <script> |  | ||||||
|             var path_to_root = "/docserver/"; |  | ||||||
|             var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light"; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Work around some values being stored in localStorage wrapped in quotes --> |  | ||||||
|         <script> |  | ||||||
|             try { |  | ||||||
|                 var theme = localStorage.getItem('mdbook-theme'); |  | ||||||
|                 var sidebar = localStorage.getItem('mdbook-sidebar'); |  | ||||||
| 
 |  | ||||||
|                 if (theme.startsWith('"') && theme.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (sidebar.startsWith('"') && sidebar.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); |  | ||||||
|                 } |  | ||||||
|             } catch (e) { } |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Set the theme before any content is loaded, prevents flash --> |  | ||||||
|         <script> |  | ||||||
|             var theme; |  | ||||||
|             try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } |  | ||||||
|             if (theme === null || theme === undefined) { theme = default_theme; } |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             html.classList.remove('no-js') |  | ||||||
|             html.classList.remove('light') |  | ||||||
|             html.classList.add(theme); |  | ||||||
|             html.classList.add('js'); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Hide / unhide sidebar before it is displayed --> |  | ||||||
|         <script> |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             var sidebar = null; |  | ||||||
|             if (document.body.clientWidth >= 1080) { |  | ||||||
|                 try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } |  | ||||||
|                 sidebar = sidebar || 'visible'; |  | ||||||
|             } else { |  | ||||||
|                 sidebar = 'hidden'; |  | ||||||
|             } |  | ||||||
|             html.classList.remove('sidebar-visible'); |  | ||||||
|             html.classList.add("sidebar-" + sidebar); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <nav id="sidebar" class="sidebar" aria-label="Table of contents"> |  | ||||||
|             <div class="sidebar-scrollbox"> |  | ||||||
|                 <ol class="chapter"><li class="chapter-item "><a href="/docserver/introduction.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li class="chapter-item "><a href="/docserver/index.html"><strong aria-hidden="true">2.</strong> What is this ?</a></li><li class="chapter-item "><a href="/docserver/features.html"><strong aria-hidden="true">3.</strong> Features</a></li><li class="chapter-item "><a href="/docserver/howto.html"><strong aria-hidden="true">4.</strong> How to</a></li><li class="chapter-item "><a href="/docserver/quick-start.html"><strong aria-hidden="true">5.</strong> Quick Start</a></li><li class="spacer"></li><li class="chapter-item affix "><li class="part-title">Server and Content</li><li class="chapter-item "><a href="/docserver/one_server.html"><strong aria-hidden="true">6.</strong> One web server instance</a></li><li class="chapter-item "><a href="/docserver/server_modes.html"><strong aria-hidden="true">7.</strong> Server modes</a></li><li class="chapter-item "><a href="/docserver/static_content.html"><strong aria-hidden="true">8.</strong> Static contents</a></li><li class="chapter-item "><a href="/docserver/url_path.html"><strong aria-hidden="true">9.</strong> url_path prefix</a></li><li class="chapter-item expanded "><a href="/docserver/protect_access.html" class="active"><strong aria-hidden="true">10.</strong> Protect access</a></li><li class="chapter-item affix "><li class="part-title">Users and Policies</li><li class="chapter-item "><a href="/docserver/users.html"><strong aria-hidden="true">11.</strong> Users</a></li><li class="chapter-item "><a href="/docserver/users_sql.html"><strong aria-hidden="true">12.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/users_file_storage.html"><strong aria-hidden="true">13.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/roles.html"><strong aria-hidden="true">14.</strong> Roles</a></li><li class="chapter-item "><a href="/docserver/auths.html"><strong aria-hidden="true">15.</strong> Users auths</a></li><li class="chapter-item "><a href="/docserver/policies.html"><strong aria-hidden="true">16.</strong> Access policies</a></li><li class="chapter-item "><a href="/docserver/adminusers.html"><strong aria-hidden="true">17.</strong> Users Admin</a></li><li class="chapter-item affix "><li class="part-title">Sessions</li><li class="chapter-item "><a href="/docserver/sessions.html"><strong aria-hidden="true">18.</strong> Session data</a></li><li class="chapter-item "><a href="/docserver/pasetoken.html"><strong aria-hidden="true">19.</strong> Pasetoken</a></li><li class="chapter-item "><a href="/docserver/sessions_sql.html"><strong aria-hidden="true">20.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/sessions_file_storage.html"><strong aria-hidden="true">21.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/cookie.html"><strong aria-hidden="true">22.</strong> Cookie set</a></li><li class="chapter-item affix "><li class="part-title">Logs and Trace</li><li class="chapter-item "><a href="/docserver/trace.html"><strong aria-hidden="true">23.</strong> Traced</a></li><li class="chapter-item "><a href="/docserver/logs.html"><strong aria-hidden="true">24.</strong> Sessions logs</a></li><li class="chapter-item affix "><li class="part-title">Configuration</li><li class="chapter-item "><a href="/docserver/configuration.html"><strong aria-hidden="true">25.</strong> Configurable service</a></li><li class="chapter-item "><a href="/docserver/settings.html"><strong aria-hidden="true">26.</strong> Config settings</a></li><li class="spacer"></li></ol> |  | ||||||
|             </div> |  | ||||||
|             <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> |  | ||||||
|         </nav> |  | ||||||
| 
 |  | ||||||
|         <div id="page-wrapper" class="page-wrapper"> |  | ||||||
| 
 |  | ||||||
|             <div class="page"> |  | ||||||
|                                 <div id="menu-bar-hover-placeholder"></div> |  | ||||||
|                 <div id="menu-bar" class="menu-bar sticky bordered"> |  | ||||||
|                     <div class="left-buttons"> |  | ||||||
|                         <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> |  | ||||||
|                             <i class="fa fa-bars"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="sidebar-toggle" onclick="location.href='/'" class="icon-button" type="button" title="Home" aria-label="Home" aria-controls=""> |  | ||||||
|                             <i class="fa fa-home"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> |  | ||||||
|                             <i class="fa fa-paint-brush"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> |  | ||||||
|                         </ul> |  | ||||||
|                         <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> |  | ||||||
|                             <i class="fa fa-search"></i> |  | ||||||
|                         </button> |  | ||||||
|                     </div> |  | ||||||
| 
 |  | ||||||
|                     <h1 class="menu-title">Doc Server</h1> |  | ||||||
| 
 |  | ||||||
|                     <div class="right-buttons"> |  | ||||||
|                         <a href="/docserver/print.html" title="Print this book" aria-label="Print this book"> |  | ||||||
|                             <i id="print-button" class="fa fa-print"></i> |  | ||||||
|                         </a> |  | ||||||
|                         <a href="/logout" title="Sing out" aria-label="Sign out"> |  | ||||||
|                             <i id="logout-button" class="fa fa-sign-out"></i> |  | ||||||
|                         </a> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div id="search-wrapper" class="hidden"> |  | ||||||
|                     <form id="searchbar-outer" class="searchbar-outer"> |  | ||||||
|                         <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> |  | ||||||
|                     </form> |  | ||||||
|                     <div id="searchresults-outer" class="searchresults-outer hidden"> |  | ||||||
|                         <div id="searchresults-header" class="searchresults-header"></div> |  | ||||||
|                         <ul id="searchresults"> |  | ||||||
|                         </ul> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> |  | ||||||
|                 <script> |  | ||||||
|                     document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); |  | ||||||
|                     document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); |  | ||||||
|                     Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { |  | ||||||
|                         link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); |  | ||||||
|                     }); |  | ||||||
|                 </script> |  | ||||||
| 
 |  | ||||||
|                 <div id="content" class="content"> |  | ||||||
|                     <main> |  | ||||||
|                         <h1 id="protect-access"><a class="header" href="#protect-access">Protect access</a></h1> |  | ||||||
| 
 |  | ||||||
|                     </main> |  | ||||||
| 
 |  | ||||||
|                     <nav class="nav-wrapper" aria-label="Page navigation"> |  | ||||||
|                         <!-- Mobile navigation buttons --> |  | ||||||
|                             <a rel="prev" href="url_path.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                                 <i class="fa fa-angle-left"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                             <a rel="next" href="users.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                                 <i class="fa fa-angle-right"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                         <div style="clear: both"></div> |  | ||||||
|                     </nav> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
| 
 |  | ||||||
|             <nav class="nav-wide-wrapper" aria-label="Page navigation"> |  | ||||||
|                     <a rel="prev" href="url_path.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                         <i class="fa fa-angle-left"></i> |  | ||||||
|                     </a> |  | ||||||
| 
 |  | ||||||
|                     <a rel="next" href="users.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                         <i class="fa fa-angle-right"></i> |  | ||||||
|                     </a> |  | ||||||
|             </nav> |  | ||||||
| 
 |  | ||||||
|         </div> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <script> |  | ||||||
|             window.playground_copyable = true; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/ace.js"></script> |  | ||||||
|         <script src="/docserver/editor.js"></script> |  | ||||||
|         <script src="/docserver/mode-rust.js"></script> |  | ||||||
|         <script src="/docserver/theme-dawn.js"></script> |  | ||||||
|         <script src="/docserver/theme-tomorrow_night.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/elasticlunr.min.js"></script> |  | ||||||
|         <script src="/docserver/mark.min.js"></script> |  | ||||||
|         <script src="/docserver/searcher.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/clipboard.min.js"></script> |  | ||||||
|         <script src="/docserver/highlight.js"></script> |  | ||||||
|         <script src="/docserver/book.js"></script> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom JS scripts --> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     </div> |  | ||||||
|     </body> |  | ||||||
| </html> |  | ||||||
| @ -1,304 +0,0 @@ | |||||||
| <!DOCTYPE HTML> |  | ||||||
| <html lang="en" class="sidebar-visible no-js light"> |  | ||||||
|     <head> |  | ||||||
|         <!-- Book generated using mdBook --> |  | ||||||
|         <meta charset="UTF-8"> |  | ||||||
|         <title>Quick Start - Doc Server</title> |  | ||||||
|         <base href="/docserver/"> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <!-- Custom HTML head --> |  | ||||||
|          |  | ||||||
|         <meta name="description" content="Doc Server"> |  | ||||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> |  | ||||||
|         <meta name="theme-color" content="#ffffff" /> |  | ||||||
| 
 |  | ||||||
|         <link rel="icon" href="/docserver/favicon.svg"> |  | ||||||
|         <link rel="shortcut icon" href="/docserver/favicon.png"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/variables.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/general.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/chrome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/print.css" media="print"> |  | ||||||
| 
 |  | ||||||
|         <!-- Fonts --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/FontAwesome/css/font-awesome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/fonts/fonts.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Highlight.js Stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/highlight.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/tomorrow-night.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/ayu-highlight.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom theme stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/custom.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/mdbook-admonish.css"> |  | ||||||
| 
 |  | ||||||
|     </head> |  | ||||||
|     <body> |  | ||||||
|     <div id="body-container"> |  | ||||||
|         <!-- Provide site root to javascript --> |  | ||||||
|         <script> |  | ||||||
|             var path_to_root = "/docserver/"; |  | ||||||
|             var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light"; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Work around some values being stored in localStorage wrapped in quotes --> |  | ||||||
|         <script> |  | ||||||
|             try { |  | ||||||
|                 var theme = localStorage.getItem('mdbook-theme'); |  | ||||||
|                 var sidebar = localStorage.getItem('mdbook-sidebar'); |  | ||||||
| 
 |  | ||||||
|                 if (theme.startsWith('"') && theme.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (sidebar.startsWith('"') && sidebar.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); |  | ||||||
|                 } |  | ||||||
|             } catch (e) { } |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Set the theme before any content is loaded, prevents flash --> |  | ||||||
|         <script> |  | ||||||
|             var theme; |  | ||||||
|             try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } |  | ||||||
|             if (theme === null || theme === undefined) { theme = default_theme; } |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             html.classList.remove('no-js') |  | ||||||
|             html.classList.remove('light') |  | ||||||
|             html.classList.add(theme); |  | ||||||
|             html.classList.add('js'); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Hide / unhide sidebar before it is displayed --> |  | ||||||
|         <script> |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             var sidebar = null; |  | ||||||
|             if (document.body.clientWidth >= 1080) { |  | ||||||
|                 try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } |  | ||||||
|                 sidebar = sidebar || 'visible'; |  | ||||||
|             } else { |  | ||||||
|                 sidebar = 'hidden'; |  | ||||||
|             } |  | ||||||
|             html.classList.remove('sidebar-visible'); |  | ||||||
|             html.classList.add("sidebar-" + sidebar); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <nav id="sidebar" class="sidebar" aria-label="Table of contents"> |  | ||||||
|             <div class="sidebar-scrollbox"> |  | ||||||
|                 <ol class="chapter"><li class="chapter-item "><a href="/docserver/introduction.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li class="chapter-item "><a href="/docserver/index.html"><strong aria-hidden="true">2.</strong> What is this ?</a></li><li class="chapter-item "><a href="/docserver/features.html"><strong aria-hidden="true">3.</strong> Features</a></li><li class="chapter-item "><a href="/docserver/howto.html"><strong aria-hidden="true">4.</strong> How to</a></li><li class="chapter-item expanded "><a href="/docserver/quick-start.html" class="active"><strong aria-hidden="true">5.</strong> Quick Start</a></li><li class="spacer"></li><li class="chapter-item affix "><li class="part-title">Server and Content</li><li class="chapter-item "><a href="/docserver/one_server.html"><strong aria-hidden="true">6.</strong> One web server instance</a></li><li class="chapter-item "><a href="/docserver/server_modes.html"><strong aria-hidden="true">7.</strong> Server modes</a></li><li class="chapter-item "><a href="/docserver/static_content.html"><strong aria-hidden="true">8.</strong> Static contents</a></li><li class="chapter-item "><a href="/docserver/url_path.html"><strong aria-hidden="true">9.</strong> url_path prefix</a></li><li class="chapter-item "><a href="/docserver/protect_access.html"><strong aria-hidden="true">10.</strong> Protect access</a></li><li class="chapter-item affix "><li class="part-title">Users and Policies</li><li class="chapter-item "><a href="/docserver/users.html"><strong aria-hidden="true">11.</strong> Users</a></li><li class="chapter-item "><a href="/docserver/users_sql.html"><strong aria-hidden="true">12.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/users_file_storage.html"><strong aria-hidden="true">13.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/roles.html"><strong aria-hidden="true">14.</strong> Roles</a></li><li class="chapter-item "><a href="/docserver/auths.html"><strong aria-hidden="true">15.</strong> Users auths</a></li><li class="chapter-item "><a href="/docserver/policies.html"><strong aria-hidden="true">16.</strong> Access policies</a></li><li class="chapter-item "><a href="/docserver/adminusers.html"><strong aria-hidden="true">17.</strong> Users Admin</a></li><li class="chapter-item affix "><li class="part-title">Sessions</li><li class="chapter-item "><a href="/docserver/sessions.html"><strong aria-hidden="true">18.</strong> Session data</a></li><li class="chapter-item "><a href="/docserver/pasetoken.html"><strong aria-hidden="true">19.</strong> Pasetoken</a></li><li class="chapter-item "><a href="/docserver/sessions_sql.html"><strong aria-hidden="true">20.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/sessions_file_storage.html"><strong aria-hidden="true">21.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/cookie.html"><strong aria-hidden="true">22.</strong> Cookie set</a></li><li class="chapter-item affix "><li class="part-title">Logs and Trace</li><li class="chapter-item "><a href="/docserver/trace.html"><strong aria-hidden="true">23.</strong> Traced</a></li><li class="chapter-item "><a href="/docserver/logs.html"><strong aria-hidden="true">24.</strong> Sessions logs</a></li><li class="chapter-item affix "><li class="part-title">Configuration</li><li class="chapter-item "><a href="/docserver/configuration.html"><strong aria-hidden="true">25.</strong> Configurable service</a></li><li class="chapter-item "><a href="/docserver/settings.html"><strong aria-hidden="true">26.</strong> Config settings</a></li><li class="spacer"></li></ol> |  | ||||||
|             </div> |  | ||||||
|             <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> |  | ||||||
|         </nav> |  | ||||||
| 
 |  | ||||||
|         <div id="page-wrapper" class="page-wrapper"> |  | ||||||
| 
 |  | ||||||
|             <div class="page"> |  | ||||||
|                                 <div id="menu-bar-hover-placeholder"></div> |  | ||||||
|                 <div id="menu-bar" class="menu-bar sticky bordered"> |  | ||||||
|                     <div class="left-buttons"> |  | ||||||
|                         <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> |  | ||||||
|                             <i class="fa fa-bars"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="sidebar-toggle" onclick="location.href='/'" class="icon-button" type="button" title="Home" aria-label="Home" aria-controls=""> |  | ||||||
|                             <i class="fa fa-home"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> |  | ||||||
|                             <i class="fa fa-paint-brush"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> |  | ||||||
|                         </ul> |  | ||||||
|                         <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> |  | ||||||
|                             <i class="fa fa-search"></i> |  | ||||||
|                         </button> |  | ||||||
|                     </div> |  | ||||||
| 
 |  | ||||||
|                     <h1 class="menu-title">Doc Server</h1> |  | ||||||
| 
 |  | ||||||
|                     <div class="right-buttons"> |  | ||||||
|                         <a href="/docserver/print.html" title="Print this book" aria-label="Print this book"> |  | ||||||
|                             <i id="print-button" class="fa fa-print"></i> |  | ||||||
|                         </a> |  | ||||||
|                         <a href="/logout" title="Sing out" aria-label="Sign out"> |  | ||||||
|                             <i id="logout-button" class="fa fa-sign-out"></i> |  | ||||||
|                         </a> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div id="search-wrapper" class="hidden"> |  | ||||||
|                     <form id="searchbar-outer" class="searchbar-outer"> |  | ||||||
|                         <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> |  | ||||||
|                     </form> |  | ||||||
|                     <div id="searchresults-outer" class="searchresults-outer hidden"> |  | ||||||
|                         <div id="searchresults-header" class="searchresults-header"></div> |  | ||||||
|                         <ul id="searchresults"> |  | ||||||
|                         </ul> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> |  | ||||||
|                 <script> |  | ||||||
|                     document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); |  | ||||||
|                     document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); |  | ||||||
|                     Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { |  | ||||||
|                         link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); |  | ||||||
|                     }); |  | ||||||
|                 </script> |  | ||||||
| 
 |  | ||||||
|                 <div id="content" class="content"> |  | ||||||
|                     <main> |  | ||||||
|                         <h1 id="quick-start"><a class="header" href="#quick-start">Quick Start</a></h1> |  | ||||||
| <ol> |  | ||||||
| <li> |  | ||||||
| <p>Set <a href="/configuration.html#main">Main</a> values: <strong>root_path</strong>, <strong>templates_path</strong>, <strong>assets_url</strong>.</p> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>To enable <a href="/configuration.html#signup">Signup</a>:</p> |  | ||||||
| <ul> |  | ||||||
| <li>In <strong>open</strong> mode: set <strong>signup_mode = “open”</strong></li> |  | ||||||
| <li>In <strong>invitation</strong> mode: <strong>signup_mode = “invitation”</strong> (if is necessary fix <strong>invite_expire</strong> seconds)</li> |  | ||||||
| </ul> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>To use <a href="/configuration.html#https">HTTPS</a>:</p> |  | ||||||
| <ul> |  | ||||||
| <li>Set paths for <strong>cert_file</strong> and <strong>key_file</strong></li> |  | ||||||
| <li>Set <strong>protocol = “https”</strong></li> |  | ||||||
| </ul> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>To use <a href="/configuration.html#totp">TOPT</a>:</p> |  | ||||||
| <ul> |  | ||||||
| <li>Set <strong>totp_mode = “optional”</strong>  or <strong>totp_mode = “mandatory”</strong></li> |  | ||||||
| </ul> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>To use <a href="/configuration.html#mail-service">Mail service</a>:</p> |  | ||||||
| <ul> |  | ||||||
| <li>Set <strong>use_mail=true</strong></li> |  | ||||||
| <li>Set <strong>[paseto]</strong> section (<strong>public_path</strong> and <strong>secret_path</strong>)</li> |  | ||||||
| <li>Run <strong>tools/get_mail_token.sh</strong> script to generate <strong>smtp_auth</strong> value with  MAIL_USER and MAIL_PASSWORD</li> |  | ||||||
| <li>Complete values: <strong>smtp_auth</strong> and <strong>mail_from</strong></li> |  | ||||||
| </ul> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>Define <a href="/configuration.html#stores">Stores</a> for service:</p> |  | ||||||
| <p>For <a href="sessions.html">Sessions</a> |  | ||||||
| For [Users](users .md)</p> |  | ||||||
| <ul> |  | ||||||
| <li> |  | ||||||
| <p>For <a href="https://www.sqlite.org/index.html">SQLite</a>:</p> |  | ||||||
| <ul> |  | ||||||
| <li>Create <strong>users_store_uri</strong> = “sqlite:PATH_TO_users.db”</li> |  | ||||||
| <li>set <strong>users_store_uri</strong> = “sqlite:PATH_TO_users.db”</li> |  | ||||||
| <li>Create <strong>sessions_store_uri</strong> = “sqlite:PATH_TO_sessions.db”</li> |  | ||||||
| <li>set <strong>sessions_store_uri</strong> = “sqlite:PATH_TO_sessions.db”</li> |  | ||||||
| </ul> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p>For <strong>FILE</strong> mode:</p> |  | ||||||
| <ul> |  | ||||||
| <li>set <strong>users_store_uri</strong> = “file:///PATH_TO_users_DIRECTORY”</li> |  | ||||||
| <li>set <strong>sessions_store_uri</strong> = “file:///PATH_TO_sessions_DIRECTORY”</li> |  | ||||||
| </ul> |  | ||||||
| </li> |  | ||||||
| </ul> |  | ||||||
| </li> |  | ||||||
| <li> |  | ||||||
| <p><a href="policies.html">Access policies</a> to <strong>enfoce</strong> for content access with <a href="https://github.com/casbin/casbin-rs">Casbin</a>:</p> |  | ||||||
| <ul> |  | ||||||
| <li>Set <a href="/configuration.html#policies">Policies paths</a>: <strong>authz_model_path</strong> and <strong>authz_policy_path</strong></li> |  | ||||||
| <li>Set an entry for each <a href="static_content.html">static_content</a> like in example bellow</li> |  | ||||||
| <li>Be sure <a href="policies.html">Access policies</a> for each <strong>serve_path</strong> <strong>url_path</strong> are properly set in <strong>authz_policy_path</strong> file</li> |  | ||||||
| </ul> |  | ||||||
| </li> |  | ||||||
| </ol> |  | ||||||
| <div style="margin-left:4em"> |  | ||||||
| Example (<b>url_path</b> /appdoc): |  | ||||||
| <pre><code class="language-toml">[[serve_paths]] |  | ||||||
| # Server relative Directory Path (sitehome/appdoc) |  | ||||||
| srv_path = "Server DIRECTORY_PATH" |  | ||||||
| # Absolute URL path for resquests |  | ||||||
| url_path = "/appdoc" |  | ||||||
| # Not found URL to be redirect  |  | ||||||
| not_found = "" |  | ||||||
| # URL to be redirect if is not authorization found |  | ||||||
| not_auth = "/login" |  | ||||||
| # true or false to access control or not to this PATH |  | ||||||
| is_restricted = true |  | ||||||
| </code></pre> |  | ||||||
| </div> |  | ||||||
| <div style="margin-left:4em"> |  | ||||||
| Policy content for <b>url_path</b> = "/appdoc" method GET: |  | ||||||
| <p>For <a href="roles.html">Role</a> <b>dev</b>:</p> |  | ||||||
| <pre><code class="language-text">p, dev, /appdoc, GET |  | ||||||
| </code></pre> |  | ||||||
| <p>For specific user only:</p> |  | ||||||
| <pre><code class="language-text">p, user@test.com, /appdoc, GET |  | ||||||
| </code></pre> |  | ||||||
| </div> |  | ||||||
| <ol start="8"> |  | ||||||
| <li>Generate <a href="pasetoken.html#generate-keys">Pasetoken keys</a> to generate <a href="sessions.html">Session data</a></li> |  | ||||||
| </ol> |  | ||||||
| 
 |  | ||||||
|                     </main> |  | ||||||
| 
 |  | ||||||
|                     <nav class="nav-wrapper" aria-label="Page navigation"> |  | ||||||
|                         <!-- Mobile navigation buttons --> |  | ||||||
|                             <a rel="prev" href="howto.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                                 <i class="fa fa-angle-left"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                             <a rel="next" href="one_server.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                                 <i class="fa fa-angle-right"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                         <div style="clear: both"></div> |  | ||||||
|                     </nav> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
| 
 |  | ||||||
|             <nav class="nav-wide-wrapper" aria-label="Page navigation"> |  | ||||||
|                     <a rel="prev" href="howto.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                         <i class="fa fa-angle-left"></i> |  | ||||||
|                     </a> |  | ||||||
| 
 |  | ||||||
|                     <a rel="next" href="one_server.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                         <i class="fa fa-angle-right"></i> |  | ||||||
|                     </a> |  | ||||||
|             </nav> |  | ||||||
| 
 |  | ||||||
|         </div> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <script> |  | ||||||
|             window.playground_copyable = true; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/ace.js"></script> |  | ||||||
|         <script src="/docserver/editor.js"></script> |  | ||||||
|         <script src="/docserver/mode-rust.js"></script> |  | ||||||
|         <script src="/docserver/theme-dawn.js"></script> |  | ||||||
|         <script src="/docserver/theme-tomorrow_night.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/elasticlunr.min.js"></script> |  | ||||||
|         <script src="/docserver/mark.min.js"></script> |  | ||||||
|         <script src="/docserver/searcher.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/clipboard.min.js"></script> |  | ||||||
|         <script src="/docserver/highlight.js"></script> |  | ||||||
|         <script src="/docserver/book.js"></script> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom JS scripts --> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     </div> |  | ||||||
|     </body> |  | ||||||
| </html> |  | ||||||
| @ -1,212 +0,0 @@ | |||||||
| <!DOCTYPE HTML> |  | ||||||
| <html lang="en" class="sidebar-visible no-js light"> |  | ||||||
|     <head> |  | ||||||
|         <!-- Book generated using mdBook --> |  | ||||||
|         <meta charset="UTF-8"> |  | ||||||
|         <title>Roles - Doc Server</title> |  | ||||||
|         <base href="/docserver/"> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <!-- Custom HTML head --> |  | ||||||
|          |  | ||||||
|         <meta name="description" content="Doc Server"> |  | ||||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> |  | ||||||
|         <meta name="theme-color" content="#ffffff" /> |  | ||||||
| 
 |  | ||||||
|         <link rel="icon" href="/docserver/favicon.svg"> |  | ||||||
|         <link rel="shortcut icon" href="/docserver/favicon.png"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/variables.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/general.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/chrome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/print.css" media="print"> |  | ||||||
| 
 |  | ||||||
|         <!-- Fonts --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/FontAwesome/css/font-awesome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/fonts/fonts.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Highlight.js Stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/highlight.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/tomorrow-night.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/ayu-highlight.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom theme stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/custom.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/mdbook-admonish.css"> |  | ||||||
| 
 |  | ||||||
|     </head> |  | ||||||
|     <body> |  | ||||||
|     <div id="body-container"> |  | ||||||
|         <!-- Provide site root to javascript --> |  | ||||||
|         <script> |  | ||||||
|             var path_to_root = "/docserver/"; |  | ||||||
|             var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light"; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Work around some values being stored in localStorage wrapped in quotes --> |  | ||||||
|         <script> |  | ||||||
|             try { |  | ||||||
|                 var theme = localStorage.getItem('mdbook-theme'); |  | ||||||
|                 var sidebar = localStorage.getItem('mdbook-sidebar'); |  | ||||||
| 
 |  | ||||||
|                 if (theme.startsWith('"') && theme.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (sidebar.startsWith('"') && sidebar.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); |  | ||||||
|                 } |  | ||||||
|             } catch (e) { } |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Set the theme before any content is loaded, prevents flash --> |  | ||||||
|         <script> |  | ||||||
|             var theme; |  | ||||||
|             try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } |  | ||||||
|             if (theme === null || theme === undefined) { theme = default_theme; } |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             html.classList.remove('no-js') |  | ||||||
|             html.classList.remove('light') |  | ||||||
|             html.classList.add(theme); |  | ||||||
|             html.classList.add('js'); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Hide / unhide sidebar before it is displayed --> |  | ||||||
|         <script> |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             var sidebar = null; |  | ||||||
|             if (document.body.clientWidth >= 1080) { |  | ||||||
|                 try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } |  | ||||||
|                 sidebar = sidebar || 'visible'; |  | ||||||
|             } else { |  | ||||||
|                 sidebar = 'hidden'; |  | ||||||
|             } |  | ||||||
|             html.classList.remove('sidebar-visible'); |  | ||||||
|             html.classList.add("sidebar-" + sidebar); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <nav id="sidebar" class="sidebar" aria-label="Table of contents"> |  | ||||||
|             <div class="sidebar-scrollbox"> |  | ||||||
|                 <ol class="chapter"><li class="chapter-item "><a href="/docserver/introduction.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li class="chapter-item "><a href="/docserver/index.html"><strong aria-hidden="true">2.</strong> What is this ?</a></li><li class="chapter-item "><a href="/docserver/features.html"><strong aria-hidden="true">3.</strong> Features</a></li><li class="chapter-item "><a href="/docserver/howto.html"><strong aria-hidden="true">4.</strong> How to</a></li><li class="chapter-item "><a href="/docserver/quick-start.html"><strong aria-hidden="true">5.</strong> Quick Start</a></li><li class="spacer"></li><li class="chapter-item affix "><li class="part-title">Server and Content</li><li class="chapter-item "><a href="/docserver/one_server.html"><strong aria-hidden="true">6.</strong> One web server instance</a></li><li class="chapter-item "><a href="/docserver/server_modes.html"><strong aria-hidden="true">7.</strong> Server modes</a></li><li class="chapter-item "><a href="/docserver/static_content.html"><strong aria-hidden="true">8.</strong> Static contents</a></li><li class="chapter-item "><a href="/docserver/url_path.html"><strong aria-hidden="true">9.</strong> url_path prefix</a></li><li class="chapter-item "><a href="/docserver/protect_access.html"><strong aria-hidden="true">10.</strong> Protect access</a></li><li class="chapter-item affix "><li class="part-title">Users and Policies</li><li class="chapter-item "><a href="/docserver/users.html"><strong aria-hidden="true">11.</strong> Users</a></li><li class="chapter-item "><a href="/docserver/users_sql.html"><strong aria-hidden="true">12.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/users_file_storage.html"><strong aria-hidden="true">13.</strong> File storage</a></li><li class="chapter-item expanded "><a href="/docserver/roles.html" class="active"><strong aria-hidden="true">14.</strong> Roles</a></li><li class="chapter-item "><a href="/docserver/auths.html"><strong aria-hidden="true">15.</strong> Users auths</a></li><li class="chapter-item "><a href="/docserver/policies.html"><strong aria-hidden="true">16.</strong> Access policies</a></li><li class="chapter-item "><a href="/docserver/adminusers.html"><strong aria-hidden="true">17.</strong> Users Admin</a></li><li class="chapter-item affix "><li class="part-title">Sessions</li><li class="chapter-item "><a href="/docserver/sessions.html"><strong aria-hidden="true">18.</strong> Session data</a></li><li class="chapter-item "><a href="/docserver/pasetoken.html"><strong aria-hidden="true">19.</strong> Pasetoken</a></li><li class="chapter-item "><a href="/docserver/sessions_sql.html"><strong aria-hidden="true">20.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/sessions_file_storage.html"><strong aria-hidden="true">21.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/cookie.html"><strong aria-hidden="true">22.</strong> Cookie set</a></li><li class="chapter-item affix "><li class="part-title">Logs and Trace</li><li class="chapter-item "><a href="/docserver/trace.html"><strong aria-hidden="true">23.</strong> Traced</a></li><li class="chapter-item "><a href="/docserver/logs.html"><strong aria-hidden="true">24.</strong> Sessions logs</a></li><li class="chapter-item affix "><li class="part-title">Configuration</li><li class="chapter-item "><a href="/docserver/configuration.html"><strong aria-hidden="true">25.</strong> Configurable service</a></li><li class="chapter-item "><a href="/docserver/settings.html"><strong aria-hidden="true">26.</strong> Config settings</a></li><li class="spacer"></li></ol> |  | ||||||
|             </div> |  | ||||||
|             <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> |  | ||||||
|         </nav> |  | ||||||
| 
 |  | ||||||
|         <div id="page-wrapper" class="page-wrapper"> |  | ||||||
| 
 |  | ||||||
|             <div class="page"> |  | ||||||
|                                 <div id="menu-bar-hover-placeholder"></div> |  | ||||||
|                 <div id="menu-bar" class="menu-bar sticky bordered"> |  | ||||||
|                     <div class="left-buttons"> |  | ||||||
|                         <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> |  | ||||||
|                             <i class="fa fa-bars"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="sidebar-toggle" onclick="location.href='/'" class="icon-button" type="button" title="Home" aria-label="Home" aria-controls=""> |  | ||||||
|                             <i class="fa fa-home"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> |  | ||||||
|                             <i class="fa fa-paint-brush"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> |  | ||||||
|                         </ul> |  | ||||||
|                         <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> |  | ||||||
|                             <i class="fa fa-search"></i> |  | ||||||
|                         </button> |  | ||||||
|                     </div> |  | ||||||
| 
 |  | ||||||
|                     <h1 class="menu-title">Doc Server</h1> |  | ||||||
| 
 |  | ||||||
|                     <div class="right-buttons"> |  | ||||||
|                         <a href="/docserver/print.html" title="Print this book" aria-label="Print this book"> |  | ||||||
|                             <i id="print-button" class="fa fa-print"></i> |  | ||||||
|                         </a> |  | ||||||
|                         <a href="/logout" title="Sing out" aria-label="Sign out"> |  | ||||||
|                             <i id="logout-button" class="fa fa-sign-out"></i> |  | ||||||
|                         </a> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div id="search-wrapper" class="hidden"> |  | ||||||
|                     <form id="searchbar-outer" class="searchbar-outer"> |  | ||||||
|                         <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> |  | ||||||
|                     </form> |  | ||||||
|                     <div id="searchresults-outer" class="searchresults-outer hidden"> |  | ||||||
|                         <div id="searchresults-header" class="searchresults-header"></div> |  | ||||||
|                         <ul id="searchresults"> |  | ||||||
|                         </ul> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> |  | ||||||
|                 <script> |  | ||||||
|                     document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); |  | ||||||
|                     document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); |  | ||||||
|                     Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { |  | ||||||
|                         link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); |  | ||||||
|                     }); |  | ||||||
|                 </script> |  | ||||||
| 
 |  | ||||||
|                 <div id="content" class="content"> |  | ||||||
|                     <main> |  | ||||||
|                         <h1 id="roles"><a class="header" href="#roles">Roles</a></h1> |  | ||||||
| 
 |  | ||||||
|                     </main> |  | ||||||
| 
 |  | ||||||
|                     <nav class="nav-wrapper" aria-label="Page navigation"> |  | ||||||
|                         <!-- Mobile navigation buttons --> |  | ||||||
|                             <a rel="prev" href="users_file_storage.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                                 <i class="fa fa-angle-left"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                             <a rel="next" href="auths.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                                 <i class="fa fa-angle-right"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                         <div style="clear: both"></div> |  | ||||||
|                     </nav> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
| 
 |  | ||||||
|             <nav class="nav-wide-wrapper" aria-label="Page navigation"> |  | ||||||
|                     <a rel="prev" href="users_file_storage.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                         <i class="fa fa-angle-left"></i> |  | ||||||
|                     </a> |  | ||||||
| 
 |  | ||||||
|                     <a rel="next" href="auths.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                         <i class="fa fa-angle-right"></i> |  | ||||||
|                     </a> |  | ||||||
|             </nav> |  | ||||||
| 
 |  | ||||||
|         </div> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <script> |  | ||||||
|             window.playground_copyable = true; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/ace.js"></script> |  | ||||||
|         <script src="/docserver/editor.js"></script> |  | ||||||
|         <script src="/docserver/mode-rust.js"></script> |  | ||||||
|         <script src="/docserver/theme-dawn.js"></script> |  | ||||||
|         <script src="/docserver/theme-tomorrow_night.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/elasticlunr.min.js"></script> |  | ||||||
|         <script src="/docserver/mark.min.js"></script> |  | ||||||
|         <script src="/docserver/searcher.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/clipboard.min.js"></script> |  | ||||||
|         <script src="/docserver/highlight.js"></script> |  | ||||||
|         <script src="/docserver/book.js"></script> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom JS scripts --> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     </div> |  | ||||||
|     </body> |  | ||||||
| </html> |  | ||||||
| @ -1,483 +0,0 @@ | |||||||
| "use strict"; |  | ||||||
| window.search = window.search || {}; |  | ||||||
| (function search(search) { |  | ||||||
|     // Search functionality
 |  | ||||||
|     //
 |  | ||||||
|     // You can use !hasFocus() to prevent keyhandling in your key
 |  | ||||||
|     // event handlers while the user is typing their search.
 |  | ||||||
| 
 |  | ||||||
|     if (!Mark || !elasticlunr) { |  | ||||||
|         return; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     //IE 11 Compatibility from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith
 |  | ||||||
|     if (!String.prototype.startsWith) { |  | ||||||
|         String.prototype.startsWith = function(search, pos) { |  | ||||||
|             return this.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search; |  | ||||||
|         }; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     var search_wrap = document.getElementById('search-wrapper'), |  | ||||||
|         searchbar = document.getElementById('searchbar'), |  | ||||||
|         searchbar_outer = document.getElementById('searchbar-outer'), |  | ||||||
|         searchresults = document.getElementById('searchresults'), |  | ||||||
|         searchresults_outer = document.getElementById('searchresults-outer'), |  | ||||||
|         searchresults_header = document.getElementById('searchresults-header'), |  | ||||||
|         searchicon = document.getElementById('search-toggle'), |  | ||||||
|         content = document.getElementById('content'), |  | ||||||
| 
 |  | ||||||
|         searchindex = null, |  | ||||||
|         doc_urls = [], |  | ||||||
|         results_options = { |  | ||||||
|             teaser_word_count: 30, |  | ||||||
|             limit_results: 30, |  | ||||||
|         }, |  | ||||||
|         search_options = { |  | ||||||
|             bool: "AND", |  | ||||||
|             expand: true, |  | ||||||
|             fields: { |  | ||||||
|                 title: {boost: 1}, |  | ||||||
|                 body: {boost: 1}, |  | ||||||
|                 breadcrumbs: {boost: 0} |  | ||||||
|             } |  | ||||||
|         }, |  | ||||||
|         mark_exclude = [], |  | ||||||
|         marker = new Mark(content), |  | ||||||
|         current_searchterm = "", |  | ||||||
|         URL_SEARCH_PARAM = 'search', |  | ||||||
|         URL_MARK_PARAM = 'highlight', |  | ||||||
|         teaser_count = 0, |  | ||||||
| 
 |  | ||||||
|         SEARCH_HOTKEY_KEYCODE = 83, |  | ||||||
|         ESCAPE_KEYCODE = 27, |  | ||||||
|         DOWN_KEYCODE = 40, |  | ||||||
|         UP_KEYCODE = 38, |  | ||||||
|         SELECT_KEYCODE = 13; |  | ||||||
| 
 |  | ||||||
|     function hasFocus() { |  | ||||||
|         return searchbar === document.activeElement; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     function removeChildren(elem) { |  | ||||||
|         while (elem.firstChild) { |  | ||||||
|             elem.removeChild(elem.firstChild); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     // Helper to parse a url into its building blocks.
 |  | ||||||
|     function parseURL(url) { |  | ||||||
|         var a =  document.createElement('a'); |  | ||||||
|         a.href = url; |  | ||||||
|         return { |  | ||||||
|             source: url, |  | ||||||
|             protocol: a.protocol.replace(':',''), |  | ||||||
|             host: a.hostname, |  | ||||||
|             port: a.port, |  | ||||||
|             params: (function(){ |  | ||||||
|                 var ret = {}; |  | ||||||
|                 var seg = a.search.replace(/^\?/,'').split('&'); |  | ||||||
|                 var len = seg.length, i = 0, s; |  | ||||||
|                 for (;i<len;i++) { |  | ||||||
|                     if (!seg[i]) { continue; } |  | ||||||
|                     s = seg[i].split('='); |  | ||||||
|                     ret[s[0]] = s[1]; |  | ||||||
|                 } |  | ||||||
|                 return ret; |  | ||||||
|             })(), |  | ||||||
|             file: (a.pathname.match(/\/([^/?#]+)$/i) || [,''])[1], |  | ||||||
|             hash: a.hash.replace('#',''), |  | ||||||
|             path: a.pathname.replace(/^([^/])/,'/$1') |  | ||||||
|         }; |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     // Helper to recreate a url string from its building blocks.
 |  | ||||||
|     function renderURL(urlobject) { |  | ||||||
|         var url = urlobject.protocol + "://" + urlobject.host; |  | ||||||
|         if (urlobject.port != "") { |  | ||||||
|             url += ":" + urlobject.port; |  | ||||||
|         } |  | ||||||
|         url += urlobject.path; |  | ||||||
|         var joiner = "?"; |  | ||||||
|         for(var prop in urlobject.params) { |  | ||||||
|             if(urlobject.params.hasOwnProperty(prop)) { |  | ||||||
|                 url += joiner + prop + "=" + urlobject.params[prop]; |  | ||||||
|                 joiner = "&"; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         if (urlobject.hash != "") { |  | ||||||
|             url += "#" + urlobject.hash; |  | ||||||
|         } |  | ||||||
|         return url; |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     // Helper to escape html special chars for displaying the teasers
 |  | ||||||
|     var escapeHTML = (function() { |  | ||||||
|         var MAP = { |  | ||||||
|             '&': '&', |  | ||||||
|             '<': '<', |  | ||||||
|             '>': '>', |  | ||||||
|             '"': '"', |  | ||||||
|             "'": ''' |  | ||||||
|         }; |  | ||||||
|         var repl = function(c) { return MAP[c]; }; |  | ||||||
|         return function(s) { |  | ||||||
|             return s.replace(/[&<>'"]/g, repl); |  | ||||||
|         }; |  | ||||||
|     })(); |  | ||||||
|      |  | ||||||
|     function formatSearchMetric(count, searchterm) { |  | ||||||
|         if (count == 1) { |  | ||||||
|             return count + " search result for '" + searchterm + "':"; |  | ||||||
|         } else if (count == 0) { |  | ||||||
|             return "No search results for '" + searchterm + "'."; |  | ||||||
|         } else { |  | ||||||
|             return count + " search results for '" + searchterm + "':"; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     function formatSearchResult(result, searchterms) { |  | ||||||
|         var teaser = makeTeaser(escapeHTML(result.doc.body), searchterms); |  | ||||||
|         teaser_count++; |  | ||||||
| 
 |  | ||||||
|         // The ?URL_MARK_PARAM= parameter belongs inbetween the page and the #heading-anchor
 |  | ||||||
|         var url = doc_urls[result.ref].split("#"); |  | ||||||
|         if (url.length == 1) { // no anchor found
 |  | ||||||
|             url.push(""); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         // encodeURIComponent escapes all chars that could allow an XSS except
 |  | ||||||
|         // for '. Due to that we also manually replace ' with its url-encoded
 |  | ||||||
|         // representation (%27).
 |  | ||||||
|         var searchterms = encodeURIComponent(searchterms.join(" ")).replace(/\'/g, "%27"); |  | ||||||
| 
 |  | ||||||
|         return '<a href="' + path_to_root + url[0] + '?' + URL_MARK_PARAM + '=' + searchterms + '#' + url[1] |  | ||||||
|             + '" aria-details="teaser_' + teaser_count + '">' + result.doc.breadcrumbs + '</a>' |  | ||||||
|             + '<span class="teaser" id="teaser_' + teaser_count + '" aria-label="Search Result Teaser">'  |  | ||||||
|             + teaser + '</span>'; |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     function makeTeaser(body, searchterms) { |  | ||||||
|         // The strategy is as follows:
 |  | ||||||
|         // First, assign a value to each word in the document:
 |  | ||||||
|         //  Words that correspond to search terms (stemmer aware): 40
 |  | ||||||
|         //  Normal words: 2
 |  | ||||||
|         //  First word in a sentence: 8
 |  | ||||||
|         // Then use a sliding window with a constant number of words and count the
 |  | ||||||
|         // sum of the values of the words within the window. Then use the window that got the
 |  | ||||||
|         // maximum sum. If there are multiple maximas, then get the last one.
 |  | ||||||
|         // Enclose the terms in <em>.
 |  | ||||||
|         var stemmed_searchterms = searchterms.map(function(w) { |  | ||||||
|             return elasticlunr.stemmer(w.toLowerCase()); |  | ||||||
|         }); |  | ||||||
|         var searchterm_weight = 40; |  | ||||||
|         var weighted = []; // contains elements of ["word", weight, index_in_document]
 |  | ||||||
|         // split in sentences, then words
 |  | ||||||
|         var sentences = body.toLowerCase().split('. '); |  | ||||||
|         var index = 0; |  | ||||||
|         var value = 0; |  | ||||||
|         var searchterm_found = false; |  | ||||||
|         for (var sentenceindex in sentences) { |  | ||||||
|             var words = sentences[sentenceindex].split(' '); |  | ||||||
|             value = 8; |  | ||||||
|             for (var wordindex in words) { |  | ||||||
|                 var word = words[wordindex]; |  | ||||||
|                 if (word.length > 0) { |  | ||||||
|                     for (var searchtermindex in stemmed_searchterms) { |  | ||||||
|                         if (elasticlunr.stemmer(word).startsWith(stemmed_searchterms[searchtermindex])) { |  | ||||||
|                             value = searchterm_weight; |  | ||||||
|                             searchterm_found = true; |  | ||||||
|                         } |  | ||||||
|                     }; |  | ||||||
|                     weighted.push([word, value, index]); |  | ||||||
|                     value = 2; |  | ||||||
|                 } |  | ||||||
|                 index += word.length; |  | ||||||
|                 index += 1; // ' ' or '.' if last word in sentence
 |  | ||||||
|             }; |  | ||||||
|             index += 1; // because we split at a two-char boundary '. '
 |  | ||||||
|         }; |  | ||||||
| 
 |  | ||||||
|         if (weighted.length == 0) { |  | ||||||
|             return body; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         var window_weight = []; |  | ||||||
|         var window_size = Math.min(weighted.length, results_options.teaser_word_count); |  | ||||||
| 
 |  | ||||||
|         var cur_sum = 0; |  | ||||||
|         for (var wordindex = 0; wordindex < window_size; wordindex++) { |  | ||||||
|             cur_sum += weighted[wordindex][1]; |  | ||||||
|         }; |  | ||||||
|         window_weight.push(cur_sum); |  | ||||||
|         for (var wordindex = 0; wordindex < weighted.length - window_size; wordindex++) { |  | ||||||
|             cur_sum -= weighted[wordindex][1]; |  | ||||||
|             cur_sum += weighted[wordindex + window_size][1]; |  | ||||||
|             window_weight.push(cur_sum); |  | ||||||
|         }; |  | ||||||
| 
 |  | ||||||
|         if (searchterm_found) { |  | ||||||
|             var max_sum = 0; |  | ||||||
|             var max_sum_window_index = 0; |  | ||||||
|             // backwards
 |  | ||||||
|             for (var i = window_weight.length - 1; i >= 0; i--) { |  | ||||||
|                 if (window_weight[i] > max_sum) { |  | ||||||
|                     max_sum = window_weight[i]; |  | ||||||
|                     max_sum_window_index = i; |  | ||||||
|                 } |  | ||||||
|             }; |  | ||||||
|         } else { |  | ||||||
|             max_sum_window_index = 0; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         // add <em/> around searchterms
 |  | ||||||
|         var teaser_split = []; |  | ||||||
|         var index = weighted[max_sum_window_index][2]; |  | ||||||
|         for (var i = max_sum_window_index; i < max_sum_window_index+window_size; i++) { |  | ||||||
|             var word = weighted[i]; |  | ||||||
|             if (index < word[2]) { |  | ||||||
|                 // missing text from index to start of `word`
 |  | ||||||
|                 teaser_split.push(body.substring(index, word[2])); |  | ||||||
|                 index = word[2]; |  | ||||||
|             } |  | ||||||
|             if (word[1] == searchterm_weight) { |  | ||||||
|                 teaser_split.push("<em>") |  | ||||||
|             } |  | ||||||
|             index = word[2] + word[0].length; |  | ||||||
|             teaser_split.push(body.substring(word[2], index)); |  | ||||||
|             if (word[1] == searchterm_weight) { |  | ||||||
|                 teaser_split.push("</em>") |  | ||||||
|             } |  | ||||||
|         }; |  | ||||||
| 
 |  | ||||||
|         return teaser_split.join(''); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     function init(config) { |  | ||||||
|         results_options = config.results_options; |  | ||||||
|         search_options = config.search_options; |  | ||||||
|         searchbar_outer = config.searchbar_outer; |  | ||||||
|         doc_urls = config.doc_urls; |  | ||||||
|         searchindex = elasticlunr.Index.load(config.index); |  | ||||||
| 
 |  | ||||||
|         // Set up events
 |  | ||||||
|         searchicon.addEventListener('click', function(e) { searchIconClickHandler(); }, false); |  | ||||||
|         searchbar.addEventListener('keyup', function(e) { searchbarKeyUpHandler(); }, false); |  | ||||||
|         document.addEventListener('keydown', function(e) { globalKeyHandler(e); }, false); |  | ||||||
|         // If the user uses the browser buttons, do the same as if a reload happened
 |  | ||||||
|         window.onpopstate = function(e) { doSearchOrMarkFromUrl(); }; |  | ||||||
|         // Suppress "submit" events so the page doesn't reload when the user presses Enter
 |  | ||||||
|         document.addEventListener('submit', function(e) { e.preventDefault(); }, false); |  | ||||||
| 
 |  | ||||||
|         // If reloaded, do the search or mark again, depending on the current url parameters
 |  | ||||||
|         doSearchOrMarkFromUrl(); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     function unfocusSearchbar() { |  | ||||||
|         // hacky, but just focusing a div only works once
 |  | ||||||
|         var tmp = document.createElement('input'); |  | ||||||
|         tmp.setAttribute('style', 'position: absolute; opacity: 0;'); |  | ||||||
|         searchicon.appendChild(tmp); |  | ||||||
|         tmp.focus(); |  | ||||||
|         tmp.remove(); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     // On reload or browser history backwards/forwards events, parse the url and do search or mark
 |  | ||||||
|     function doSearchOrMarkFromUrl() { |  | ||||||
|         // Check current URL for search request
 |  | ||||||
|         var url = parseURL(window.location.href); |  | ||||||
|         if (url.params.hasOwnProperty(URL_SEARCH_PARAM) |  | ||||||
|             && url.params[URL_SEARCH_PARAM] != "") { |  | ||||||
|             showSearch(true); |  | ||||||
|             searchbar.value = decodeURIComponent( |  | ||||||
|                 (url.params[URL_SEARCH_PARAM]+'').replace(/\+/g, '%20')); |  | ||||||
|             searchbarKeyUpHandler(); // -> doSearch()
 |  | ||||||
|         } else { |  | ||||||
|             showSearch(false); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         if (url.params.hasOwnProperty(URL_MARK_PARAM)) { |  | ||||||
|             var words = decodeURIComponent(url.params[URL_MARK_PARAM]).split(' '); |  | ||||||
|             marker.mark(words, { |  | ||||||
|                 exclude: mark_exclude |  | ||||||
|             }); |  | ||||||
| 
 |  | ||||||
|             var markers = document.querySelectorAll("mark"); |  | ||||||
|             function hide() { |  | ||||||
|                 for (var i = 0; i < markers.length; i++) { |  | ||||||
|                     markers[i].classList.add("fade-out"); |  | ||||||
|                     window.setTimeout(function(e) { marker.unmark(); }, 300); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             for (var i = 0; i < markers.length; i++) { |  | ||||||
|                 markers[i].addEventListener('click', hide); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     // Eventhandler for keyevents on `document`
 |  | ||||||
|     function globalKeyHandler(e) { |  | ||||||
|         if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey || e.target.type === 'textarea' || e.target.type === 'text') { return; } |  | ||||||
| 
 |  | ||||||
|         if (e.keyCode === ESCAPE_KEYCODE) { |  | ||||||
|             e.preventDefault(); |  | ||||||
|             searchbar.classList.remove("active"); |  | ||||||
|             setSearchUrlParameters("", |  | ||||||
|                 (searchbar.value.trim() !== "") ? "push" : "replace"); |  | ||||||
|             if (hasFocus()) { |  | ||||||
|                 unfocusSearchbar(); |  | ||||||
|             } |  | ||||||
|             showSearch(false); |  | ||||||
|             marker.unmark(); |  | ||||||
|         } else if (!hasFocus() && e.keyCode === SEARCH_HOTKEY_KEYCODE) { |  | ||||||
|             e.preventDefault(); |  | ||||||
|             showSearch(true); |  | ||||||
|             window.scrollTo(0, 0); |  | ||||||
|             searchbar.select(); |  | ||||||
|         } else if (hasFocus() && e.keyCode === DOWN_KEYCODE) { |  | ||||||
|             e.preventDefault(); |  | ||||||
|             unfocusSearchbar(); |  | ||||||
|             searchresults.firstElementChild.classList.add("focus"); |  | ||||||
|         } else if (!hasFocus() && (e.keyCode === DOWN_KEYCODE |  | ||||||
|                                 || e.keyCode === UP_KEYCODE |  | ||||||
|                                 || e.keyCode === SELECT_KEYCODE)) { |  | ||||||
|             // not `:focus` because browser does annoying scrolling
 |  | ||||||
|             var focused = searchresults.querySelector("li.focus"); |  | ||||||
|             if (!focused) return; |  | ||||||
|             e.preventDefault(); |  | ||||||
|             if (e.keyCode === DOWN_KEYCODE) { |  | ||||||
|                 var next = focused.nextElementSibling; |  | ||||||
|                 if (next) { |  | ||||||
|                     focused.classList.remove("focus"); |  | ||||||
|                     next.classList.add("focus"); |  | ||||||
|                 } |  | ||||||
|             } else if (e.keyCode === UP_KEYCODE) { |  | ||||||
|                 focused.classList.remove("focus"); |  | ||||||
|                 var prev = focused.previousElementSibling; |  | ||||||
|                 if (prev) { |  | ||||||
|                     prev.classList.add("focus"); |  | ||||||
|                 } else { |  | ||||||
|                     searchbar.select(); |  | ||||||
|                 } |  | ||||||
|             } else { // SELECT_KEYCODE
 |  | ||||||
|                 window.location.assign(focused.querySelector('a')); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     function showSearch(yes) { |  | ||||||
|         if (yes) { |  | ||||||
|             search_wrap.classList.remove('hidden'); |  | ||||||
|             searchicon.setAttribute('aria-expanded', 'true'); |  | ||||||
|         } else { |  | ||||||
|             search_wrap.classList.add('hidden'); |  | ||||||
|             searchicon.setAttribute('aria-expanded', 'false'); |  | ||||||
|             var results = searchresults.children; |  | ||||||
|             for (var i = 0; i < results.length; i++) { |  | ||||||
|                 results[i].classList.remove("focus"); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     function showResults(yes) { |  | ||||||
|         if (yes) { |  | ||||||
|             searchresults_outer.classList.remove('hidden'); |  | ||||||
|         } else { |  | ||||||
|             searchresults_outer.classList.add('hidden'); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     // Eventhandler for search icon
 |  | ||||||
|     function searchIconClickHandler() { |  | ||||||
|         if (search_wrap.classList.contains('hidden')) { |  | ||||||
|             showSearch(true); |  | ||||||
|             window.scrollTo(0, 0); |  | ||||||
|             searchbar.select(); |  | ||||||
|         } else { |  | ||||||
|             showSearch(false); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     // Eventhandler for keyevents while the searchbar is focused
 |  | ||||||
|     function searchbarKeyUpHandler() { |  | ||||||
|         var searchterm = searchbar.value.trim(); |  | ||||||
|         if (searchterm != "") { |  | ||||||
|             searchbar.classList.add("active"); |  | ||||||
|             doSearch(searchterm); |  | ||||||
|         } else { |  | ||||||
|             searchbar.classList.remove("active"); |  | ||||||
|             showResults(false); |  | ||||||
|             removeChildren(searchresults); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         setSearchUrlParameters(searchterm, "push_if_new_search_else_replace"); |  | ||||||
| 
 |  | ||||||
|         // Remove marks
 |  | ||||||
|         marker.unmark(); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     // Update current url with ?URL_SEARCH_PARAM= parameter, remove ?URL_MARK_PARAM and #heading-anchor .
 |  | ||||||
|     // `action` can be one of "push", "replace", "push_if_new_search_else_replace"
 |  | ||||||
|     // and replaces or pushes a new browser history item.
 |  | ||||||
|     // "push_if_new_search_else_replace" pushes if there is no `?URL_SEARCH_PARAM=abc` yet.
 |  | ||||||
|     function setSearchUrlParameters(searchterm, action) { |  | ||||||
|         var url = parseURL(window.location.href); |  | ||||||
|         var first_search = ! url.params.hasOwnProperty(URL_SEARCH_PARAM); |  | ||||||
|         if (searchterm != "" || action == "push_if_new_search_else_replace") { |  | ||||||
|             url.params[URL_SEARCH_PARAM] = searchterm; |  | ||||||
|             delete url.params[URL_MARK_PARAM]; |  | ||||||
|             url.hash = ""; |  | ||||||
|         } else { |  | ||||||
|             delete url.params[URL_MARK_PARAM]; |  | ||||||
|             delete url.params[URL_SEARCH_PARAM]; |  | ||||||
|         } |  | ||||||
|         // A new search will also add a new history item, so the user can go back
 |  | ||||||
|         // to the page prior to searching. A updated search term will only replace
 |  | ||||||
|         // the url.
 |  | ||||||
|         if (action == "push" || (action == "push_if_new_search_else_replace" && first_search) ) { |  | ||||||
|             history.pushState({}, document.title, renderURL(url)); |  | ||||||
|         } else if (action == "replace" || (action == "push_if_new_search_else_replace" && !first_search) ) { |  | ||||||
|             history.replaceState({}, document.title, renderURL(url)); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     function doSearch(searchterm) { |  | ||||||
| 
 |  | ||||||
|         // Don't search the same twice
 |  | ||||||
|         if (current_searchterm == searchterm) { return; } |  | ||||||
|         else { current_searchterm = searchterm; } |  | ||||||
| 
 |  | ||||||
|         if (searchindex == null) { return; } |  | ||||||
| 
 |  | ||||||
|         // Do the actual search
 |  | ||||||
|         var results = searchindex.search(searchterm, search_options); |  | ||||||
|         var resultcount = Math.min(results.length, results_options.limit_results); |  | ||||||
| 
 |  | ||||||
|         // Display search metrics
 |  | ||||||
|         searchresults_header.innerText = formatSearchMetric(resultcount, searchterm); |  | ||||||
| 
 |  | ||||||
|         // Clear and insert results
 |  | ||||||
|         var searchterms  = searchterm.split(' '); |  | ||||||
|         removeChildren(searchresults); |  | ||||||
|         for(var i = 0; i < resultcount ; i++){ |  | ||||||
|             var resultElem = document.createElement('li'); |  | ||||||
|             resultElem.innerHTML = formatSearchResult(results[i], searchterms); |  | ||||||
|             searchresults.appendChild(resultElem); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         // Display results
 |  | ||||||
|         showResults(true); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     fetch(path_to_root + 'searchindex.json') |  | ||||||
|         .then(response => response.json()) |  | ||||||
|         .then(json => init(json))         |  | ||||||
|         .catch(error => { // Try to load searchindex.js if fetch failed
 |  | ||||||
|             var script = document.createElement('script'); |  | ||||||
|             script.src = path_to_root + 'searchindex.js'; |  | ||||||
|             script.onload = () => init(window.search); |  | ||||||
|             document.head.appendChild(script); |  | ||||||
|         }); |  | ||||||
| 
 |  | ||||||
|     // Exported functions
 |  | ||||||
|     search.hasFocus = hasFocus; |  | ||||||
| })(window.search); |  | ||||||
| @ -1,212 +0,0 @@ | |||||||
| <!DOCTYPE HTML> |  | ||||||
| <html lang="en" class="sidebar-visible no-js light"> |  | ||||||
|     <head> |  | ||||||
|         <!-- Book generated using mdBook --> |  | ||||||
|         <meta charset="UTF-8"> |  | ||||||
|         <title>Server modes - Doc Server</title> |  | ||||||
|         <base href="/docserver/"> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <!-- Custom HTML head --> |  | ||||||
|          |  | ||||||
|         <meta name="description" content="Doc Server"> |  | ||||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> |  | ||||||
|         <meta name="theme-color" content="#ffffff" /> |  | ||||||
| 
 |  | ||||||
|         <link rel="icon" href="/docserver/favicon.svg"> |  | ||||||
|         <link rel="shortcut icon" href="/docserver/favicon.png"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/variables.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/general.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/chrome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/print.css" media="print"> |  | ||||||
| 
 |  | ||||||
|         <!-- Fonts --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/FontAwesome/css/font-awesome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/fonts/fonts.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Highlight.js Stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/highlight.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/tomorrow-night.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/ayu-highlight.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom theme stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/custom.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/mdbook-admonish.css"> |  | ||||||
| 
 |  | ||||||
|     </head> |  | ||||||
|     <body> |  | ||||||
|     <div id="body-container"> |  | ||||||
|         <!-- Provide site root to javascript --> |  | ||||||
|         <script> |  | ||||||
|             var path_to_root = "/docserver/"; |  | ||||||
|             var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light"; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Work around some values being stored in localStorage wrapped in quotes --> |  | ||||||
|         <script> |  | ||||||
|             try { |  | ||||||
|                 var theme = localStorage.getItem('mdbook-theme'); |  | ||||||
|                 var sidebar = localStorage.getItem('mdbook-sidebar'); |  | ||||||
| 
 |  | ||||||
|                 if (theme.startsWith('"') && theme.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (sidebar.startsWith('"') && sidebar.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); |  | ||||||
|                 } |  | ||||||
|             } catch (e) { } |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Set the theme before any content is loaded, prevents flash --> |  | ||||||
|         <script> |  | ||||||
|             var theme; |  | ||||||
|             try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } |  | ||||||
|             if (theme === null || theme === undefined) { theme = default_theme; } |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             html.classList.remove('no-js') |  | ||||||
|             html.classList.remove('light') |  | ||||||
|             html.classList.add(theme); |  | ||||||
|             html.classList.add('js'); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Hide / unhide sidebar before it is displayed --> |  | ||||||
|         <script> |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             var sidebar = null; |  | ||||||
|             if (document.body.clientWidth >= 1080) { |  | ||||||
|                 try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } |  | ||||||
|                 sidebar = sidebar || 'visible'; |  | ||||||
|             } else { |  | ||||||
|                 sidebar = 'hidden'; |  | ||||||
|             } |  | ||||||
|             html.classList.remove('sidebar-visible'); |  | ||||||
|             html.classList.add("sidebar-" + sidebar); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <nav id="sidebar" class="sidebar" aria-label="Table of contents"> |  | ||||||
|             <div class="sidebar-scrollbox"> |  | ||||||
|                 <ol class="chapter"><li class="chapter-item "><a href="/docserver/introduction.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li class="chapter-item "><a href="/docserver/index.html"><strong aria-hidden="true">2.</strong> What is this ?</a></li><li class="chapter-item "><a href="/docserver/features.html"><strong aria-hidden="true">3.</strong> Features</a></li><li class="chapter-item "><a href="/docserver/howto.html"><strong aria-hidden="true">4.</strong> How to</a></li><li class="chapter-item "><a href="/docserver/quick-start.html"><strong aria-hidden="true">5.</strong> Quick Start</a></li><li class="spacer"></li><li class="chapter-item affix "><li class="part-title">Server and Content</li><li class="chapter-item "><a href="/docserver/one_server.html"><strong aria-hidden="true">6.</strong> One web server instance</a></li><li class="chapter-item expanded "><a href="/docserver/server_modes.html" class="active"><strong aria-hidden="true">7.</strong> Server modes</a></li><li class="chapter-item "><a href="/docserver/static_content.html"><strong aria-hidden="true">8.</strong> Static contents</a></li><li class="chapter-item "><a href="/docserver/url_path.html"><strong aria-hidden="true">9.</strong> url_path prefix</a></li><li class="chapter-item "><a href="/docserver/protect_access.html"><strong aria-hidden="true">10.</strong> Protect access</a></li><li class="chapter-item affix "><li class="part-title">Users and Policies</li><li class="chapter-item "><a href="/docserver/users.html"><strong aria-hidden="true">11.</strong> Users</a></li><li class="chapter-item "><a href="/docserver/users_sql.html"><strong aria-hidden="true">12.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/users_file_storage.html"><strong aria-hidden="true">13.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/roles.html"><strong aria-hidden="true">14.</strong> Roles</a></li><li class="chapter-item "><a href="/docserver/auths.html"><strong aria-hidden="true">15.</strong> Users auths</a></li><li class="chapter-item "><a href="/docserver/policies.html"><strong aria-hidden="true">16.</strong> Access policies</a></li><li class="chapter-item "><a href="/docserver/adminusers.html"><strong aria-hidden="true">17.</strong> Users Admin</a></li><li class="chapter-item affix "><li class="part-title">Sessions</li><li class="chapter-item "><a href="/docserver/sessions.html"><strong aria-hidden="true">18.</strong> Session data</a></li><li class="chapter-item "><a href="/docserver/pasetoken.html"><strong aria-hidden="true">19.</strong> Pasetoken</a></li><li class="chapter-item "><a href="/docserver/sessions_sql.html"><strong aria-hidden="true">20.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/sessions_file_storage.html"><strong aria-hidden="true">21.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/cookie.html"><strong aria-hidden="true">22.</strong> Cookie set</a></li><li class="chapter-item affix "><li class="part-title">Logs and Trace</li><li class="chapter-item "><a href="/docserver/trace.html"><strong aria-hidden="true">23.</strong> Traced</a></li><li class="chapter-item "><a href="/docserver/logs.html"><strong aria-hidden="true">24.</strong> Sessions logs</a></li><li class="chapter-item affix "><li class="part-title">Configuration</li><li class="chapter-item "><a href="/docserver/configuration.html"><strong aria-hidden="true">25.</strong> Configurable service</a></li><li class="chapter-item "><a href="/docserver/settings.html"><strong aria-hidden="true">26.</strong> Config settings</a></li><li class="spacer"></li></ol> |  | ||||||
|             </div> |  | ||||||
|             <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> |  | ||||||
|         </nav> |  | ||||||
| 
 |  | ||||||
|         <div id="page-wrapper" class="page-wrapper"> |  | ||||||
| 
 |  | ||||||
|             <div class="page"> |  | ||||||
|                                 <div id="menu-bar-hover-placeholder"></div> |  | ||||||
|                 <div id="menu-bar" class="menu-bar sticky bordered"> |  | ||||||
|                     <div class="left-buttons"> |  | ||||||
|                         <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> |  | ||||||
|                             <i class="fa fa-bars"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="sidebar-toggle" onclick="location.href='/'" class="icon-button" type="button" title="Home" aria-label="Home" aria-controls=""> |  | ||||||
|                             <i class="fa fa-home"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> |  | ||||||
|                             <i class="fa fa-paint-brush"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> |  | ||||||
|                         </ul> |  | ||||||
|                         <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> |  | ||||||
|                             <i class="fa fa-search"></i> |  | ||||||
|                         </button> |  | ||||||
|                     </div> |  | ||||||
| 
 |  | ||||||
|                     <h1 class="menu-title">Doc Server</h1> |  | ||||||
| 
 |  | ||||||
|                     <div class="right-buttons"> |  | ||||||
|                         <a href="/docserver/print.html" title="Print this book" aria-label="Print this book"> |  | ||||||
|                             <i id="print-button" class="fa fa-print"></i> |  | ||||||
|                         </a> |  | ||||||
|                         <a href="/logout" title="Sing out" aria-label="Sign out"> |  | ||||||
|                             <i id="logout-button" class="fa fa-sign-out"></i> |  | ||||||
|                         </a> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div id="search-wrapper" class="hidden"> |  | ||||||
|                     <form id="searchbar-outer" class="searchbar-outer"> |  | ||||||
|                         <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> |  | ||||||
|                     </form> |  | ||||||
|                     <div id="searchresults-outer" class="searchresults-outer hidden"> |  | ||||||
|                         <div id="searchresults-header" class="searchresults-header"></div> |  | ||||||
|                         <ul id="searchresults"> |  | ||||||
|                         </ul> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> |  | ||||||
|                 <script> |  | ||||||
|                     document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); |  | ||||||
|                     document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); |  | ||||||
|                     Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { |  | ||||||
|                         link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); |  | ||||||
|                     }); |  | ||||||
|                 </script> |  | ||||||
| 
 |  | ||||||
|                 <div id="content" class="content"> |  | ||||||
|                     <main> |  | ||||||
|                         <h1 id="server-modes"><a class="header" href="#server-modes">Server modes</a></h1> |  | ||||||
| 
 |  | ||||||
|                     </main> |  | ||||||
| 
 |  | ||||||
|                     <nav class="nav-wrapper" aria-label="Page navigation"> |  | ||||||
|                         <!-- Mobile navigation buttons --> |  | ||||||
|                             <a rel="prev" href="one_server.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                                 <i class="fa fa-angle-left"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                             <a rel="next" href="static_content.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                                 <i class="fa fa-angle-right"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                         <div style="clear: both"></div> |  | ||||||
|                     </nav> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
| 
 |  | ||||||
|             <nav class="nav-wide-wrapper" aria-label="Page navigation"> |  | ||||||
|                     <a rel="prev" href="one_server.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                         <i class="fa fa-angle-left"></i> |  | ||||||
|                     </a> |  | ||||||
| 
 |  | ||||||
|                     <a rel="next" href="static_content.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                         <i class="fa fa-angle-right"></i> |  | ||||||
|                     </a> |  | ||||||
|             </nav> |  | ||||||
| 
 |  | ||||||
|         </div> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <script> |  | ||||||
|             window.playground_copyable = true; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/ace.js"></script> |  | ||||||
|         <script src="/docserver/editor.js"></script> |  | ||||||
|         <script src="/docserver/mode-rust.js"></script> |  | ||||||
|         <script src="/docserver/theme-dawn.js"></script> |  | ||||||
|         <script src="/docserver/theme-tomorrow_night.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/elasticlunr.min.js"></script> |  | ||||||
|         <script src="/docserver/mark.min.js"></script> |  | ||||||
|         <script src="/docserver/searcher.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/clipboard.min.js"></script> |  | ||||||
|         <script src="/docserver/highlight.js"></script> |  | ||||||
|         <script src="/docserver/book.js"></script> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom JS scripts --> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     </div> |  | ||||||
|     </body> |  | ||||||
| </html> |  | ||||||
| @ -1,212 +0,0 @@ | |||||||
| <!DOCTYPE HTML> |  | ||||||
| <html lang="en" class="sidebar-visible no-js light"> |  | ||||||
|     <head> |  | ||||||
|         <!-- Book generated using mdBook --> |  | ||||||
|         <meta charset="UTF-8"> |  | ||||||
|         <title>Session data - Doc Server</title> |  | ||||||
|         <base href="/docserver/"> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <!-- Custom HTML head --> |  | ||||||
|          |  | ||||||
|         <meta name="description" content="Doc Server"> |  | ||||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> |  | ||||||
|         <meta name="theme-color" content="#ffffff" /> |  | ||||||
| 
 |  | ||||||
|         <link rel="icon" href="/docserver/favicon.svg"> |  | ||||||
|         <link rel="shortcut icon" href="/docserver/favicon.png"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/variables.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/general.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/chrome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/print.css" media="print"> |  | ||||||
| 
 |  | ||||||
|         <!-- Fonts --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/FontAwesome/css/font-awesome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/fonts/fonts.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Highlight.js Stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/highlight.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/tomorrow-night.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/ayu-highlight.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom theme stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/custom.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/mdbook-admonish.css"> |  | ||||||
| 
 |  | ||||||
|     </head> |  | ||||||
|     <body> |  | ||||||
|     <div id="body-container"> |  | ||||||
|         <!-- Provide site root to javascript --> |  | ||||||
|         <script> |  | ||||||
|             var path_to_root = "/docserver/"; |  | ||||||
|             var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light"; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Work around some values being stored in localStorage wrapped in quotes --> |  | ||||||
|         <script> |  | ||||||
|             try { |  | ||||||
|                 var theme = localStorage.getItem('mdbook-theme'); |  | ||||||
|                 var sidebar = localStorage.getItem('mdbook-sidebar'); |  | ||||||
| 
 |  | ||||||
|                 if (theme.startsWith('"') && theme.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (sidebar.startsWith('"') && sidebar.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); |  | ||||||
|                 } |  | ||||||
|             } catch (e) { } |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Set the theme before any content is loaded, prevents flash --> |  | ||||||
|         <script> |  | ||||||
|             var theme; |  | ||||||
|             try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } |  | ||||||
|             if (theme === null || theme === undefined) { theme = default_theme; } |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             html.classList.remove('no-js') |  | ||||||
|             html.classList.remove('light') |  | ||||||
|             html.classList.add(theme); |  | ||||||
|             html.classList.add('js'); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Hide / unhide sidebar before it is displayed --> |  | ||||||
|         <script> |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             var sidebar = null; |  | ||||||
|             if (document.body.clientWidth >= 1080) { |  | ||||||
|                 try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } |  | ||||||
|                 sidebar = sidebar || 'visible'; |  | ||||||
|             } else { |  | ||||||
|                 sidebar = 'hidden'; |  | ||||||
|             } |  | ||||||
|             html.classList.remove('sidebar-visible'); |  | ||||||
|             html.classList.add("sidebar-" + sidebar); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <nav id="sidebar" class="sidebar" aria-label="Table of contents"> |  | ||||||
|             <div class="sidebar-scrollbox"> |  | ||||||
|                 <ol class="chapter"><li class="chapter-item "><a href="/docserver/introduction.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li class="chapter-item "><a href="/docserver/index.html"><strong aria-hidden="true">2.</strong> What is this ?</a></li><li class="chapter-item "><a href="/docserver/features.html"><strong aria-hidden="true">3.</strong> Features</a></li><li class="chapter-item "><a href="/docserver/howto.html"><strong aria-hidden="true">4.</strong> How to</a></li><li class="chapter-item "><a href="/docserver/quick-start.html"><strong aria-hidden="true">5.</strong> Quick Start</a></li><li class="spacer"></li><li class="chapter-item affix "><li class="part-title">Server and Content</li><li class="chapter-item "><a href="/docserver/one_server.html"><strong aria-hidden="true">6.</strong> One web server instance</a></li><li class="chapter-item "><a href="/docserver/server_modes.html"><strong aria-hidden="true">7.</strong> Server modes</a></li><li class="chapter-item "><a href="/docserver/static_content.html"><strong aria-hidden="true">8.</strong> Static contents</a></li><li class="chapter-item "><a href="/docserver/url_path.html"><strong aria-hidden="true">9.</strong> url_path prefix</a></li><li class="chapter-item "><a href="/docserver/protect_access.html"><strong aria-hidden="true">10.</strong> Protect access</a></li><li class="chapter-item affix "><li class="part-title">Users and Policies</li><li class="chapter-item "><a href="/docserver/users.html"><strong aria-hidden="true">11.</strong> Users</a></li><li class="chapter-item "><a href="/docserver/users_sql.html"><strong aria-hidden="true">12.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/users_file_storage.html"><strong aria-hidden="true">13.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/roles.html"><strong aria-hidden="true">14.</strong> Roles</a></li><li class="chapter-item "><a href="/docserver/auths.html"><strong aria-hidden="true">15.</strong> Users auths</a></li><li class="chapter-item "><a href="/docserver/policies.html"><strong aria-hidden="true">16.</strong> Access policies</a></li><li class="chapter-item "><a href="/docserver/adminusers.html"><strong aria-hidden="true">17.</strong> Users Admin</a></li><li class="chapter-item affix "><li class="part-title">Sessions</li><li class="chapter-item expanded "><a href="/docserver/sessions.html" class="active"><strong aria-hidden="true">18.</strong> Session data</a></li><li class="chapter-item "><a href="/docserver/pasetoken.html"><strong aria-hidden="true">19.</strong> Pasetoken</a></li><li class="chapter-item "><a href="/docserver/sessions_sql.html"><strong aria-hidden="true">20.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/sessions_file_storage.html"><strong aria-hidden="true">21.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/cookie.html"><strong aria-hidden="true">22.</strong> Cookie set</a></li><li class="chapter-item affix "><li class="part-title">Logs and Trace</li><li class="chapter-item "><a href="/docserver/trace.html"><strong aria-hidden="true">23.</strong> Traced</a></li><li class="chapter-item "><a href="/docserver/logs.html"><strong aria-hidden="true">24.</strong> Sessions logs</a></li><li class="chapter-item affix "><li class="part-title">Configuration</li><li class="chapter-item "><a href="/docserver/configuration.html"><strong aria-hidden="true">25.</strong> Configurable service</a></li><li class="chapter-item "><a href="/docserver/settings.html"><strong aria-hidden="true">26.</strong> Config settings</a></li><li class="spacer"></li></ol> |  | ||||||
|             </div> |  | ||||||
|             <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> |  | ||||||
|         </nav> |  | ||||||
| 
 |  | ||||||
|         <div id="page-wrapper" class="page-wrapper"> |  | ||||||
| 
 |  | ||||||
|             <div class="page"> |  | ||||||
|                                 <div id="menu-bar-hover-placeholder"></div> |  | ||||||
|                 <div id="menu-bar" class="menu-bar sticky bordered"> |  | ||||||
|                     <div class="left-buttons"> |  | ||||||
|                         <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> |  | ||||||
|                             <i class="fa fa-bars"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="sidebar-toggle" onclick="location.href='/'" class="icon-button" type="button" title="Home" aria-label="Home" aria-controls=""> |  | ||||||
|                             <i class="fa fa-home"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> |  | ||||||
|                             <i class="fa fa-paint-brush"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> |  | ||||||
|                         </ul> |  | ||||||
|                         <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> |  | ||||||
|                             <i class="fa fa-search"></i> |  | ||||||
|                         </button> |  | ||||||
|                     </div> |  | ||||||
| 
 |  | ||||||
|                     <h1 class="menu-title">Doc Server</h1> |  | ||||||
| 
 |  | ||||||
|                     <div class="right-buttons"> |  | ||||||
|                         <a href="/docserver/print.html" title="Print this book" aria-label="Print this book"> |  | ||||||
|                             <i id="print-button" class="fa fa-print"></i> |  | ||||||
|                         </a> |  | ||||||
|                         <a href="/logout" title="Sing out" aria-label="Sign out"> |  | ||||||
|                             <i id="logout-button" class="fa fa-sign-out"></i> |  | ||||||
|                         </a> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div id="search-wrapper" class="hidden"> |  | ||||||
|                     <form id="searchbar-outer" class="searchbar-outer"> |  | ||||||
|                         <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> |  | ||||||
|                     </form> |  | ||||||
|                     <div id="searchresults-outer" class="searchresults-outer hidden"> |  | ||||||
|                         <div id="searchresults-header" class="searchresults-header"></div> |  | ||||||
|                         <ul id="searchresults"> |  | ||||||
|                         </ul> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> |  | ||||||
|                 <script> |  | ||||||
|                     document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); |  | ||||||
|                     document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); |  | ||||||
|                     Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { |  | ||||||
|                         link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); |  | ||||||
|                     }); |  | ||||||
|                 </script> |  | ||||||
| 
 |  | ||||||
|                 <div id="content" class="content"> |  | ||||||
|                     <main> |  | ||||||
|                         <h1 id="session-data"><a class="header" href="#session-data">Session data</a></h1> |  | ||||||
| 
 |  | ||||||
|                     </main> |  | ||||||
| 
 |  | ||||||
|                     <nav class="nav-wrapper" aria-label="Page navigation"> |  | ||||||
|                         <!-- Mobile navigation buttons --> |  | ||||||
|                             <a rel="prev" href="adminusers.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                                 <i class="fa fa-angle-left"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                             <a rel="next" href="pasetoken.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                                 <i class="fa fa-angle-right"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                         <div style="clear: both"></div> |  | ||||||
|                     </nav> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
| 
 |  | ||||||
|             <nav class="nav-wide-wrapper" aria-label="Page navigation"> |  | ||||||
|                     <a rel="prev" href="adminusers.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                         <i class="fa fa-angle-left"></i> |  | ||||||
|                     </a> |  | ||||||
| 
 |  | ||||||
|                     <a rel="next" href="pasetoken.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                         <i class="fa fa-angle-right"></i> |  | ||||||
|                     </a> |  | ||||||
|             </nav> |  | ||||||
| 
 |  | ||||||
|         </div> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <script> |  | ||||||
|             window.playground_copyable = true; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/ace.js"></script> |  | ||||||
|         <script src="/docserver/editor.js"></script> |  | ||||||
|         <script src="/docserver/mode-rust.js"></script> |  | ||||||
|         <script src="/docserver/theme-dawn.js"></script> |  | ||||||
|         <script src="/docserver/theme-tomorrow_night.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/elasticlunr.min.js"></script> |  | ||||||
|         <script src="/docserver/mark.min.js"></script> |  | ||||||
|         <script src="/docserver/searcher.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/clipboard.min.js"></script> |  | ||||||
|         <script src="/docserver/highlight.js"></script> |  | ||||||
|         <script src="/docserver/book.js"></script> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom JS scripts --> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     </div> |  | ||||||
|     </body> |  | ||||||
| </html> |  | ||||||
| @ -1,212 +0,0 @@ | |||||||
| <!DOCTYPE HTML> |  | ||||||
| <html lang="en" class="sidebar-visible no-js light"> |  | ||||||
|     <head> |  | ||||||
|         <!-- Book generated using mdBook --> |  | ||||||
|         <meta charset="UTF-8"> |  | ||||||
|         <title>File storage - Doc Server</title> |  | ||||||
|         <base href="/docserver/"> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <!-- Custom HTML head --> |  | ||||||
|          |  | ||||||
|         <meta name="description" content="Doc Server"> |  | ||||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> |  | ||||||
|         <meta name="theme-color" content="#ffffff" /> |  | ||||||
| 
 |  | ||||||
|         <link rel="icon" href="/docserver/favicon.svg"> |  | ||||||
|         <link rel="shortcut icon" href="/docserver/favicon.png"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/variables.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/general.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/chrome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/print.css" media="print"> |  | ||||||
| 
 |  | ||||||
|         <!-- Fonts --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/FontAwesome/css/font-awesome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/fonts/fonts.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Highlight.js Stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/highlight.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/tomorrow-night.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/ayu-highlight.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom theme stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/custom.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/mdbook-admonish.css"> |  | ||||||
| 
 |  | ||||||
|     </head> |  | ||||||
|     <body> |  | ||||||
|     <div id="body-container"> |  | ||||||
|         <!-- Provide site root to javascript --> |  | ||||||
|         <script> |  | ||||||
|             var path_to_root = "/docserver/"; |  | ||||||
|             var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light"; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Work around some values being stored in localStorage wrapped in quotes --> |  | ||||||
|         <script> |  | ||||||
|             try { |  | ||||||
|                 var theme = localStorage.getItem('mdbook-theme'); |  | ||||||
|                 var sidebar = localStorage.getItem('mdbook-sidebar'); |  | ||||||
| 
 |  | ||||||
|                 if (theme.startsWith('"') && theme.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (sidebar.startsWith('"') && sidebar.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); |  | ||||||
|                 } |  | ||||||
|             } catch (e) { } |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Set the theme before any content is loaded, prevents flash --> |  | ||||||
|         <script> |  | ||||||
|             var theme; |  | ||||||
|             try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } |  | ||||||
|             if (theme === null || theme === undefined) { theme = default_theme; } |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             html.classList.remove('no-js') |  | ||||||
|             html.classList.remove('light') |  | ||||||
|             html.classList.add(theme); |  | ||||||
|             html.classList.add('js'); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Hide / unhide sidebar before it is displayed --> |  | ||||||
|         <script> |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             var sidebar = null; |  | ||||||
|             if (document.body.clientWidth >= 1080) { |  | ||||||
|                 try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } |  | ||||||
|                 sidebar = sidebar || 'visible'; |  | ||||||
|             } else { |  | ||||||
|                 sidebar = 'hidden'; |  | ||||||
|             } |  | ||||||
|             html.classList.remove('sidebar-visible'); |  | ||||||
|             html.classList.add("sidebar-" + sidebar); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <nav id="sidebar" class="sidebar" aria-label="Table of contents"> |  | ||||||
|             <div class="sidebar-scrollbox"> |  | ||||||
|                 <ol class="chapter"><li class="chapter-item "><a href="/docserver/introduction.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li class="chapter-item "><a href="/docserver/index.html"><strong aria-hidden="true">2.</strong> What is this ?</a></li><li class="chapter-item "><a href="/docserver/features.html"><strong aria-hidden="true">3.</strong> Features</a></li><li class="chapter-item "><a href="/docserver/howto.html"><strong aria-hidden="true">4.</strong> How to</a></li><li class="chapter-item "><a href="/docserver/quick-start.html"><strong aria-hidden="true">5.</strong> Quick Start</a></li><li class="spacer"></li><li class="chapter-item affix "><li class="part-title">Server and Content</li><li class="chapter-item "><a href="/docserver/one_server.html"><strong aria-hidden="true">6.</strong> One web server instance</a></li><li class="chapter-item "><a href="/docserver/server_modes.html"><strong aria-hidden="true">7.</strong> Server modes</a></li><li class="chapter-item "><a href="/docserver/static_content.html"><strong aria-hidden="true">8.</strong> Static contents</a></li><li class="chapter-item "><a href="/docserver/url_path.html"><strong aria-hidden="true">9.</strong> url_path prefix</a></li><li class="chapter-item "><a href="/docserver/protect_access.html"><strong aria-hidden="true">10.</strong> Protect access</a></li><li class="chapter-item affix "><li class="part-title">Users and Policies</li><li class="chapter-item "><a href="/docserver/users.html"><strong aria-hidden="true">11.</strong> Users</a></li><li class="chapter-item "><a href="/docserver/users_sql.html"><strong aria-hidden="true">12.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/users_file_storage.html"><strong aria-hidden="true">13.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/roles.html"><strong aria-hidden="true">14.</strong> Roles</a></li><li class="chapter-item "><a href="/docserver/auths.html"><strong aria-hidden="true">15.</strong> Users auths</a></li><li class="chapter-item "><a href="/docserver/policies.html"><strong aria-hidden="true">16.</strong> Access policies</a></li><li class="chapter-item "><a href="/docserver/adminusers.html"><strong aria-hidden="true">17.</strong> Users Admin</a></li><li class="chapter-item affix "><li class="part-title">Sessions</li><li class="chapter-item "><a href="/docserver/sessions.html"><strong aria-hidden="true">18.</strong> Session data</a></li><li class="chapter-item "><a href="/docserver/pasetoken.html"><strong aria-hidden="true">19.</strong> Pasetoken</a></li><li class="chapter-item "><a href="/docserver/sessions_sql.html"><strong aria-hidden="true">20.</strong> SQL storage</a></li><li class="chapter-item expanded "><a href="/docserver/sessions_file_storage.html" class="active"><strong aria-hidden="true">21.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/cookie.html"><strong aria-hidden="true">22.</strong> Cookie set</a></li><li class="chapter-item affix "><li class="part-title">Logs and Trace</li><li class="chapter-item "><a href="/docserver/trace.html"><strong aria-hidden="true">23.</strong> Traced</a></li><li class="chapter-item "><a href="/docserver/logs.html"><strong aria-hidden="true">24.</strong> Sessions logs</a></li><li class="chapter-item affix "><li class="part-title">Configuration</li><li class="chapter-item "><a href="/docserver/configuration.html"><strong aria-hidden="true">25.</strong> Configurable service</a></li><li class="chapter-item "><a href="/docserver/settings.html"><strong aria-hidden="true">26.</strong> Config settings</a></li><li class="spacer"></li></ol> |  | ||||||
|             </div> |  | ||||||
|             <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> |  | ||||||
|         </nav> |  | ||||||
| 
 |  | ||||||
|         <div id="page-wrapper" class="page-wrapper"> |  | ||||||
| 
 |  | ||||||
|             <div class="page"> |  | ||||||
|                                 <div id="menu-bar-hover-placeholder"></div> |  | ||||||
|                 <div id="menu-bar" class="menu-bar sticky bordered"> |  | ||||||
|                     <div class="left-buttons"> |  | ||||||
|                         <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> |  | ||||||
|                             <i class="fa fa-bars"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="sidebar-toggle" onclick="location.href='/'" class="icon-button" type="button" title="Home" aria-label="Home" aria-controls=""> |  | ||||||
|                             <i class="fa fa-home"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> |  | ||||||
|                             <i class="fa fa-paint-brush"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> |  | ||||||
|                         </ul> |  | ||||||
|                         <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> |  | ||||||
|                             <i class="fa fa-search"></i> |  | ||||||
|                         </button> |  | ||||||
|                     </div> |  | ||||||
| 
 |  | ||||||
|                     <h1 class="menu-title">Doc Server</h1> |  | ||||||
| 
 |  | ||||||
|                     <div class="right-buttons"> |  | ||||||
|                         <a href="/docserver/print.html" title="Print this book" aria-label="Print this book"> |  | ||||||
|                             <i id="print-button" class="fa fa-print"></i> |  | ||||||
|                         </a> |  | ||||||
|                         <a href="/logout" title="Sing out" aria-label="Sign out"> |  | ||||||
|                             <i id="logout-button" class="fa fa-sign-out"></i> |  | ||||||
|                         </a> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div id="search-wrapper" class="hidden"> |  | ||||||
|                     <form id="searchbar-outer" class="searchbar-outer"> |  | ||||||
|                         <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> |  | ||||||
|                     </form> |  | ||||||
|                     <div id="searchresults-outer" class="searchresults-outer hidden"> |  | ||||||
|                         <div id="searchresults-header" class="searchresults-header"></div> |  | ||||||
|                         <ul id="searchresults"> |  | ||||||
|                         </ul> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> |  | ||||||
|                 <script> |  | ||||||
|                     document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); |  | ||||||
|                     document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); |  | ||||||
|                     Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { |  | ||||||
|                         link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); |  | ||||||
|                     }); |  | ||||||
|                 </script> |  | ||||||
| 
 |  | ||||||
|                 <div id="content" class="content"> |  | ||||||
|                     <main> |  | ||||||
|                         <h1 id="file-storage"><a class="header" href="#file-storage">File storage</a></h1> |  | ||||||
| 
 |  | ||||||
|                     </main> |  | ||||||
| 
 |  | ||||||
|                     <nav class="nav-wrapper" aria-label="Page navigation"> |  | ||||||
|                         <!-- Mobile navigation buttons --> |  | ||||||
|                             <a rel="prev" href="sessions_sql.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                                 <i class="fa fa-angle-left"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                             <a rel="next" href="cookie.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                                 <i class="fa fa-angle-right"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                         <div style="clear: both"></div> |  | ||||||
|                     </nav> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
| 
 |  | ||||||
|             <nav class="nav-wide-wrapper" aria-label="Page navigation"> |  | ||||||
|                     <a rel="prev" href="sessions_sql.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                         <i class="fa fa-angle-left"></i> |  | ||||||
|                     </a> |  | ||||||
| 
 |  | ||||||
|                     <a rel="next" href="cookie.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                         <i class="fa fa-angle-right"></i> |  | ||||||
|                     </a> |  | ||||||
|             </nav> |  | ||||||
| 
 |  | ||||||
|         </div> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <script> |  | ||||||
|             window.playground_copyable = true; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/ace.js"></script> |  | ||||||
|         <script src="/docserver/editor.js"></script> |  | ||||||
|         <script src="/docserver/mode-rust.js"></script> |  | ||||||
|         <script src="/docserver/theme-dawn.js"></script> |  | ||||||
|         <script src="/docserver/theme-tomorrow_night.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/elasticlunr.min.js"></script> |  | ||||||
|         <script src="/docserver/mark.min.js"></script> |  | ||||||
|         <script src="/docserver/searcher.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/clipboard.min.js"></script> |  | ||||||
|         <script src="/docserver/highlight.js"></script> |  | ||||||
|         <script src="/docserver/book.js"></script> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom JS scripts --> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     </div> |  | ||||||
|     </body> |  | ||||||
| </html> |  | ||||||
| @ -1,236 +0,0 @@ | |||||||
| <!DOCTYPE HTML> |  | ||||||
| <html lang="en" class="sidebar-visible no-js light"> |  | ||||||
|     <head> |  | ||||||
|         <!-- Book generated using mdBook --> |  | ||||||
|         <meta charset="UTF-8"> |  | ||||||
|         <title>SQL storage - Doc Server</title> |  | ||||||
|         <base href="/docserver/"> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <!-- Custom HTML head --> |  | ||||||
|          |  | ||||||
|         <meta name="description" content="Doc Server"> |  | ||||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> |  | ||||||
|         <meta name="theme-color" content="#ffffff" /> |  | ||||||
| 
 |  | ||||||
|         <link rel="icon" href="/docserver/favicon.svg"> |  | ||||||
|         <link rel="shortcut icon" href="/docserver/favicon.png"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/variables.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/general.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/chrome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/print.css" media="print"> |  | ||||||
| 
 |  | ||||||
|         <!-- Fonts --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/FontAwesome/css/font-awesome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/fonts/fonts.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Highlight.js Stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/highlight.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/tomorrow-night.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/ayu-highlight.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom theme stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/custom.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/mdbook-admonish.css"> |  | ||||||
| 
 |  | ||||||
|     </head> |  | ||||||
|     <body> |  | ||||||
|     <div id="body-container"> |  | ||||||
|         <!-- Provide site root to javascript --> |  | ||||||
|         <script> |  | ||||||
|             var path_to_root = "/docserver/"; |  | ||||||
|             var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light"; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Work around some values being stored in localStorage wrapped in quotes --> |  | ||||||
|         <script> |  | ||||||
|             try { |  | ||||||
|                 var theme = localStorage.getItem('mdbook-theme'); |  | ||||||
|                 var sidebar = localStorage.getItem('mdbook-sidebar'); |  | ||||||
| 
 |  | ||||||
|                 if (theme.startsWith('"') && theme.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (sidebar.startsWith('"') && sidebar.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); |  | ||||||
|                 } |  | ||||||
|             } catch (e) { } |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Set the theme before any content is loaded, prevents flash --> |  | ||||||
|         <script> |  | ||||||
|             var theme; |  | ||||||
|             try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } |  | ||||||
|             if (theme === null || theme === undefined) { theme = default_theme; } |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             html.classList.remove('no-js') |  | ||||||
|             html.classList.remove('light') |  | ||||||
|             html.classList.add(theme); |  | ||||||
|             html.classList.add('js'); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Hide / unhide sidebar before it is displayed --> |  | ||||||
|         <script> |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             var sidebar = null; |  | ||||||
|             if (document.body.clientWidth >= 1080) { |  | ||||||
|                 try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } |  | ||||||
|                 sidebar = sidebar || 'visible'; |  | ||||||
|             } else { |  | ||||||
|                 sidebar = 'hidden'; |  | ||||||
|             } |  | ||||||
|             html.classList.remove('sidebar-visible'); |  | ||||||
|             html.classList.add("sidebar-" + sidebar); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <nav id="sidebar" class="sidebar" aria-label="Table of contents"> |  | ||||||
|             <div class="sidebar-scrollbox"> |  | ||||||
|                 <ol class="chapter"><li class="chapter-item "><a href="/docserver/introduction.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li class="chapter-item "><a href="/docserver/index.html"><strong aria-hidden="true">2.</strong> What is this ?</a></li><li class="chapter-item "><a href="/docserver/features.html"><strong aria-hidden="true">3.</strong> Features</a></li><li class="chapter-item "><a href="/docserver/howto.html"><strong aria-hidden="true">4.</strong> How to</a></li><li class="chapter-item "><a href="/docserver/quick-start.html"><strong aria-hidden="true">5.</strong> Quick Start</a></li><li class="spacer"></li><li class="chapter-item affix "><li class="part-title">Server and Content</li><li class="chapter-item "><a href="/docserver/one_server.html"><strong aria-hidden="true">6.</strong> One web server instance</a></li><li class="chapter-item "><a href="/docserver/server_modes.html"><strong aria-hidden="true">7.</strong> Server modes</a></li><li class="chapter-item "><a href="/docserver/static_content.html"><strong aria-hidden="true">8.</strong> Static contents</a></li><li class="chapter-item "><a href="/docserver/url_path.html"><strong aria-hidden="true">9.</strong> url_path prefix</a></li><li class="chapter-item "><a href="/docserver/protect_access.html"><strong aria-hidden="true">10.</strong> Protect access</a></li><li class="chapter-item affix "><li class="part-title">Users and Policies</li><li class="chapter-item "><a href="/docserver/users.html"><strong aria-hidden="true">11.</strong> Users</a></li><li class="chapter-item "><a href="/docserver/users_sql.html"><strong aria-hidden="true">12.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/users_file_storage.html"><strong aria-hidden="true">13.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/roles.html"><strong aria-hidden="true">14.</strong> Roles</a></li><li class="chapter-item "><a href="/docserver/auths.html"><strong aria-hidden="true">15.</strong> Users auths</a></li><li class="chapter-item "><a href="/docserver/policies.html"><strong aria-hidden="true">16.</strong> Access policies</a></li><li class="chapter-item "><a href="/docserver/adminusers.html"><strong aria-hidden="true">17.</strong> Users Admin</a></li><li class="chapter-item affix "><li class="part-title">Sessions</li><li class="chapter-item "><a href="/docserver/sessions.html"><strong aria-hidden="true">18.</strong> Session data</a></li><li class="chapter-item "><a href="/docserver/pasetoken.html"><strong aria-hidden="true">19.</strong> Pasetoken</a></li><li class="chapter-item expanded "><a href="/docserver/sessions_sql.html" class="active"><strong aria-hidden="true">20.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/sessions_file_storage.html"><strong aria-hidden="true">21.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/cookie.html"><strong aria-hidden="true">22.</strong> Cookie set</a></li><li class="chapter-item affix "><li class="part-title">Logs and Trace</li><li class="chapter-item "><a href="/docserver/trace.html"><strong aria-hidden="true">23.</strong> Traced</a></li><li class="chapter-item "><a href="/docserver/logs.html"><strong aria-hidden="true">24.</strong> Sessions logs</a></li><li class="chapter-item affix "><li class="part-title">Configuration</li><li class="chapter-item "><a href="/docserver/configuration.html"><strong aria-hidden="true">25.</strong> Configurable service</a></li><li class="chapter-item "><a href="/docserver/settings.html"><strong aria-hidden="true">26.</strong> Config settings</a></li><li class="spacer"></li></ol> |  | ||||||
|             </div> |  | ||||||
|             <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> |  | ||||||
|         </nav> |  | ||||||
| 
 |  | ||||||
|         <div id="page-wrapper" class="page-wrapper"> |  | ||||||
| 
 |  | ||||||
|             <div class="page"> |  | ||||||
|                                 <div id="menu-bar-hover-placeholder"></div> |  | ||||||
|                 <div id="menu-bar" class="menu-bar sticky bordered"> |  | ||||||
|                     <div class="left-buttons"> |  | ||||||
|                         <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> |  | ||||||
|                             <i class="fa fa-bars"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="sidebar-toggle" onclick="location.href='/'" class="icon-button" type="button" title="Home" aria-label="Home" aria-controls=""> |  | ||||||
|                             <i class="fa fa-home"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> |  | ||||||
|                             <i class="fa fa-paint-brush"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> |  | ||||||
|                         </ul> |  | ||||||
|                         <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> |  | ||||||
|                             <i class="fa fa-search"></i> |  | ||||||
|                         </button> |  | ||||||
|                     </div> |  | ||||||
| 
 |  | ||||||
|                     <h1 class="menu-title">Doc Server</h1> |  | ||||||
| 
 |  | ||||||
|                     <div class="right-buttons"> |  | ||||||
|                         <a href="/docserver/print.html" title="Print this book" aria-label="Print this book"> |  | ||||||
|                             <i id="print-button" class="fa fa-print"></i> |  | ||||||
|                         </a> |  | ||||||
|                         <a href="/logout" title="Sing out" aria-label="Sign out"> |  | ||||||
|                             <i id="logout-button" class="fa fa-sign-out"></i> |  | ||||||
|                         </a> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div id="search-wrapper" class="hidden"> |  | ||||||
|                     <form id="searchbar-outer" class="searchbar-outer"> |  | ||||||
|                         <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> |  | ||||||
|                     </form> |  | ||||||
|                     <div id="searchresults-outer" class="searchresults-outer hidden"> |  | ||||||
|                         <div id="searchresults-header" class="searchresults-header"></div> |  | ||||||
|                         <ul id="searchresults"> |  | ||||||
|                         </ul> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> |  | ||||||
|                 <script> |  | ||||||
|                     document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); |  | ||||||
|                     document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); |  | ||||||
|                     Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { |  | ||||||
|                         link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); |  | ||||||
|                     }); |  | ||||||
|                 </script> |  | ||||||
| 
 |  | ||||||
|                 <div id="content" class="content"> |  | ||||||
|                     <main> |  | ||||||
|                         <h1 id="sql-storage"><a class="header" href="#sql-storage">SQL storage</a></h1> |  | ||||||
| <p><a href="/docserver/">Doc Server</a> <a href="sessions.html">Sesssions</a> use <a href="https://www.rust-lang.org">Rust</a> crate <a href="https://github.com/http-rs/async-session">async_session</a> for storage or data persistence, so bassically there are several stores to use.</p> |  | ||||||
| <p>To keep it small and simple <a href="https://github.com/jbr/async-sqlx-session">async-sqlx-session</a> is implemented by default with <a href="https://sqlite.org">SQLite</a> but as it is based on <a href="https://github.com/launchbadge/sqlx">SQLx</a> is is <u>Database Agnostic</u> and it easily support any other choice: <a href="http://postgresql.org/">PostgreSQL</a>, <a href="https://www.mysql.com/">MySQL</a>, <a href="https://sqlite.org/">SQLite</a>, and <a href="https://www.microsoft.com/en-us/sql-server">MSSQL</a>.</p> |  | ||||||
| <p><a href="https://github.com/launchbadge/sqlx">SQLx</a> is also used for <a href="users.html">users</a> <a href="users_sql.html">SQL storage</a>.</p> |  | ||||||
| <div id="admonition-sessions-store-criteria" class="admonition note"> |  | ||||||
| <div class="admonition-title"> |  | ||||||
| <p>Sessions store criteria</p> |  | ||||||
| <p><a class="admonition-anchor-link" href="#admonition-sessions-store-criteria"></a></p> |  | ||||||
| </div> |  | ||||||
| <div> |  | ||||||
| <p><strong>Control access</strong> to <a href="static_content.html">static contents</a> paths requires <a href="sessions.html">Session data</a> stored in database, <a href="cookies.html">cookies</a> contains basically a <a href="sessions.html">Session ID</a> with no extra content, all other (<a href="users.html">user</a> or <a href="sessions.html">session</a>) data require database access.</p> |  | ||||||
| <p>If many concurrent sessions are expected to be supported, probalby will be better to use other database option for perforrmance, rather than send more data to clients.</p> |  | ||||||
| </div> |  | ||||||
| </div> |  | ||||||
| <div id="admonition-separate-databases-for-session-and-users" class="admonition warning"> |  | ||||||
| <div class="admonition-title"> |  | ||||||
| <p>Separate databases for Session and Users</p> |  | ||||||
| <p><a class="admonition-anchor-link" href="#admonition-separate-databases-for-session-and-users"></a></p> |  | ||||||
| </div> |  | ||||||
| <div> |  | ||||||
| <p><a href="sessions.html">Sessions</a> and <a href="users.html">Users</a> can use same database store by simply using same <strong>uri config values</strong>:</p> |  | ||||||
| </div> |  | ||||||
| </div> |  | ||||||
| <h2 id="setup"><a class="header" href="#setup">Setup</a></h2> |  | ||||||
| <p><a href="https://github.com/tokio-rs/axum">Axum</a></p> |  | ||||||
| 
 |  | ||||||
|                     </main> |  | ||||||
| 
 |  | ||||||
|                     <nav class="nav-wrapper" aria-label="Page navigation"> |  | ||||||
|                         <!-- Mobile navigation buttons --> |  | ||||||
|                             <a rel="prev" href="pasetoken.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                                 <i class="fa fa-angle-left"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                             <a rel="next" href="sessions_file_storage.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                                 <i class="fa fa-angle-right"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                         <div style="clear: both"></div> |  | ||||||
|                     </nav> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
| 
 |  | ||||||
|             <nav class="nav-wide-wrapper" aria-label="Page navigation"> |  | ||||||
|                     <a rel="prev" href="pasetoken.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                         <i class="fa fa-angle-left"></i> |  | ||||||
|                     </a> |  | ||||||
| 
 |  | ||||||
|                     <a rel="next" href="sessions_file_storage.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                         <i class="fa fa-angle-right"></i> |  | ||||||
|                     </a> |  | ||||||
|             </nav> |  | ||||||
| 
 |  | ||||||
|         </div> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <script> |  | ||||||
|             window.playground_copyable = true; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/ace.js"></script> |  | ||||||
|         <script src="/docserver/editor.js"></script> |  | ||||||
|         <script src="/docserver/mode-rust.js"></script> |  | ||||||
|         <script src="/docserver/theme-dawn.js"></script> |  | ||||||
|         <script src="/docserver/theme-tomorrow_night.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/elasticlunr.min.js"></script> |  | ||||||
|         <script src="/docserver/mark.min.js"></script> |  | ||||||
|         <script src="/docserver/searcher.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/clipboard.min.js"></script> |  | ||||||
|         <script src="/docserver/highlight.js"></script> |  | ||||||
|         <script src="/docserver/book.js"></script> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom JS scripts --> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     </div> |  | ||||||
|     </body> |  | ||||||
| </html> |  | ||||||
| @ -1,359 +0,0 @@ | |||||||
| <!DOCTYPE HTML> |  | ||||||
| <html lang="en" class="sidebar-visible no-js light"> |  | ||||||
|     <head> |  | ||||||
|         <!-- Book generated using mdBook --> |  | ||||||
|         <meta charset="UTF-8"> |  | ||||||
|         <title>Config settings - Doc Server</title> |  | ||||||
|         <base href="/docserver/"> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <!-- Custom HTML head --> |  | ||||||
|          |  | ||||||
|         <meta name="description" content="Doc Server"> |  | ||||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> |  | ||||||
|         <meta name="theme-color" content="#ffffff" /> |  | ||||||
| 
 |  | ||||||
|         <link rel="icon" href="/docserver/favicon.svg"> |  | ||||||
|         <link rel="shortcut icon" href="/docserver/favicon.png"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/variables.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/general.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/chrome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/print.css" media="print"> |  | ||||||
| 
 |  | ||||||
|         <!-- Fonts --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/FontAwesome/css/font-awesome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/fonts/fonts.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Highlight.js Stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/highlight.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/tomorrow-night.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/ayu-highlight.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom theme stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/custom.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/mdbook-admonish.css"> |  | ||||||
| 
 |  | ||||||
|     </head> |  | ||||||
|     <body> |  | ||||||
|     <div id="body-container"> |  | ||||||
|         <!-- Provide site root to javascript --> |  | ||||||
|         <script> |  | ||||||
|             var path_to_root = "/docserver/"; |  | ||||||
|             var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light"; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Work around some values being stored in localStorage wrapped in quotes --> |  | ||||||
|         <script> |  | ||||||
|             try { |  | ||||||
|                 var theme = localStorage.getItem('mdbook-theme'); |  | ||||||
|                 var sidebar = localStorage.getItem('mdbook-sidebar'); |  | ||||||
| 
 |  | ||||||
|                 if (theme.startsWith('"') && theme.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (sidebar.startsWith('"') && sidebar.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); |  | ||||||
|                 } |  | ||||||
|             } catch (e) { } |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Set the theme before any content is loaded, prevents flash --> |  | ||||||
|         <script> |  | ||||||
|             var theme; |  | ||||||
|             try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } |  | ||||||
|             if (theme === null || theme === undefined) { theme = default_theme; } |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             html.classList.remove('no-js') |  | ||||||
|             html.classList.remove('light') |  | ||||||
|             html.classList.add(theme); |  | ||||||
|             html.classList.add('js'); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Hide / unhide sidebar before it is displayed --> |  | ||||||
|         <script> |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             var sidebar = null; |  | ||||||
|             if (document.body.clientWidth >= 1080) { |  | ||||||
|                 try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } |  | ||||||
|                 sidebar = sidebar || 'visible'; |  | ||||||
|             } else { |  | ||||||
|                 sidebar = 'hidden'; |  | ||||||
|             } |  | ||||||
|             html.classList.remove('sidebar-visible'); |  | ||||||
|             html.classList.add("sidebar-" + sidebar); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <nav id="sidebar" class="sidebar" aria-label="Table of contents"> |  | ||||||
|             <div class="sidebar-scrollbox"> |  | ||||||
|                 <ol class="chapter"><li class="chapter-item "><a href="/docserver/introduction.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li class="chapter-item "><a href="/docserver/index.html"><strong aria-hidden="true">2.</strong> What is this ?</a></li><li class="chapter-item "><a href="/docserver/features.html"><strong aria-hidden="true">3.</strong> Features</a></li><li class="chapter-item "><a href="/docserver/howto.html"><strong aria-hidden="true">4.</strong> How to</a></li><li class="chapter-item "><a href="/docserver/quick-start.html"><strong aria-hidden="true">5.</strong> Quick Start</a></li><li class="spacer"></li><li class="chapter-item affix "><li class="part-title">Server and Content</li><li class="chapter-item "><a href="/docserver/one_server.html"><strong aria-hidden="true">6.</strong> One web server instance</a></li><li class="chapter-item "><a href="/docserver/server_modes.html"><strong aria-hidden="true">7.</strong> Server modes</a></li><li class="chapter-item "><a href="/docserver/static_content.html"><strong aria-hidden="true">8.</strong> Static contents</a></li><li class="chapter-item "><a href="/docserver/url_path.html"><strong aria-hidden="true">9.</strong> url_path prefix</a></li><li class="chapter-item "><a href="/docserver/protect_access.html"><strong aria-hidden="true">10.</strong> Protect access</a></li><li class="chapter-item affix "><li class="part-title">Users and Policies</li><li class="chapter-item "><a href="/docserver/users.html"><strong aria-hidden="true">11.</strong> Users</a></li><li class="chapter-item "><a href="/docserver/users_sql.html"><strong aria-hidden="true">12.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/users_file_storage.html"><strong aria-hidden="true">13.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/roles.html"><strong aria-hidden="true">14.</strong> Roles</a></li><li class="chapter-item "><a href="/docserver/auths.html"><strong aria-hidden="true">15.</strong> Users auths</a></li><li class="chapter-item "><a href="/docserver/policies.html"><strong aria-hidden="true">16.</strong> Access policies</a></li><li class="chapter-item "><a href="/docserver/adminusers.html"><strong aria-hidden="true">17.</strong> Users Admin</a></li><li class="chapter-item affix "><li class="part-title">Sessions</li><li class="chapter-item "><a href="/docserver/sessions.html"><strong aria-hidden="true">18.</strong> Session data</a></li><li class="chapter-item "><a href="/docserver/pasetoken.html"><strong aria-hidden="true">19.</strong> Pasetoken</a></li><li class="chapter-item "><a href="/docserver/sessions_sql.html"><strong aria-hidden="true">20.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/sessions_file_storage.html"><strong aria-hidden="true">21.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/cookie.html"><strong aria-hidden="true">22.</strong> Cookie set</a></li><li class="chapter-item affix "><li class="part-title">Logs and Trace</li><li class="chapter-item "><a href="/docserver/trace.html"><strong aria-hidden="true">23.</strong> Traced</a></li><li class="chapter-item "><a href="/docserver/logs.html"><strong aria-hidden="true">24.</strong> Sessions logs</a></li><li class="chapter-item affix "><li class="part-title">Configuration</li><li class="chapter-item "><a href="/docserver/configuration.html"><strong aria-hidden="true">25.</strong> Configurable service</a></li><li class="chapter-item expanded "><a href="/docserver/settings.html" class="active"><strong aria-hidden="true">26.</strong> Config settings</a></li><li class="spacer"></li></ol> |  | ||||||
|             </div> |  | ||||||
|             <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> |  | ||||||
|         </nav> |  | ||||||
| 
 |  | ||||||
|         <div id="page-wrapper" class="page-wrapper"> |  | ||||||
| 
 |  | ||||||
|             <div class="page"> |  | ||||||
|                                 <div id="menu-bar-hover-placeholder"></div> |  | ||||||
|                 <div id="menu-bar" class="menu-bar sticky bordered"> |  | ||||||
|                     <div class="left-buttons"> |  | ||||||
|                         <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> |  | ||||||
|                             <i class="fa fa-bars"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="sidebar-toggle" onclick="location.href='/'" class="icon-button" type="button" title="Home" aria-label="Home" aria-controls=""> |  | ||||||
|                             <i class="fa fa-home"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> |  | ||||||
|                             <i class="fa fa-paint-brush"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> |  | ||||||
|                         </ul> |  | ||||||
|                         <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> |  | ||||||
|                             <i class="fa fa-search"></i> |  | ||||||
|                         </button> |  | ||||||
|                     </div> |  | ||||||
| 
 |  | ||||||
|                     <h1 class="menu-title">Doc Server</h1> |  | ||||||
| 
 |  | ||||||
|                     <div class="right-buttons"> |  | ||||||
|                         <a href="/docserver/print.html" title="Print this book" aria-label="Print this book"> |  | ||||||
|                             <i id="print-button" class="fa fa-print"></i> |  | ||||||
|                         </a> |  | ||||||
|                         <a href="/logout" title="Sing out" aria-label="Sign out"> |  | ||||||
|                             <i id="logout-button" class="fa fa-sign-out"></i> |  | ||||||
|                         </a> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div id="search-wrapper" class="hidden"> |  | ||||||
|                     <form id="searchbar-outer" class="searchbar-outer"> |  | ||||||
|                         <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> |  | ||||||
|                     </form> |  | ||||||
|                     <div id="searchresults-outer" class="searchresults-outer hidden"> |  | ||||||
|                         <div id="searchresults-header" class="searchresults-header"></div> |  | ||||||
|                         <ul id="searchresults"> |  | ||||||
|                         </ul> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> |  | ||||||
|                 <script> |  | ||||||
|                     document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); |  | ||||||
|                     document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); |  | ||||||
|                     Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { |  | ||||||
|                         link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); |  | ||||||
|                     }); |  | ||||||
|                 </script> |  | ||||||
| 
 |  | ||||||
|                 <div id="content" class="content"> |  | ||||||
|                     <main> |  | ||||||
|                         <h1 id="config-settings"><a class="header" href="#config-settings">Config settings</a></h1> |  | ||||||
| <p>This is an example of <a href="/connfiguration.html">configuration file</a></p> |  | ||||||
| <p>Most of settings have default values to “/”  for paths or “” for text or false for boolean, if are not set properly <a href="/docserver/">Doc Server</a> config loadd will dispplay ain error an will not abort running.</p> |  | ||||||
| <p>Attributes order does not matter, in case of file path attributes relative path (the ones ending with path“) is tried and finally <strong>root_path</strong> valued as root path for values. Pay attention to <strong>cert</strong> and <strong>key</strong> paths</p> |  | ||||||
| <p>Base layout for example below as <strong>config.toml</strong>:</p> |  | ||||||
| <pre><code class="language-text">── Cargo.lock |  | ||||||
| ├── Cargo.toml |  | ||||||
| ├── certs  |  | ||||||
| │   ├── fullchain.pem |  | ||||||
| │   └── privkey.pem |  | ||||||
| ├── config.toml |  | ||||||
| ├── data |  | ||||||
| │   ├── users.db |  | ||||||
| │   └── sessions.db |  | ||||||
| ├── mdbook |  | ||||||
| ├── migrations |  | ||||||
| │   ├── users.sql |  | ||||||
| │   └── view.sql |  | ||||||
| ├── sitehome |  | ||||||
| │   ├── assets |  | ||||||
| │   ├── appdoc |  | ||||||
| │   ├── html |  | ||||||
| │   └── templates |  | ||||||
| ├── src |  | ||||||
| ├── paseto |  | ||||||
| │   ├── public.ky |  | ||||||
| │   └── secret.ky |  | ||||||
| └── tools |  | ||||||
|     └── get_mail_token.sh |  | ||||||
| </code></pre> |  | ||||||
| <pre><code class="language-toml">root_path = "sitehome" |  | ||||||
| name = "docserver" |  | ||||||
| org = "ORG" |  | ||||||
| verbose = 2 |  | ||||||
| home_path = "" |  | ||||||
| prefix = "" |  | ||||||
| resources_path = "resources" |  | ||||||
| 
 |  | ||||||
| # Certs for SSL  |  | ||||||
| cert_file = "certs/fullchain.pem" |  | ||||||
| key_file = "certs/privkey.pem" |  | ||||||
| 
 |  | ||||||
| templates_path = "templates" |  | ||||||
| defaults_path = "resources/defaults" |  | ||||||
| 
 |  | ||||||
| html_url = "/html" |  | ||||||
| assets_url = "/assets" |  | ||||||
| 
 |  | ||||||
| allow_origin = ["http://localhost:8080"] |  | ||||||
| 
 |  | ||||||
| # HOST ip or name for Web service |  | ||||||
| hostport = "docs.example.com:8800" |  | ||||||
| bnd = "0.0.0.0" |  | ||||||
| 
 |  | ||||||
| # PORT for Web service |  | ||||||
| port = 8800 |  | ||||||
| protocol = "http" |  | ||||||
| 
 |  | ||||||
| # Availables Langs |  | ||||||
| langs = ["en","es"] |  | ||||||
| dflt_lang = "en" |  | ||||||
| 
 |  | ||||||
| ## How to signup by 'invitation' or 'open' |  | ||||||
| signup_mode = "open" |  | ||||||
| invite_expire = 900 # in seconds |  | ||||||
| 
 |  | ||||||
| # topt Mode: mandatory, optional, no (default)   |  | ||||||
| totp_mode = "no" |  | ||||||
| # totp Digits: 6 (default) or 8  |  | ||||||
| totp_digits = 6 |  | ||||||
| # topt Algorithm: sha1 (default), sha256, sha512 |  | ||||||
| totp_algorithm = "sha256" |  | ||||||
| 
 |  | ||||||
| password_score = 3 |  | ||||||
| admin_fields = "roles,otp_base32,status" |  | ||||||
| 
 |  | ||||||
| use_mail = false |  | ||||||
| smtp = "mail.example.com" |  | ||||||
| smtp_auth = "v4.public..." |  | ||||||
| mail_from ="admini@example.com" |  | ||||||
| 
 |  | ||||||
| #users_store_uri = "file:///data/users" |  | ||||||
| users_store_uri = "sqlite:data/users.db" |  | ||||||
| user_store_access = "access" |  | ||||||
| authz_model_path = "srvc/model.conf" |  | ||||||
| authz_policy_path = "srvc/policy.csv" |  | ||||||
| #session_store_uri = "file:///data/sessions" |  | ||||||
| session_store_uri = "sqlite:data/sessions.db" |  | ||||||
| session_store_file = "session" |  | ||||||
| session_expire = 300 |  | ||||||
| 
 |  | ||||||
| [tpls] |  | ||||||
|   url = "http://docs.example.com/" |  | ||||||
|   main = "home.html.j2" |  | ||||||
|   info = "info.html.j2" |  | ||||||
|   help = "help.html.j2" |  | ||||||
|   notfound = "notfound.html.j2" |  | ||||||
|   notauth = "notauth.html.j2" |  | ||||||
|   login = "login.html.j2" |  | ||||||
|   logout = "logout.html.j2" |  | ||||||
|   signup = "signup.html.j2" |  | ||||||
|   user_settings = "user_settings.html.j2" |  | ||||||
|   invite_create = "invite_create.html.j2" |  | ||||||
|   invite_output = "invite_output.html.j2" |  | ||||||
|   invite_mail_html = "invite_mail.html.j2" |  | ||||||
|   invite_maili_txt = "invite_mail.txt.j2" |  | ||||||
|   users = "users.html.j2" |  | ||||||
|   trylater = "trylater.j2" |  | ||||||
|   session  = "session.j2" |  | ||||||
|   js = "js" |  | ||||||
|   css = "" |  | ||||||
| 
 |  | ||||||
| [paseto]  |  | ||||||
|   public_path = "paseto/public.ky" |  | ||||||
|   secret_path = "paseto/secret.ky" |  | ||||||
|   is_bin = false |  | ||||||
|   assert_val = "" |  | ||||||
|   expire = true |  | ||||||
| [paseto.map_footer] |  | ||||||
| [paseto.data] |  | ||||||
| 
 |  | ||||||
| [ui] |  | ||||||
| css_link = "https://cdn.jsdelivr.net/npm/@unocss/reset/tailwind.min.css" |  | ||||||
| js_link = "https://cdn.jsdelivr.net/npm/@unocss/runtime" |  | ||||||
| main_js_link = "/assets/js/main.js" |  | ||||||
| utils_js_link = "/assets/js/utils.js" |  | ||||||
| other_css_link = "https://cdnjs.cloudflare.com/ajax/libs/flowbite/1.6.5/flowbite.min.css" |  | ||||||
| other_js_link="https://cdnjs.cloudflare.com/ajax/libs/flowbite/1.6.5/flowbite.min.js" |  | ||||||
| 
 |  | ||||||
| [[ui.web_menu_items]] |  | ||||||
| # ~home text part will be removed, it is to indicate it is a home link |  | ||||||
| text = "~home" |  | ||||||
| url = "/" |  | ||||||
| roles = [] |  | ||||||
| 
 |  | ||||||
| [[ui.web_menu_items]] |  | ||||||
| text = "AppDoc" |  | ||||||
| url = "/appdoc" |  | ||||||
| roles = ["dev"] |  | ||||||
| 
 |  | ||||||
| [[ui.web_menu_items]] |  | ||||||
| text = "Users" |  | ||||||
| url = "/users" |  | ||||||
| roles = ["admin"] |  | ||||||
| 
 |  | ||||||
| [[serv_paths]] |  | ||||||
| src_path = "appdoc" |  | ||||||
| url_path = "/appdoc" |  | ||||||
| not_found = "" |  | ||||||
| roles = "dev" |  | ||||||
| redirect_to = "/login" |  | ||||||
| not_auth = "/login" |  | ||||||
| is_restricted = true |  | ||||||
| </code></pre> |  | ||||||
| 
 |  | ||||||
|                     </main> |  | ||||||
| 
 |  | ||||||
|                     <nav class="nav-wrapper" aria-label="Page navigation"> |  | ||||||
|                         <!-- Mobile navigation buttons --> |  | ||||||
|                             <a rel="prev" href="configuration.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                                 <i class="fa fa-angle-left"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|                         <div style="clear: both"></div> |  | ||||||
|                     </nav> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
| 
 |  | ||||||
|             <nav class="nav-wide-wrapper" aria-label="Page navigation"> |  | ||||||
|                     <a rel="prev" href="configuration.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                         <i class="fa fa-angle-left"></i> |  | ||||||
|                     </a> |  | ||||||
| 
 |  | ||||||
|             </nav> |  | ||||||
| 
 |  | ||||||
|         </div> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <script> |  | ||||||
|             window.playground_copyable = true; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/ace.js"></script> |  | ||||||
|         <script src="/docserver/editor.js"></script> |  | ||||||
|         <script src="/docserver/mode-rust.js"></script> |  | ||||||
|         <script src="/docserver/theme-dawn.js"></script> |  | ||||||
|         <script src="/docserver/theme-tomorrow_night.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/elasticlunr.min.js"></script> |  | ||||||
|         <script src="/docserver/mark.min.js"></script> |  | ||||||
|         <script src="/docserver/searcher.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/clipboard.min.js"></script> |  | ||||||
|         <script src="/docserver/highlight.js"></script> |  | ||||||
|         <script src="/docserver/book.js"></script> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom JS scripts --> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     </div> |  | ||||||
|     </body> |  | ||||||
| </html> |  | ||||||
| @ -1,212 +0,0 @@ | |||||||
| <!DOCTYPE HTML> |  | ||||||
| <html lang="en" class="sidebar-visible no-js light"> |  | ||||||
|     <head> |  | ||||||
|         <!-- Book generated using mdBook --> |  | ||||||
|         <meta charset="UTF-8"> |  | ||||||
|         <title>Static contents - Doc Server</title> |  | ||||||
|         <base href="/docserver/"> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <!-- Custom HTML head --> |  | ||||||
|          |  | ||||||
|         <meta name="description" content="Doc Server"> |  | ||||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> |  | ||||||
|         <meta name="theme-color" content="#ffffff" /> |  | ||||||
| 
 |  | ||||||
|         <link rel="icon" href="/docserver/favicon.svg"> |  | ||||||
|         <link rel="shortcut icon" href="/docserver/favicon.png"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/variables.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/general.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/chrome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/print.css" media="print"> |  | ||||||
| 
 |  | ||||||
|         <!-- Fonts --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/FontAwesome/css/font-awesome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/fonts/fonts.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Highlight.js Stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/highlight.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/tomorrow-night.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/ayu-highlight.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom theme stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/custom.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/mdbook-admonish.css"> |  | ||||||
| 
 |  | ||||||
|     </head> |  | ||||||
|     <body> |  | ||||||
|     <div id="body-container"> |  | ||||||
|         <!-- Provide site root to javascript --> |  | ||||||
|         <script> |  | ||||||
|             var path_to_root = "/docserver/"; |  | ||||||
|             var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light"; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Work around some values being stored in localStorage wrapped in quotes --> |  | ||||||
|         <script> |  | ||||||
|             try { |  | ||||||
|                 var theme = localStorage.getItem('mdbook-theme'); |  | ||||||
|                 var sidebar = localStorage.getItem('mdbook-sidebar'); |  | ||||||
| 
 |  | ||||||
|                 if (theme.startsWith('"') && theme.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (sidebar.startsWith('"') && sidebar.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); |  | ||||||
|                 } |  | ||||||
|             } catch (e) { } |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Set the theme before any content is loaded, prevents flash --> |  | ||||||
|         <script> |  | ||||||
|             var theme; |  | ||||||
|             try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } |  | ||||||
|             if (theme === null || theme === undefined) { theme = default_theme; } |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             html.classList.remove('no-js') |  | ||||||
|             html.classList.remove('light') |  | ||||||
|             html.classList.add(theme); |  | ||||||
|             html.classList.add('js'); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Hide / unhide sidebar before it is displayed --> |  | ||||||
|         <script> |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             var sidebar = null; |  | ||||||
|             if (document.body.clientWidth >= 1080) { |  | ||||||
|                 try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } |  | ||||||
|                 sidebar = sidebar || 'visible'; |  | ||||||
|             } else { |  | ||||||
|                 sidebar = 'hidden'; |  | ||||||
|             } |  | ||||||
|             html.classList.remove('sidebar-visible'); |  | ||||||
|             html.classList.add("sidebar-" + sidebar); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <nav id="sidebar" class="sidebar" aria-label="Table of contents"> |  | ||||||
|             <div class="sidebar-scrollbox"> |  | ||||||
|                 <ol class="chapter"><li class="chapter-item "><a href="/docserver/introduction.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li class="chapter-item "><a href="/docserver/index.html"><strong aria-hidden="true">2.</strong> What is this ?</a></li><li class="chapter-item "><a href="/docserver/features.html"><strong aria-hidden="true">3.</strong> Features</a></li><li class="chapter-item "><a href="/docserver/howto.html"><strong aria-hidden="true">4.</strong> How to</a></li><li class="chapter-item "><a href="/docserver/quick-start.html"><strong aria-hidden="true">5.</strong> Quick Start</a></li><li class="spacer"></li><li class="chapter-item affix "><li class="part-title">Server and Content</li><li class="chapter-item "><a href="/docserver/one_server.html"><strong aria-hidden="true">6.</strong> One web server instance</a></li><li class="chapter-item "><a href="/docserver/server_modes.html"><strong aria-hidden="true">7.</strong> Server modes</a></li><li class="chapter-item expanded "><a href="/docserver/static_content.html" class="active"><strong aria-hidden="true">8.</strong> Static contents</a></li><li class="chapter-item "><a href="/docserver/url_path.html"><strong aria-hidden="true">9.</strong> url_path prefix</a></li><li class="chapter-item "><a href="/docserver/protect_access.html"><strong aria-hidden="true">10.</strong> Protect access</a></li><li class="chapter-item affix "><li class="part-title">Users and Policies</li><li class="chapter-item "><a href="/docserver/users.html"><strong aria-hidden="true">11.</strong> Users</a></li><li class="chapter-item "><a href="/docserver/users_sql.html"><strong aria-hidden="true">12.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/users_file_storage.html"><strong aria-hidden="true">13.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/roles.html"><strong aria-hidden="true">14.</strong> Roles</a></li><li class="chapter-item "><a href="/docserver/auths.html"><strong aria-hidden="true">15.</strong> Users auths</a></li><li class="chapter-item "><a href="/docserver/policies.html"><strong aria-hidden="true">16.</strong> Access policies</a></li><li class="chapter-item "><a href="/docserver/adminusers.html"><strong aria-hidden="true">17.</strong> Users Admin</a></li><li class="chapter-item affix "><li class="part-title">Sessions</li><li class="chapter-item "><a href="/docserver/sessions.html"><strong aria-hidden="true">18.</strong> Session data</a></li><li class="chapter-item "><a href="/docserver/pasetoken.html"><strong aria-hidden="true">19.</strong> Pasetoken</a></li><li class="chapter-item "><a href="/docserver/sessions_sql.html"><strong aria-hidden="true">20.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/sessions_file_storage.html"><strong aria-hidden="true">21.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/cookie.html"><strong aria-hidden="true">22.</strong> Cookie set</a></li><li class="chapter-item affix "><li class="part-title">Logs and Trace</li><li class="chapter-item "><a href="/docserver/trace.html"><strong aria-hidden="true">23.</strong> Traced</a></li><li class="chapter-item "><a href="/docserver/logs.html"><strong aria-hidden="true">24.</strong> Sessions logs</a></li><li class="chapter-item affix "><li class="part-title">Configuration</li><li class="chapter-item "><a href="/docserver/configuration.html"><strong aria-hidden="true">25.</strong> Configurable service</a></li><li class="chapter-item "><a href="/docserver/settings.html"><strong aria-hidden="true">26.</strong> Config settings</a></li><li class="spacer"></li></ol> |  | ||||||
|             </div> |  | ||||||
|             <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> |  | ||||||
|         </nav> |  | ||||||
| 
 |  | ||||||
|         <div id="page-wrapper" class="page-wrapper"> |  | ||||||
| 
 |  | ||||||
|             <div class="page"> |  | ||||||
|                                 <div id="menu-bar-hover-placeholder"></div> |  | ||||||
|                 <div id="menu-bar" class="menu-bar sticky bordered"> |  | ||||||
|                     <div class="left-buttons"> |  | ||||||
|                         <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> |  | ||||||
|                             <i class="fa fa-bars"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="sidebar-toggle" onclick="location.href='/'" class="icon-button" type="button" title="Home" aria-label="Home" aria-controls=""> |  | ||||||
|                             <i class="fa fa-home"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> |  | ||||||
|                             <i class="fa fa-paint-brush"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> |  | ||||||
|                         </ul> |  | ||||||
|                         <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> |  | ||||||
|                             <i class="fa fa-search"></i> |  | ||||||
|                         </button> |  | ||||||
|                     </div> |  | ||||||
| 
 |  | ||||||
|                     <h1 class="menu-title">Doc Server</h1> |  | ||||||
| 
 |  | ||||||
|                     <div class="right-buttons"> |  | ||||||
|                         <a href="/docserver/print.html" title="Print this book" aria-label="Print this book"> |  | ||||||
|                             <i id="print-button" class="fa fa-print"></i> |  | ||||||
|                         </a> |  | ||||||
|                         <a href="/logout" title="Sing out" aria-label="Sign out"> |  | ||||||
|                             <i id="logout-button" class="fa fa-sign-out"></i> |  | ||||||
|                         </a> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div id="search-wrapper" class="hidden"> |  | ||||||
|                     <form id="searchbar-outer" class="searchbar-outer"> |  | ||||||
|                         <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> |  | ||||||
|                     </form> |  | ||||||
|                     <div id="searchresults-outer" class="searchresults-outer hidden"> |  | ||||||
|                         <div id="searchresults-header" class="searchresults-header"></div> |  | ||||||
|                         <ul id="searchresults"> |  | ||||||
|                         </ul> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> |  | ||||||
|                 <script> |  | ||||||
|                     document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); |  | ||||||
|                     document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); |  | ||||||
|                     Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { |  | ||||||
|                         link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); |  | ||||||
|                     }); |  | ||||||
|                 </script> |  | ||||||
| 
 |  | ||||||
|                 <div id="content" class="content"> |  | ||||||
|                     <main> |  | ||||||
|                         <h1 id="static-contents"><a class="header" href="#static-contents">Static contents</a></h1> |  | ||||||
| 
 |  | ||||||
|                     </main> |  | ||||||
| 
 |  | ||||||
|                     <nav class="nav-wrapper" aria-label="Page navigation"> |  | ||||||
|                         <!-- Mobile navigation buttons --> |  | ||||||
|                             <a rel="prev" href="server_modes.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                                 <i class="fa fa-angle-left"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                             <a rel="next" href="url_path.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                                 <i class="fa fa-angle-right"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                         <div style="clear: both"></div> |  | ||||||
|                     </nav> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
| 
 |  | ||||||
|             <nav class="nav-wide-wrapper" aria-label="Page navigation"> |  | ||||||
|                     <a rel="prev" href="server_modes.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                         <i class="fa fa-angle-left"></i> |  | ||||||
|                     </a> |  | ||||||
| 
 |  | ||||||
|                     <a rel="next" href="url_path.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                         <i class="fa fa-angle-right"></i> |  | ||||||
|                     </a> |  | ||||||
|             </nav> |  | ||||||
| 
 |  | ||||||
|         </div> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <script> |  | ||||||
|             window.playground_copyable = true; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/ace.js"></script> |  | ||||||
|         <script src="/docserver/editor.js"></script> |  | ||||||
|         <script src="/docserver/mode-rust.js"></script> |  | ||||||
|         <script src="/docserver/theme-dawn.js"></script> |  | ||||||
|         <script src="/docserver/theme-tomorrow_night.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/elasticlunr.min.js"></script> |  | ||||||
|         <script src="/docserver/mark.min.js"></script> |  | ||||||
|         <script src="/docserver/searcher.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/clipboard.min.js"></script> |  | ||||||
|         <script src="/docserver/highlight.js"></script> |  | ||||||
|         <script src="/docserver/book.js"></script> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom JS scripts --> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     </div> |  | ||||||
|     </body> |  | ||||||
| </html> |  | ||||||
| @ -1,7 +0,0 @@ | |||||||
| ace.define("ace/theme/dawn",["require","exports","module","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-dawn",t.cssText=".ace-dawn .ace_gutter {background: #ebebeb;color: #333}.ace-dawn .ace_print-margin {width: 1px;background: #e8e8e8}.ace-dawn {background-color: #F9F9F9;color: #080808}.ace-dawn .ace_cursor {color: #000000}.ace-dawn .ace_marker-layer .ace_selection {background: rgba(39, 95, 255, 0.30)}.ace-dawn.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #F9F9F9;}.ace-dawn .ace_marker-layer .ace_step {background: rgb(255, 255, 0)}.ace-dawn .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(75, 75, 126, 0.50)}.ace-dawn .ace_marker-layer .ace_active-line {background: rgba(36, 99, 180, 0.12)}.ace-dawn .ace_gutter-active-line {background-color : #dcdcdc}.ace-dawn .ace_marker-layer .ace_selected-word {border: 1px solid rgba(39, 95, 255, 0.30)}.ace-dawn .ace_invisible {color: rgba(75, 75, 126, 0.50)}.ace-dawn .ace_keyword,.ace-dawn .ace_meta {color: #794938}.ace-dawn .ace_constant,.ace-dawn .ace_constant.ace_character,.ace-dawn .ace_constant.ace_character.ace_escape,.ace-dawn .ace_constant.ace_other {color: #811F24}.ace-dawn .ace_invalid.ace_illegal {text-decoration: underline;font-style: italic;color: #F8F8F8;background-color: #B52A1D}.ace-dawn .ace_invalid.ace_deprecated {text-decoration: underline;font-style: italic;color: #B52A1D}.ace-dawn .ace_support {color: #691C97}.ace-dawn .ace_support.ace_constant {color: #B4371F}.ace-dawn .ace_fold {background-color: #794938;border-color: #080808}.ace-dawn .ace_list,.ace-dawn .ace_markup.ace_list,.ace-dawn .ace_support.ace_function {color: #693A17}.ace-dawn .ace_storage {font-style: italic;color: #A71D5D}.ace-dawn .ace_string {color: #0B6125}.ace-dawn .ace_string.ace_regexp {color: #CF5628}.ace-dawn .ace_comment {font-style: italic;color: #5A525F}.ace-dawn .ace_heading,.ace-dawn .ace_markup.ace_heading {color: #19356D}.ace-dawn .ace_variable {color: #234A97}.ace-dawn .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLh/5+x/AAizA4hxNNsZAAAAAElFTkSuQmCC) right repeat-y}";var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)});                (function() { |  | ||||||
|                     ace.require(["ace/theme/dawn"], function(m) { |  | ||||||
|                         if (typeof module == "object" && typeof exports == "object" && module) { |  | ||||||
|                             module.exports = m; |  | ||||||
|                         } |  | ||||||
|                     }); |  | ||||||
|                 })(); |  | ||||||
| @ -1,7 +0,0 @@ | |||||||
| ace.define("ace/theme/tomorrow_night",["require","exports","module","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-tomorrow-night",t.cssText=".ace-tomorrow-night .ace_gutter {background: #25282c;color: #C5C8C6}.ace-tomorrow-night .ace_print-margin {width: 1px;background: #25282c}.ace-tomorrow-night {background-color: #1D1F21;color: #C5C8C6}.ace-tomorrow-night .ace_cursor {color: #AEAFAD}.ace-tomorrow-night .ace_marker-layer .ace_selection {background: #373B41}.ace-tomorrow-night.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #1D1F21;}.ace-tomorrow-night .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-tomorrow-night .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #4B4E55}.ace-tomorrow-night .ace_marker-layer .ace_active-line {background: #282A2E}.ace-tomorrow-night .ace_gutter-active-line {background-color: #282A2E}.ace-tomorrow-night .ace_marker-layer .ace_selected-word {border: 1px solid #373B41}.ace-tomorrow-night .ace_invisible {color: #4B4E55}.ace-tomorrow-night .ace_keyword,.ace-tomorrow-night .ace_meta,.ace-tomorrow-night .ace_storage,.ace-tomorrow-night .ace_storage.ace_type,.ace-tomorrow-night .ace_support.ace_type {color: #B294BB}.ace-tomorrow-night .ace_keyword.ace_operator {color: #8ABEB7}.ace-tomorrow-night .ace_constant.ace_character,.ace-tomorrow-night .ace_constant.ace_language,.ace-tomorrow-night .ace_constant.ace_numeric,.ace-tomorrow-night .ace_keyword.ace_other.ace_unit,.ace-tomorrow-night .ace_support.ace_constant,.ace-tomorrow-night .ace_variable.ace_parameter {color: #DE935F}.ace-tomorrow-night .ace_constant.ace_other {color: #CED1CF}.ace-tomorrow-night .ace_invalid {color: #CED2CF;background-color: #DF5F5F}.ace-tomorrow-night .ace_invalid.ace_deprecated {color: #CED2CF;background-color: #B798BF}.ace-tomorrow-night .ace_fold {background-color: #81A2BE;border-color: #C5C8C6}.ace-tomorrow-night .ace_entity.ace_name.ace_function,.ace-tomorrow-night .ace_support.ace_function,.ace-tomorrow-night .ace_variable {color: #81A2BE}.ace-tomorrow-night .ace_support.ace_class,.ace-tomorrow-night .ace_support.ace_type {color: #F0C674}.ace-tomorrow-night .ace_heading,.ace-tomorrow-night .ace_markup.ace_heading,.ace-tomorrow-night .ace_string {color: #B5BD68}.ace-tomorrow-night .ace_entity.ace_name.ace_tag,.ace-tomorrow-night .ace_entity.ace_other.ace_attribute-name,.ace-tomorrow-night .ace_meta.ace_tag,.ace-tomorrow-night .ace_string.ace_regexp,.ace-tomorrow-night .ace_variable {color: #CC6666}.ace-tomorrow-night .ace_comment {color: #969896}.ace-tomorrow-night .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y}";var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)});                (function() { |  | ||||||
|                     ace.require(["ace/theme/tomorrow_night"], function(m) { |  | ||||||
|                         if (typeof module == "object" && typeof exports == "object" && module) { |  | ||||||
|                             module.exports = m; |  | ||||||
|                         } |  | ||||||
|                     }); |  | ||||||
|                 })(); |  | ||||||
| @ -1,102 +0,0 @@ | |||||||
| /* Tomorrow Night Theme */ |  | ||||||
| /* https://github.com/jmblog/color-themes-for-highlightjs */ |  | ||||||
| /* Original theme - https://github.com/chriskempson/tomorrow-theme */ |  | ||||||
| /* https://github.com/jmblog/color-themes-for-highlightjs */ |  | ||||||
| 
 |  | ||||||
| /* Tomorrow Comment */ |  | ||||||
| .hljs-comment { |  | ||||||
|   color: #969896; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* Tomorrow Red */ |  | ||||||
| .hljs-variable, |  | ||||||
| .hljs-attribute, |  | ||||||
| .hljs-tag, |  | ||||||
| .hljs-regexp, |  | ||||||
| .ruby .hljs-constant, |  | ||||||
| .xml .hljs-tag .hljs-title, |  | ||||||
| .xml .hljs-pi, |  | ||||||
| .xml .hljs-doctype, |  | ||||||
| .html .hljs-doctype, |  | ||||||
| .css .hljs-id, |  | ||||||
| .css .hljs-class, |  | ||||||
| .css .hljs-pseudo { |  | ||||||
|   color: #cc6666; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* Tomorrow Orange */ |  | ||||||
| .hljs-number, |  | ||||||
| .hljs-preprocessor, |  | ||||||
| .hljs-pragma, |  | ||||||
| .hljs-built_in, |  | ||||||
| .hljs-literal, |  | ||||||
| .hljs-params, |  | ||||||
| .hljs-constant { |  | ||||||
|   color: #de935f; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* Tomorrow Yellow */ |  | ||||||
| .ruby .hljs-class .hljs-title, |  | ||||||
| .css .hljs-rule .hljs-attribute { |  | ||||||
|   color: #f0c674; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* Tomorrow Green */ |  | ||||||
| .hljs-string, |  | ||||||
| .hljs-value, |  | ||||||
| .hljs-inheritance, |  | ||||||
| .hljs-header, |  | ||||||
| .hljs-name, |  | ||||||
| .ruby .hljs-symbol, |  | ||||||
| .xml .hljs-cdata { |  | ||||||
|   color: #b5bd68; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* Tomorrow Aqua */ |  | ||||||
| .hljs-title, |  | ||||||
| .css .hljs-hexcolor { |  | ||||||
|   color: #8abeb7; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* Tomorrow Blue */ |  | ||||||
| .hljs-function, |  | ||||||
| .python .hljs-decorator, |  | ||||||
| .python .hljs-title, |  | ||||||
| .ruby .hljs-function .hljs-title, |  | ||||||
| .ruby .hljs-title .hljs-keyword, |  | ||||||
| .perl .hljs-sub, |  | ||||||
| .javascript .hljs-title, |  | ||||||
| .coffeescript .hljs-title { |  | ||||||
|   color: #81a2be; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* Tomorrow Purple */ |  | ||||||
| .hljs-keyword, |  | ||||||
| .javascript .hljs-function { |  | ||||||
|   color: #b294bb; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .hljs { |  | ||||||
|   display: block; |  | ||||||
|   overflow-x: auto; |  | ||||||
|   background: #1d1f21; |  | ||||||
|   color: #c5c8c6; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .coffeescript .javascript, |  | ||||||
| .javascript .xml, |  | ||||||
| .tex .hljs-formula, |  | ||||||
| .xml .javascript, |  | ||||||
| .xml .vbscript, |  | ||||||
| .xml .css, |  | ||||||
| .xml .hljs-cdata { |  | ||||||
|   opacity: 0.5; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .hljs-addition { |  | ||||||
|   color: #718c00; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .hljs-deletion { |  | ||||||
|   color: #c82829; |  | ||||||
| } |  | ||||||
| @ -1,212 +0,0 @@ | |||||||
| <!DOCTYPE HTML> |  | ||||||
| <html lang="en" class="sidebar-visible no-js light"> |  | ||||||
|     <head> |  | ||||||
|         <!-- Book generated using mdBook --> |  | ||||||
|         <meta charset="UTF-8"> |  | ||||||
|         <title>Traced - Doc Server</title> |  | ||||||
|         <base href="/docserver/"> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <!-- Custom HTML head --> |  | ||||||
|          |  | ||||||
|         <meta name="description" content="Doc Server"> |  | ||||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> |  | ||||||
|         <meta name="theme-color" content="#ffffff" /> |  | ||||||
| 
 |  | ||||||
|         <link rel="icon" href="/docserver/favicon.svg"> |  | ||||||
|         <link rel="shortcut icon" href="/docserver/favicon.png"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/variables.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/general.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/chrome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/print.css" media="print"> |  | ||||||
| 
 |  | ||||||
|         <!-- Fonts --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/FontAwesome/css/font-awesome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/fonts/fonts.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Highlight.js Stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/highlight.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/tomorrow-night.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/ayu-highlight.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom theme stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/custom.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/mdbook-admonish.css"> |  | ||||||
| 
 |  | ||||||
|     </head> |  | ||||||
|     <body> |  | ||||||
|     <div id="body-container"> |  | ||||||
|         <!-- Provide site root to javascript --> |  | ||||||
|         <script> |  | ||||||
|             var path_to_root = "/docserver/"; |  | ||||||
|             var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light"; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Work around some values being stored in localStorage wrapped in quotes --> |  | ||||||
|         <script> |  | ||||||
|             try { |  | ||||||
|                 var theme = localStorage.getItem('mdbook-theme'); |  | ||||||
|                 var sidebar = localStorage.getItem('mdbook-sidebar'); |  | ||||||
| 
 |  | ||||||
|                 if (theme.startsWith('"') && theme.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (sidebar.startsWith('"') && sidebar.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); |  | ||||||
|                 } |  | ||||||
|             } catch (e) { } |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Set the theme before any content is loaded, prevents flash --> |  | ||||||
|         <script> |  | ||||||
|             var theme; |  | ||||||
|             try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } |  | ||||||
|             if (theme === null || theme === undefined) { theme = default_theme; } |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             html.classList.remove('no-js') |  | ||||||
|             html.classList.remove('light') |  | ||||||
|             html.classList.add(theme); |  | ||||||
|             html.classList.add('js'); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Hide / unhide sidebar before it is displayed --> |  | ||||||
|         <script> |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             var sidebar = null; |  | ||||||
|             if (document.body.clientWidth >= 1080) { |  | ||||||
|                 try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } |  | ||||||
|                 sidebar = sidebar || 'visible'; |  | ||||||
|             } else { |  | ||||||
|                 sidebar = 'hidden'; |  | ||||||
|             } |  | ||||||
|             html.classList.remove('sidebar-visible'); |  | ||||||
|             html.classList.add("sidebar-" + sidebar); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <nav id="sidebar" class="sidebar" aria-label="Table of contents"> |  | ||||||
|             <div class="sidebar-scrollbox"> |  | ||||||
|                 <ol class="chapter"><li class="chapter-item "><a href="/docserver/introduction.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li class="chapter-item "><a href="/docserver/index.html"><strong aria-hidden="true">2.</strong> What is this ?</a></li><li class="chapter-item "><a href="/docserver/features.html"><strong aria-hidden="true">3.</strong> Features</a></li><li class="chapter-item "><a href="/docserver/howto.html"><strong aria-hidden="true">4.</strong> How to</a></li><li class="chapter-item "><a href="/docserver/quick-start.html"><strong aria-hidden="true">5.</strong> Quick Start</a></li><li class="spacer"></li><li class="chapter-item affix "><li class="part-title">Server and Content</li><li class="chapter-item "><a href="/docserver/one_server.html"><strong aria-hidden="true">6.</strong> One web server instance</a></li><li class="chapter-item "><a href="/docserver/server_modes.html"><strong aria-hidden="true">7.</strong> Server modes</a></li><li class="chapter-item "><a href="/docserver/static_content.html"><strong aria-hidden="true">8.</strong> Static contents</a></li><li class="chapter-item "><a href="/docserver/url_path.html"><strong aria-hidden="true">9.</strong> url_path prefix</a></li><li class="chapter-item "><a href="/docserver/protect_access.html"><strong aria-hidden="true">10.</strong> Protect access</a></li><li class="chapter-item affix "><li class="part-title">Users and Policies</li><li class="chapter-item "><a href="/docserver/users.html"><strong aria-hidden="true">11.</strong> Users</a></li><li class="chapter-item "><a href="/docserver/users_sql.html"><strong aria-hidden="true">12.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/users_file_storage.html"><strong aria-hidden="true">13.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/roles.html"><strong aria-hidden="true">14.</strong> Roles</a></li><li class="chapter-item "><a href="/docserver/auths.html"><strong aria-hidden="true">15.</strong> Users auths</a></li><li class="chapter-item "><a href="/docserver/policies.html"><strong aria-hidden="true">16.</strong> Access policies</a></li><li class="chapter-item "><a href="/docserver/adminusers.html"><strong aria-hidden="true">17.</strong> Users Admin</a></li><li class="chapter-item affix "><li class="part-title">Sessions</li><li class="chapter-item "><a href="/docserver/sessions.html"><strong aria-hidden="true">18.</strong> Session data</a></li><li class="chapter-item "><a href="/docserver/pasetoken.html"><strong aria-hidden="true">19.</strong> Pasetoken</a></li><li class="chapter-item "><a href="/docserver/sessions_sql.html"><strong aria-hidden="true">20.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/sessions_file_storage.html"><strong aria-hidden="true">21.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/cookie.html"><strong aria-hidden="true">22.</strong> Cookie set</a></li><li class="chapter-item affix "><li class="part-title">Logs and Trace</li><li class="chapter-item expanded "><a href="/docserver/trace.html" class="active"><strong aria-hidden="true">23.</strong> Traced</a></li><li class="chapter-item "><a href="/docserver/logs.html"><strong aria-hidden="true">24.</strong> Sessions logs</a></li><li class="chapter-item affix "><li class="part-title">Configuration</li><li class="chapter-item "><a href="/docserver/configuration.html"><strong aria-hidden="true">25.</strong> Configurable service</a></li><li class="chapter-item "><a href="/docserver/settings.html"><strong aria-hidden="true">26.</strong> Config settings</a></li><li class="spacer"></li></ol> |  | ||||||
|             </div> |  | ||||||
|             <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> |  | ||||||
|         </nav> |  | ||||||
| 
 |  | ||||||
|         <div id="page-wrapper" class="page-wrapper"> |  | ||||||
| 
 |  | ||||||
|             <div class="page"> |  | ||||||
|                                 <div id="menu-bar-hover-placeholder"></div> |  | ||||||
|                 <div id="menu-bar" class="menu-bar sticky bordered"> |  | ||||||
|                     <div class="left-buttons"> |  | ||||||
|                         <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> |  | ||||||
|                             <i class="fa fa-bars"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="sidebar-toggle" onclick="location.href='/'" class="icon-button" type="button" title="Home" aria-label="Home" aria-controls=""> |  | ||||||
|                             <i class="fa fa-home"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> |  | ||||||
|                             <i class="fa fa-paint-brush"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> |  | ||||||
|                         </ul> |  | ||||||
|                         <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> |  | ||||||
|                             <i class="fa fa-search"></i> |  | ||||||
|                         </button> |  | ||||||
|                     </div> |  | ||||||
| 
 |  | ||||||
|                     <h1 class="menu-title">Doc Server</h1> |  | ||||||
| 
 |  | ||||||
|                     <div class="right-buttons"> |  | ||||||
|                         <a href="/docserver/print.html" title="Print this book" aria-label="Print this book"> |  | ||||||
|                             <i id="print-button" class="fa fa-print"></i> |  | ||||||
|                         </a> |  | ||||||
|                         <a href="/logout" title="Sing out" aria-label="Sign out"> |  | ||||||
|                             <i id="logout-button" class="fa fa-sign-out"></i> |  | ||||||
|                         </a> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div id="search-wrapper" class="hidden"> |  | ||||||
|                     <form id="searchbar-outer" class="searchbar-outer"> |  | ||||||
|                         <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> |  | ||||||
|                     </form> |  | ||||||
|                     <div id="searchresults-outer" class="searchresults-outer hidden"> |  | ||||||
|                         <div id="searchresults-header" class="searchresults-header"></div> |  | ||||||
|                         <ul id="searchresults"> |  | ||||||
|                         </ul> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> |  | ||||||
|                 <script> |  | ||||||
|                     document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); |  | ||||||
|                     document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); |  | ||||||
|                     Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { |  | ||||||
|                         link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); |  | ||||||
|                     }); |  | ||||||
|                 </script> |  | ||||||
| 
 |  | ||||||
|                 <div id="content" class="content"> |  | ||||||
|                     <main> |  | ||||||
|                         <h1 id="traced"><a class="header" href="#traced">Traced</a></h1> |  | ||||||
| 
 |  | ||||||
|                     </main> |  | ||||||
| 
 |  | ||||||
|                     <nav class="nav-wrapper" aria-label="Page navigation"> |  | ||||||
|                         <!-- Mobile navigation buttons --> |  | ||||||
|                             <a rel="prev" href="cookie.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                                 <i class="fa fa-angle-left"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                             <a rel="next" href="logs.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                                 <i class="fa fa-angle-right"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                         <div style="clear: both"></div> |  | ||||||
|                     </nav> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
| 
 |  | ||||||
|             <nav class="nav-wide-wrapper" aria-label="Page navigation"> |  | ||||||
|                     <a rel="prev" href="cookie.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                         <i class="fa fa-angle-left"></i> |  | ||||||
|                     </a> |  | ||||||
| 
 |  | ||||||
|                     <a rel="next" href="logs.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                         <i class="fa fa-angle-right"></i> |  | ||||||
|                     </a> |  | ||||||
|             </nav> |  | ||||||
| 
 |  | ||||||
|         </div> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <script> |  | ||||||
|             window.playground_copyable = true; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/ace.js"></script> |  | ||||||
|         <script src="/docserver/editor.js"></script> |  | ||||||
|         <script src="/docserver/mode-rust.js"></script> |  | ||||||
|         <script src="/docserver/theme-dawn.js"></script> |  | ||||||
|         <script src="/docserver/theme-tomorrow_night.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/elasticlunr.min.js"></script> |  | ||||||
|         <script src="/docserver/mark.min.js"></script> |  | ||||||
|         <script src="/docserver/searcher.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/clipboard.min.js"></script> |  | ||||||
|         <script src="/docserver/highlight.js"></script> |  | ||||||
|         <script src="/docserver/book.js"></script> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom JS scripts --> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     </div> |  | ||||||
|     </body> |  | ||||||
| </html> |  | ||||||
| @ -1,212 +0,0 @@ | |||||||
| <!DOCTYPE HTML> |  | ||||||
| <html lang="en" class="sidebar-visible no-js light"> |  | ||||||
|     <head> |  | ||||||
|         <!-- Book generated using mdBook --> |  | ||||||
|         <meta charset="UTF-8"> |  | ||||||
|         <title>url_path prefix - Doc Server</title> |  | ||||||
|         <base href="/docserver/"> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <!-- Custom HTML head --> |  | ||||||
|          |  | ||||||
|         <meta name="description" content="Doc Server"> |  | ||||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> |  | ||||||
|         <meta name="theme-color" content="#ffffff" /> |  | ||||||
| 
 |  | ||||||
|         <link rel="icon" href="/docserver/favicon.svg"> |  | ||||||
|         <link rel="shortcut icon" href="/docserver/favicon.png"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/variables.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/general.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/chrome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/print.css" media="print"> |  | ||||||
| 
 |  | ||||||
|         <!-- Fonts --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/FontAwesome/css/font-awesome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/fonts/fonts.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Highlight.js Stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/highlight.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/tomorrow-night.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/ayu-highlight.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom theme stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/custom.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/mdbook-admonish.css"> |  | ||||||
| 
 |  | ||||||
|     </head> |  | ||||||
|     <body> |  | ||||||
|     <div id="body-container"> |  | ||||||
|         <!-- Provide site root to javascript --> |  | ||||||
|         <script> |  | ||||||
|             var path_to_root = "/docserver/"; |  | ||||||
|             var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light"; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Work around some values being stored in localStorage wrapped in quotes --> |  | ||||||
|         <script> |  | ||||||
|             try { |  | ||||||
|                 var theme = localStorage.getItem('mdbook-theme'); |  | ||||||
|                 var sidebar = localStorage.getItem('mdbook-sidebar'); |  | ||||||
| 
 |  | ||||||
|                 if (theme.startsWith('"') && theme.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (sidebar.startsWith('"') && sidebar.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); |  | ||||||
|                 } |  | ||||||
|             } catch (e) { } |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Set the theme before any content is loaded, prevents flash --> |  | ||||||
|         <script> |  | ||||||
|             var theme; |  | ||||||
|             try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } |  | ||||||
|             if (theme === null || theme === undefined) { theme = default_theme; } |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             html.classList.remove('no-js') |  | ||||||
|             html.classList.remove('light') |  | ||||||
|             html.classList.add(theme); |  | ||||||
|             html.classList.add('js'); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Hide / unhide sidebar before it is displayed --> |  | ||||||
|         <script> |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             var sidebar = null; |  | ||||||
|             if (document.body.clientWidth >= 1080) { |  | ||||||
|                 try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } |  | ||||||
|                 sidebar = sidebar || 'visible'; |  | ||||||
|             } else { |  | ||||||
|                 sidebar = 'hidden'; |  | ||||||
|             } |  | ||||||
|             html.classList.remove('sidebar-visible'); |  | ||||||
|             html.classList.add("sidebar-" + sidebar); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <nav id="sidebar" class="sidebar" aria-label="Table of contents"> |  | ||||||
|             <div class="sidebar-scrollbox"> |  | ||||||
|                 <ol class="chapter"><li class="chapter-item "><a href="/docserver/introduction.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li class="chapter-item "><a href="/docserver/index.html"><strong aria-hidden="true">2.</strong> What is this ?</a></li><li class="chapter-item "><a href="/docserver/features.html"><strong aria-hidden="true">3.</strong> Features</a></li><li class="chapter-item "><a href="/docserver/howto.html"><strong aria-hidden="true">4.</strong> How to</a></li><li class="chapter-item "><a href="/docserver/quick-start.html"><strong aria-hidden="true">5.</strong> Quick Start</a></li><li class="spacer"></li><li class="chapter-item affix "><li class="part-title">Server and Content</li><li class="chapter-item "><a href="/docserver/one_server.html"><strong aria-hidden="true">6.</strong> One web server instance</a></li><li class="chapter-item "><a href="/docserver/server_modes.html"><strong aria-hidden="true">7.</strong> Server modes</a></li><li class="chapter-item "><a href="/docserver/static_content.html"><strong aria-hidden="true">8.</strong> Static contents</a></li><li class="chapter-item expanded "><a href="/docserver/url_path.html" class="active"><strong aria-hidden="true">9.</strong> url_path prefix</a></li><li class="chapter-item "><a href="/docserver/protect_access.html"><strong aria-hidden="true">10.</strong> Protect access</a></li><li class="chapter-item affix "><li class="part-title">Users and Policies</li><li class="chapter-item "><a href="/docserver/users.html"><strong aria-hidden="true">11.</strong> Users</a></li><li class="chapter-item "><a href="/docserver/users_sql.html"><strong aria-hidden="true">12.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/users_file_storage.html"><strong aria-hidden="true">13.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/roles.html"><strong aria-hidden="true">14.</strong> Roles</a></li><li class="chapter-item "><a href="/docserver/auths.html"><strong aria-hidden="true">15.</strong> Users auths</a></li><li class="chapter-item "><a href="/docserver/policies.html"><strong aria-hidden="true">16.</strong> Access policies</a></li><li class="chapter-item "><a href="/docserver/adminusers.html"><strong aria-hidden="true">17.</strong> Users Admin</a></li><li class="chapter-item affix "><li class="part-title">Sessions</li><li class="chapter-item "><a href="/docserver/sessions.html"><strong aria-hidden="true">18.</strong> Session data</a></li><li class="chapter-item "><a href="/docserver/pasetoken.html"><strong aria-hidden="true">19.</strong> Pasetoken</a></li><li class="chapter-item "><a href="/docserver/sessions_sql.html"><strong aria-hidden="true">20.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/sessions_file_storage.html"><strong aria-hidden="true">21.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/cookie.html"><strong aria-hidden="true">22.</strong> Cookie set</a></li><li class="chapter-item affix "><li class="part-title">Logs and Trace</li><li class="chapter-item "><a href="/docserver/trace.html"><strong aria-hidden="true">23.</strong> Traced</a></li><li class="chapter-item "><a href="/docserver/logs.html"><strong aria-hidden="true">24.</strong> Sessions logs</a></li><li class="chapter-item affix "><li class="part-title">Configuration</li><li class="chapter-item "><a href="/docserver/configuration.html"><strong aria-hidden="true">25.</strong> Configurable service</a></li><li class="chapter-item "><a href="/docserver/settings.html"><strong aria-hidden="true">26.</strong> Config settings</a></li><li class="spacer"></li></ol> |  | ||||||
|             </div> |  | ||||||
|             <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> |  | ||||||
|         </nav> |  | ||||||
| 
 |  | ||||||
|         <div id="page-wrapper" class="page-wrapper"> |  | ||||||
| 
 |  | ||||||
|             <div class="page"> |  | ||||||
|                                 <div id="menu-bar-hover-placeholder"></div> |  | ||||||
|                 <div id="menu-bar" class="menu-bar sticky bordered"> |  | ||||||
|                     <div class="left-buttons"> |  | ||||||
|                         <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> |  | ||||||
|                             <i class="fa fa-bars"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="sidebar-toggle" onclick="location.href='/'" class="icon-button" type="button" title="Home" aria-label="Home" aria-controls=""> |  | ||||||
|                             <i class="fa fa-home"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> |  | ||||||
|                             <i class="fa fa-paint-brush"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> |  | ||||||
|                         </ul> |  | ||||||
|                         <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> |  | ||||||
|                             <i class="fa fa-search"></i> |  | ||||||
|                         </button> |  | ||||||
|                     </div> |  | ||||||
| 
 |  | ||||||
|                     <h1 class="menu-title">Doc Server</h1> |  | ||||||
| 
 |  | ||||||
|                     <div class="right-buttons"> |  | ||||||
|                         <a href="/docserver/print.html" title="Print this book" aria-label="Print this book"> |  | ||||||
|                             <i id="print-button" class="fa fa-print"></i> |  | ||||||
|                         </a> |  | ||||||
|                         <a href="/logout" title="Sing out" aria-label="Sign out"> |  | ||||||
|                             <i id="logout-button" class="fa fa-sign-out"></i> |  | ||||||
|                         </a> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div id="search-wrapper" class="hidden"> |  | ||||||
|                     <form id="searchbar-outer" class="searchbar-outer"> |  | ||||||
|                         <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> |  | ||||||
|                     </form> |  | ||||||
|                     <div id="searchresults-outer" class="searchresults-outer hidden"> |  | ||||||
|                         <div id="searchresults-header" class="searchresults-header"></div> |  | ||||||
|                         <ul id="searchresults"> |  | ||||||
|                         </ul> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> |  | ||||||
|                 <script> |  | ||||||
|                     document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); |  | ||||||
|                     document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); |  | ||||||
|                     Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { |  | ||||||
|                         link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); |  | ||||||
|                     }); |  | ||||||
|                 </script> |  | ||||||
| 
 |  | ||||||
|                 <div id="content" class="content"> |  | ||||||
|                     <main> |  | ||||||
|                         <h1 id="url_path-prefix"><a class="header" href="#url_path-prefix">url_path prefix</a></h1> |  | ||||||
| 
 |  | ||||||
|                     </main> |  | ||||||
| 
 |  | ||||||
|                     <nav class="nav-wrapper" aria-label="Page navigation"> |  | ||||||
|                         <!-- Mobile navigation buttons --> |  | ||||||
|                             <a rel="prev" href="static_content.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                                 <i class="fa fa-angle-left"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                             <a rel="next" href="protect_access.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                                 <i class="fa fa-angle-right"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                         <div style="clear: both"></div> |  | ||||||
|                     </nav> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
| 
 |  | ||||||
|             <nav class="nav-wide-wrapper" aria-label="Page navigation"> |  | ||||||
|                     <a rel="prev" href="static_content.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                         <i class="fa fa-angle-left"></i> |  | ||||||
|                     </a> |  | ||||||
| 
 |  | ||||||
|                     <a rel="next" href="protect_access.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                         <i class="fa fa-angle-right"></i> |  | ||||||
|                     </a> |  | ||||||
|             </nav> |  | ||||||
| 
 |  | ||||||
|         </div> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <script> |  | ||||||
|             window.playground_copyable = true; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/ace.js"></script> |  | ||||||
|         <script src="/docserver/editor.js"></script> |  | ||||||
|         <script src="/docserver/mode-rust.js"></script> |  | ||||||
|         <script src="/docserver/theme-dawn.js"></script> |  | ||||||
|         <script src="/docserver/theme-tomorrow_night.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/elasticlunr.min.js"></script> |  | ||||||
|         <script src="/docserver/mark.min.js"></script> |  | ||||||
|         <script src="/docserver/searcher.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/clipboard.min.js"></script> |  | ||||||
|         <script src="/docserver/highlight.js"></script> |  | ||||||
|         <script src="/docserver/book.js"></script> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom JS scripts --> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     </div> |  | ||||||
|     </body> |  | ||||||
| </html> |  | ||||||
| @ -1,212 +0,0 @@ | |||||||
| <!DOCTYPE HTML> |  | ||||||
| <html lang="en" class="sidebar-visible no-js light"> |  | ||||||
|     <head> |  | ||||||
|         <!-- Book generated using mdBook --> |  | ||||||
|         <meta charset="UTF-8"> |  | ||||||
|         <title>Users - Doc Server</title> |  | ||||||
|         <base href="/docserver/"> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <!-- Custom HTML head --> |  | ||||||
|          |  | ||||||
|         <meta name="description" content="Doc Server"> |  | ||||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> |  | ||||||
|         <meta name="theme-color" content="#ffffff" /> |  | ||||||
| 
 |  | ||||||
|         <link rel="icon" href="/docserver/favicon.svg"> |  | ||||||
|         <link rel="shortcut icon" href="/docserver/favicon.png"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/variables.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/general.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/chrome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/print.css" media="print"> |  | ||||||
| 
 |  | ||||||
|         <!-- Fonts --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/FontAwesome/css/font-awesome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/fonts/fonts.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Highlight.js Stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/highlight.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/tomorrow-night.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/ayu-highlight.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom theme stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/custom.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/mdbook-admonish.css"> |  | ||||||
| 
 |  | ||||||
|     </head> |  | ||||||
|     <body> |  | ||||||
|     <div id="body-container"> |  | ||||||
|         <!-- Provide site root to javascript --> |  | ||||||
|         <script> |  | ||||||
|             var path_to_root = "/docserver/"; |  | ||||||
|             var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light"; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Work around some values being stored in localStorage wrapped in quotes --> |  | ||||||
|         <script> |  | ||||||
|             try { |  | ||||||
|                 var theme = localStorage.getItem('mdbook-theme'); |  | ||||||
|                 var sidebar = localStorage.getItem('mdbook-sidebar'); |  | ||||||
| 
 |  | ||||||
|                 if (theme.startsWith('"') && theme.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (sidebar.startsWith('"') && sidebar.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); |  | ||||||
|                 } |  | ||||||
|             } catch (e) { } |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Set the theme before any content is loaded, prevents flash --> |  | ||||||
|         <script> |  | ||||||
|             var theme; |  | ||||||
|             try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } |  | ||||||
|             if (theme === null || theme === undefined) { theme = default_theme; } |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             html.classList.remove('no-js') |  | ||||||
|             html.classList.remove('light') |  | ||||||
|             html.classList.add(theme); |  | ||||||
|             html.classList.add('js'); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Hide / unhide sidebar before it is displayed --> |  | ||||||
|         <script> |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             var sidebar = null; |  | ||||||
|             if (document.body.clientWidth >= 1080) { |  | ||||||
|                 try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } |  | ||||||
|                 sidebar = sidebar || 'visible'; |  | ||||||
|             } else { |  | ||||||
|                 sidebar = 'hidden'; |  | ||||||
|             } |  | ||||||
|             html.classList.remove('sidebar-visible'); |  | ||||||
|             html.classList.add("sidebar-" + sidebar); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <nav id="sidebar" class="sidebar" aria-label="Table of contents"> |  | ||||||
|             <div class="sidebar-scrollbox"> |  | ||||||
|                 <ol class="chapter"><li class="chapter-item "><a href="/docserver/introduction.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li class="chapter-item "><a href="/docserver/index.html"><strong aria-hidden="true">2.</strong> What is this ?</a></li><li class="chapter-item "><a href="/docserver/features.html"><strong aria-hidden="true">3.</strong> Features</a></li><li class="chapter-item "><a href="/docserver/howto.html"><strong aria-hidden="true">4.</strong> How to</a></li><li class="chapter-item "><a href="/docserver/quick-start.html"><strong aria-hidden="true">5.</strong> Quick Start</a></li><li class="spacer"></li><li class="chapter-item affix "><li class="part-title">Server and Content</li><li class="chapter-item "><a href="/docserver/one_server.html"><strong aria-hidden="true">6.</strong> One web server instance</a></li><li class="chapter-item "><a href="/docserver/server_modes.html"><strong aria-hidden="true">7.</strong> Server modes</a></li><li class="chapter-item "><a href="/docserver/static_content.html"><strong aria-hidden="true">8.</strong> Static contents</a></li><li class="chapter-item "><a href="/docserver/url_path.html"><strong aria-hidden="true">9.</strong> url_path prefix</a></li><li class="chapter-item "><a href="/docserver/protect_access.html"><strong aria-hidden="true">10.</strong> Protect access</a></li><li class="chapter-item affix "><li class="part-title">Users and Policies</li><li class="chapter-item expanded "><a href="/docserver/users.html" class="active"><strong aria-hidden="true">11.</strong> Users</a></li><li class="chapter-item "><a href="/docserver/users_sql.html"><strong aria-hidden="true">12.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/users_file_storage.html"><strong aria-hidden="true">13.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/roles.html"><strong aria-hidden="true">14.</strong> Roles</a></li><li class="chapter-item "><a href="/docserver/auths.html"><strong aria-hidden="true">15.</strong> Users auths</a></li><li class="chapter-item "><a href="/docserver/policies.html"><strong aria-hidden="true">16.</strong> Access policies</a></li><li class="chapter-item "><a href="/docserver/adminusers.html"><strong aria-hidden="true">17.</strong> Users Admin</a></li><li class="chapter-item affix "><li class="part-title">Sessions</li><li class="chapter-item "><a href="/docserver/sessions.html"><strong aria-hidden="true">18.</strong> Session data</a></li><li class="chapter-item "><a href="/docserver/pasetoken.html"><strong aria-hidden="true">19.</strong> Pasetoken</a></li><li class="chapter-item "><a href="/docserver/sessions_sql.html"><strong aria-hidden="true">20.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/sessions_file_storage.html"><strong aria-hidden="true">21.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/cookie.html"><strong aria-hidden="true">22.</strong> Cookie set</a></li><li class="chapter-item affix "><li class="part-title">Logs and Trace</li><li class="chapter-item "><a href="/docserver/trace.html"><strong aria-hidden="true">23.</strong> Traced</a></li><li class="chapter-item "><a href="/docserver/logs.html"><strong aria-hidden="true">24.</strong> Sessions logs</a></li><li class="chapter-item affix "><li class="part-title">Configuration</li><li class="chapter-item "><a href="/docserver/configuration.html"><strong aria-hidden="true">25.</strong> Configurable service</a></li><li class="chapter-item "><a href="/docserver/settings.html"><strong aria-hidden="true">26.</strong> Config settings</a></li><li class="spacer"></li></ol> |  | ||||||
|             </div> |  | ||||||
|             <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> |  | ||||||
|         </nav> |  | ||||||
| 
 |  | ||||||
|         <div id="page-wrapper" class="page-wrapper"> |  | ||||||
| 
 |  | ||||||
|             <div class="page"> |  | ||||||
|                                 <div id="menu-bar-hover-placeholder"></div> |  | ||||||
|                 <div id="menu-bar" class="menu-bar sticky bordered"> |  | ||||||
|                     <div class="left-buttons"> |  | ||||||
|                         <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> |  | ||||||
|                             <i class="fa fa-bars"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="sidebar-toggle" onclick="location.href='/'" class="icon-button" type="button" title="Home" aria-label="Home" aria-controls=""> |  | ||||||
|                             <i class="fa fa-home"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> |  | ||||||
|                             <i class="fa fa-paint-brush"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> |  | ||||||
|                         </ul> |  | ||||||
|                         <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> |  | ||||||
|                             <i class="fa fa-search"></i> |  | ||||||
|                         </button> |  | ||||||
|                     </div> |  | ||||||
| 
 |  | ||||||
|                     <h1 class="menu-title">Doc Server</h1> |  | ||||||
| 
 |  | ||||||
|                     <div class="right-buttons"> |  | ||||||
|                         <a href="/docserver/print.html" title="Print this book" aria-label="Print this book"> |  | ||||||
|                             <i id="print-button" class="fa fa-print"></i> |  | ||||||
|                         </a> |  | ||||||
|                         <a href="/logout" title="Sing out" aria-label="Sign out"> |  | ||||||
|                             <i id="logout-button" class="fa fa-sign-out"></i> |  | ||||||
|                         </a> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div id="search-wrapper" class="hidden"> |  | ||||||
|                     <form id="searchbar-outer" class="searchbar-outer"> |  | ||||||
|                         <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> |  | ||||||
|                     </form> |  | ||||||
|                     <div id="searchresults-outer" class="searchresults-outer hidden"> |  | ||||||
|                         <div id="searchresults-header" class="searchresults-header"></div> |  | ||||||
|                         <ul id="searchresults"> |  | ||||||
|                         </ul> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> |  | ||||||
|                 <script> |  | ||||||
|                     document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); |  | ||||||
|                     document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); |  | ||||||
|                     Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { |  | ||||||
|                         link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); |  | ||||||
|                     }); |  | ||||||
|                 </script> |  | ||||||
| 
 |  | ||||||
|                 <div id="content" class="content"> |  | ||||||
|                     <main> |  | ||||||
|                         <h1 id="users"><a class="header" href="#users">Users</a></h1> |  | ||||||
| 
 |  | ||||||
|                     </main> |  | ||||||
| 
 |  | ||||||
|                     <nav class="nav-wrapper" aria-label="Page navigation"> |  | ||||||
|                         <!-- Mobile navigation buttons --> |  | ||||||
|                             <a rel="prev" href="protect_access.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                                 <i class="fa fa-angle-left"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                             <a rel="next" href="users_sql.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                                 <i class="fa fa-angle-right"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                         <div style="clear: both"></div> |  | ||||||
|                     </nav> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
| 
 |  | ||||||
|             <nav class="nav-wide-wrapper" aria-label="Page navigation"> |  | ||||||
|                     <a rel="prev" href="protect_access.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                         <i class="fa fa-angle-left"></i> |  | ||||||
|                     </a> |  | ||||||
| 
 |  | ||||||
|                     <a rel="next" href="users_sql.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                         <i class="fa fa-angle-right"></i> |  | ||||||
|                     </a> |  | ||||||
|             </nav> |  | ||||||
| 
 |  | ||||||
|         </div> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <script> |  | ||||||
|             window.playground_copyable = true; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/ace.js"></script> |  | ||||||
|         <script src="/docserver/editor.js"></script> |  | ||||||
|         <script src="/docserver/mode-rust.js"></script> |  | ||||||
|         <script src="/docserver/theme-dawn.js"></script> |  | ||||||
|         <script src="/docserver/theme-tomorrow_night.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/elasticlunr.min.js"></script> |  | ||||||
|         <script src="/docserver/mark.min.js"></script> |  | ||||||
|         <script src="/docserver/searcher.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/clipboard.min.js"></script> |  | ||||||
|         <script src="/docserver/highlight.js"></script> |  | ||||||
|         <script src="/docserver/book.js"></script> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom JS scripts --> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     </div> |  | ||||||
|     </body> |  | ||||||
| </html> |  | ||||||
| @ -1,212 +0,0 @@ | |||||||
| <!DOCTYPE HTML> |  | ||||||
| <html lang="en" class="sidebar-visible no-js light"> |  | ||||||
|     <head> |  | ||||||
|         <!-- Book generated using mdBook --> |  | ||||||
|         <meta charset="UTF-8"> |  | ||||||
|         <title>File storage - Doc Server</title> |  | ||||||
|         <base href="/docserver/"> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <!-- Custom HTML head --> |  | ||||||
|          |  | ||||||
|         <meta name="description" content="Doc Server"> |  | ||||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> |  | ||||||
|         <meta name="theme-color" content="#ffffff" /> |  | ||||||
| 
 |  | ||||||
|         <link rel="icon" href="/docserver/favicon.svg"> |  | ||||||
|         <link rel="shortcut icon" href="/docserver/favicon.png"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/variables.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/general.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/chrome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/print.css" media="print"> |  | ||||||
| 
 |  | ||||||
|         <!-- Fonts --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/FontAwesome/css/font-awesome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/fonts/fonts.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Highlight.js Stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/highlight.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/tomorrow-night.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/ayu-highlight.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom theme stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/custom.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/mdbook-admonish.css"> |  | ||||||
| 
 |  | ||||||
|     </head> |  | ||||||
|     <body> |  | ||||||
|     <div id="body-container"> |  | ||||||
|         <!-- Provide site root to javascript --> |  | ||||||
|         <script> |  | ||||||
|             var path_to_root = "/docserver/"; |  | ||||||
|             var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light"; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Work around some values being stored in localStorage wrapped in quotes --> |  | ||||||
|         <script> |  | ||||||
|             try { |  | ||||||
|                 var theme = localStorage.getItem('mdbook-theme'); |  | ||||||
|                 var sidebar = localStorage.getItem('mdbook-sidebar'); |  | ||||||
| 
 |  | ||||||
|                 if (theme.startsWith('"') && theme.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (sidebar.startsWith('"') && sidebar.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); |  | ||||||
|                 } |  | ||||||
|             } catch (e) { } |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Set the theme before any content is loaded, prevents flash --> |  | ||||||
|         <script> |  | ||||||
|             var theme; |  | ||||||
|             try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } |  | ||||||
|             if (theme === null || theme === undefined) { theme = default_theme; } |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             html.classList.remove('no-js') |  | ||||||
|             html.classList.remove('light') |  | ||||||
|             html.classList.add(theme); |  | ||||||
|             html.classList.add('js'); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Hide / unhide sidebar before it is displayed --> |  | ||||||
|         <script> |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             var sidebar = null; |  | ||||||
|             if (document.body.clientWidth >= 1080) { |  | ||||||
|                 try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } |  | ||||||
|                 sidebar = sidebar || 'visible'; |  | ||||||
|             } else { |  | ||||||
|                 sidebar = 'hidden'; |  | ||||||
|             } |  | ||||||
|             html.classList.remove('sidebar-visible'); |  | ||||||
|             html.classList.add("sidebar-" + sidebar); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <nav id="sidebar" class="sidebar" aria-label="Table of contents"> |  | ||||||
|             <div class="sidebar-scrollbox"> |  | ||||||
|                 <ol class="chapter"><li class="chapter-item "><a href="/docserver/introduction.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li class="chapter-item "><a href="/docserver/index.html"><strong aria-hidden="true">2.</strong> What is this ?</a></li><li class="chapter-item "><a href="/docserver/features.html"><strong aria-hidden="true">3.</strong> Features</a></li><li class="chapter-item "><a href="/docserver/howto.html"><strong aria-hidden="true">4.</strong> How to</a></li><li class="chapter-item "><a href="/docserver/quick-start.html"><strong aria-hidden="true">5.</strong> Quick Start</a></li><li class="spacer"></li><li class="chapter-item affix "><li class="part-title">Server and Content</li><li class="chapter-item "><a href="/docserver/one_server.html"><strong aria-hidden="true">6.</strong> One web server instance</a></li><li class="chapter-item "><a href="/docserver/server_modes.html"><strong aria-hidden="true">7.</strong> Server modes</a></li><li class="chapter-item "><a href="/docserver/static_content.html"><strong aria-hidden="true">8.</strong> Static contents</a></li><li class="chapter-item "><a href="/docserver/url_path.html"><strong aria-hidden="true">9.</strong> url_path prefix</a></li><li class="chapter-item "><a href="/docserver/protect_access.html"><strong aria-hidden="true">10.</strong> Protect access</a></li><li class="chapter-item affix "><li class="part-title">Users and Policies</li><li class="chapter-item "><a href="/docserver/users.html"><strong aria-hidden="true">11.</strong> Users</a></li><li class="chapter-item "><a href="/docserver/users_sql.html"><strong aria-hidden="true">12.</strong> SQL storage</a></li><li class="chapter-item expanded "><a href="/docserver/users_file_storage.html" class="active"><strong aria-hidden="true">13.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/roles.html"><strong aria-hidden="true">14.</strong> Roles</a></li><li class="chapter-item "><a href="/docserver/auths.html"><strong aria-hidden="true">15.</strong> Users auths</a></li><li class="chapter-item "><a href="/docserver/policies.html"><strong aria-hidden="true">16.</strong> Access policies</a></li><li class="chapter-item "><a href="/docserver/adminusers.html"><strong aria-hidden="true">17.</strong> Users Admin</a></li><li class="chapter-item affix "><li class="part-title">Sessions</li><li class="chapter-item "><a href="/docserver/sessions.html"><strong aria-hidden="true">18.</strong> Session data</a></li><li class="chapter-item "><a href="/docserver/pasetoken.html"><strong aria-hidden="true">19.</strong> Pasetoken</a></li><li class="chapter-item "><a href="/docserver/sessions_sql.html"><strong aria-hidden="true">20.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/sessions_file_storage.html"><strong aria-hidden="true">21.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/cookie.html"><strong aria-hidden="true">22.</strong> Cookie set</a></li><li class="chapter-item affix "><li class="part-title">Logs and Trace</li><li class="chapter-item "><a href="/docserver/trace.html"><strong aria-hidden="true">23.</strong> Traced</a></li><li class="chapter-item "><a href="/docserver/logs.html"><strong aria-hidden="true">24.</strong> Sessions logs</a></li><li class="chapter-item affix "><li class="part-title">Configuration</li><li class="chapter-item "><a href="/docserver/configuration.html"><strong aria-hidden="true">25.</strong> Configurable service</a></li><li class="chapter-item "><a href="/docserver/settings.html"><strong aria-hidden="true">26.</strong> Config settings</a></li><li class="spacer"></li></ol> |  | ||||||
|             </div> |  | ||||||
|             <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> |  | ||||||
|         </nav> |  | ||||||
| 
 |  | ||||||
|         <div id="page-wrapper" class="page-wrapper"> |  | ||||||
| 
 |  | ||||||
|             <div class="page"> |  | ||||||
|                                 <div id="menu-bar-hover-placeholder"></div> |  | ||||||
|                 <div id="menu-bar" class="menu-bar sticky bordered"> |  | ||||||
|                     <div class="left-buttons"> |  | ||||||
|                         <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> |  | ||||||
|                             <i class="fa fa-bars"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="sidebar-toggle" onclick="location.href='/'" class="icon-button" type="button" title="Home" aria-label="Home" aria-controls=""> |  | ||||||
|                             <i class="fa fa-home"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> |  | ||||||
|                             <i class="fa fa-paint-brush"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> |  | ||||||
|                         </ul> |  | ||||||
|                         <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> |  | ||||||
|                             <i class="fa fa-search"></i> |  | ||||||
|                         </button> |  | ||||||
|                     </div> |  | ||||||
| 
 |  | ||||||
|                     <h1 class="menu-title">Doc Server</h1> |  | ||||||
| 
 |  | ||||||
|                     <div class="right-buttons"> |  | ||||||
|                         <a href="/docserver/print.html" title="Print this book" aria-label="Print this book"> |  | ||||||
|                             <i id="print-button" class="fa fa-print"></i> |  | ||||||
|                         </a> |  | ||||||
|                         <a href="/logout" title="Sing out" aria-label="Sign out"> |  | ||||||
|                             <i id="logout-button" class="fa fa-sign-out"></i> |  | ||||||
|                         </a> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div id="search-wrapper" class="hidden"> |  | ||||||
|                     <form id="searchbar-outer" class="searchbar-outer"> |  | ||||||
|                         <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> |  | ||||||
|                     </form> |  | ||||||
|                     <div id="searchresults-outer" class="searchresults-outer hidden"> |  | ||||||
|                         <div id="searchresults-header" class="searchresults-header"></div> |  | ||||||
|                         <ul id="searchresults"> |  | ||||||
|                         </ul> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> |  | ||||||
|                 <script> |  | ||||||
|                     document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); |  | ||||||
|                     document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); |  | ||||||
|                     Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { |  | ||||||
|                         link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); |  | ||||||
|                     }); |  | ||||||
|                 </script> |  | ||||||
| 
 |  | ||||||
|                 <div id="content" class="content"> |  | ||||||
|                     <main> |  | ||||||
|                         <h1 id="file-storage"><a class="header" href="#file-storage">File storage</a></h1> |  | ||||||
| 
 |  | ||||||
|                     </main> |  | ||||||
| 
 |  | ||||||
|                     <nav class="nav-wrapper" aria-label="Page navigation"> |  | ||||||
|                         <!-- Mobile navigation buttons --> |  | ||||||
|                             <a rel="prev" href="users_sql.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                                 <i class="fa fa-angle-left"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                             <a rel="next" href="roles.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                                 <i class="fa fa-angle-right"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                         <div style="clear: both"></div> |  | ||||||
|                     </nav> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
| 
 |  | ||||||
|             <nav class="nav-wide-wrapper" aria-label="Page navigation"> |  | ||||||
|                     <a rel="prev" href="users_sql.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                         <i class="fa fa-angle-left"></i> |  | ||||||
|                     </a> |  | ||||||
| 
 |  | ||||||
|                     <a rel="next" href="roles.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                         <i class="fa fa-angle-right"></i> |  | ||||||
|                     </a> |  | ||||||
|             </nav> |  | ||||||
| 
 |  | ||||||
|         </div> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <script> |  | ||||||
|             window.playground_copyable = true; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/ace.js"></script> |  | ||||||
|         <script src="/docserver/editor.js"></script> |  | ||||||
|         <script src="/docserver/mode-rust.js"></script> |  | ||||||
|         <script src="/docserver/theme-dawn.js"></script> |  | ||||||
|         <script src="/docserver/theme-tomorrow_night.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/elasticlunr.min.js"></script> |  | ||||||
|         <script src="/docserver/mark.min.js"></script> |  | ||||||
|         <script src="/docserver/searcher.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/clipboard.min.js"></script> |  | ||||||
|         <script src="/docserver/highlight.js"></script> |  | ||||||
|         <script src="/docserver/book.js"></script> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom JS scripts --> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     </div> |  | ||||||
|     </body> |  | ||||||
| </html> |  | ||||||
| @ -1,225 +0,0 @@ | |||||||
| <!DOCTYPE HTML> |  | ||||||
| <html lang="en" class="sidebar-visible no-js light"> |  | ||||||
|     <head> |  | ||||||
|         <!-- Book generated using mdBook --> |  | ||||||
|         <meta charset="UTF-8"> |  | ||||||
|         <title>SQL storage - Doc Server</title> |  | ||||||
|         <base href="/docserver/"> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <!-- Custom HTML head --> |  | ||||||
|          |  | ||||||
|         <meta name="description" content="Doc Server"> |  | ||||||
|         <meta name="viewport" content="width=device-width, initial-scale=1"> |  | ||||||
|         <meta name="theme-color" content="#ffffff" /> |  | ||||||
| 
 |  | ||||||
|         <link rel="icon" href="/docserver/favicon.svg"> |  | ||||||
|         <link rel="shortcut icon" href="/docserver/favicon.png"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/variables.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/general.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/chrome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/css/print.css" media="print"> |  | ||||||
| 
 |  | ||||||
|         <!-- Fonts --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/FontAwesome/css/font-awesome.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/fonts/fonts.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Highlight.js Stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/highlight.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/tomorrow-night.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/ayu-highlight.css"> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom theme stylesheets --> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/custom.css"> |  | ||||||
|         <link rel="stylesheet" href="/docserver/assets/css/mdbook-admonish.css"> |  | ||||||
| 
 |  | ||||||
|     </head> |  | ||||||
|     <body> |  | ||||||
|     <div id="body-container"> |  | ||||||
|         <!-- Provide site root to javascript --> |  | ||||||
|         <script> |  | ||||||
|             var path_to_root = "/docserver/"; |  | ||||||
|             var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light"; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Work around some values being stored in localStorage wrapped in quotes --> |  | ||||||
|         <script> |  | ||||||
|             try { |  | ||||||
|                 var theme = localStorage.getItem('mdbook-theme'); |  | ||||||
|                 var sidebar = localStorage.getItem('mdbook-sidebar'); |  | ||||||
| 
 |  | ||||||
|                 if (theme.startsWith('"') && theme.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1)); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 if (sidebar.startsWith('"') && sidebar.endsWith('"')) { |  | ||||||
|                     localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1)); |  | ||||||
|                 } |  | ||||||
|             } catch (e) { } |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Set the theme before any content is loaded, prevents flash --> |  | ||||||
|         <script> |  | ||||||
|             var theme; |  | ||||||
|             try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { } |  | ||||||
|             if (theme === null || theme === undefined) { theme = default_theme; } |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             html.classList.remove('no-js') |  | ||||||
|             html.classList.remove('light') |  | ||||||
|             html.classList.add(theme); |  | ||||||
|             html.classList.add('js'); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <!-- Hide / unhide sidebar before it is displayed --> |  | ||||||
|         <script> |  | ||||||
|             var html = document.querySelector('html'); |  | ||||||
|             var sidebar = null; |  | ||||||
|             if (document.body.clientWidth >= 1080) { |  | ||||||
|                 try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { } |  | ||||||
|                 sidebar = sidebar || 'visible'; |  | ||||||
|             } else { |  | ||||||
|                 sidebar = 'hidden'; |  | ||||||
|             } |  | ||||||
|             html.classList.remove('sidebar-visible'); |  | ||||||
|             html.classList.add("sidebar-" + sidebar); |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <nav id="sidebar" class="sidebar" aria-label="Table of contents"> |  | ||||||
|             <div class="sidebar-scrollbox"> |  | ||||||
|                 <ol class="chapter"><li class="chapter-item "><a href="/docserver/introduction.html"><strong aria-hidden="true">1.</strong> Introduction</a></li><li class="chapter-item "><a href="/docserver/index.html"><strong aria-hidden="true">2.</strong> What is this ?</a></li><li class="chapter-item "><a href="/docserver/features.html"><strong aria-hidden="true">3.</strong> Features</a></li><li class="chapter-item "><a href="/docserver/howto.html"><strong aria-hidden="true">4.</strong> How to</a></li><li class="chapter-item "><a href="/docserver/quick-start.html"><strong aria-hidden="true">5.</strong> Quick Start</a></li><li class="spacer"></li><li class="chapter-item affix "><li class="part-title">Server and Content</li><li class="chapter-item "><a href="/docserver/one_server.html"><strong aria-hidden="true">6.</strong> One web server instance</a></li><li class="chapter-item "><a href="/docserver/server_modes.html"><strong aria-hidden="true">7.</strong> Server modes</a></li><li class="chapter-item "><a href="/docserver/static_content.html"><strong aria-hidden="true">8.</strong> Static contents</a></li><li class="chapter-item "><a href="/docserver/url_path.html"><strong aria-hidden="true">9.</strong> url_path prefix</a></li><li class="chapter-item "><a href="/docserver/protect_access.html"><strong aria-hidden="true">10.</strong> Protect access</a></li><li class="chapter-item affix "><li class="part-title">Users and Policies</li><li class="chapter-item "><a href="/docserver/users.html"><strong aria-hidden="true">11.</strong> Users</a></li><li class="chapter-item expanded "><a href="/docserver/users_sql.html" class="active"><strong aria-hidden="true">12.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/users_file_storage.html"><strong aria-hidden="true">13.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/roles.html"><strong aria-hidden="true">14.</strong> Roles</a></li><li class="chapter-item "><a href="/docserver/auths.html"><strong aria-hidden="true">15.</strong> Users auths</a></li><li class="chapter-item "><a href="/docserver/policies.html"><strong aria-hidden="true">16.</strong> Access policies</a></li><li class="chapter-item "><a href="/docserver/adminusers.html"><strong aria-hidden="true">17.</strong> Users Admin</a></li><li class="chapter-item affix "><li class="part-title">Sessions</li><li class="chapter-item "><a href="/docserver/sessions.html"><strong aria-hidden="true">18.</strong> Session data</a></li><li class="chapter-item "><a href="/docserver/pasetoken.html"><strong aria-hidden="true">19.</strong> Pasetoken</a></li><li class="chapter-item "><a href="/docserver/sessions_sql.html"><strong aria-hidden="true">20.</strong> SQL storage</a></li><li class="chapter-item "><a href="/docserver/sessions_file_storage.html"><strong aria-hidden="true">21.</strong> File storage</a></li><li class="chapter-item "><a href="/docserver/cookie.html"><strong aria-hidden="true">22.</strong> Cookie set</a></li><li class="chapter-item affix "><li class="part-title">Logs and Trace</li><li class="chapter-item "><a href="/docserver/trace.html"><strong aria-hidden="true">23.</strong> Traced</a></li><li class="chapter-item "><a href="/docserver/logs.html"><strong aria-hidden="true">24.</strong> Sessions logs</a></li><li class="chapter-item affix "><li class="part-title">Configuration</li><li class="chapter-item "><a href="/docserver/configuration.html"><strong aria-hidden="true">25.</strong> Configurable service</a></li><li class="chapter-item "><a href="/docserver/settings.html"><strong aria-hidden="true">26.</strong> Config settings</a></li><li class="spacer"></li></ol> |  | ||||||
|             </div> |  | ||||||
|             <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div> |  | ||||||
|         </nav> |  | ||||||
| 
 |  | ||||||
|         <div id="page-wrapper" class="page-wrapper"> |  | ||||||
| 
 |  | ||||||
|             <div class="page"> |  | ||||||
|                                 <div id="menu-bar-hover-placeholder"></div> |  | ||||||
|                 <div id="menu-bar" class="menu-bar sticky bordered"> |  | ||||||
|                     <div class="left-buttons"> |  | ||||||
|                         <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar"> |  | ||||||
|                             <i class="fa fa-bars"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="sidebar-toggle" onclick="location.href='/'" class="icon-button" type="button" title="Home" aria-label="Home" aria-controls=""> |  | ||||||
|                             <i class="fa fa-home"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list"> |  | ||||||
|                             <i class="fa fa-paint-brush"></i> |  | ||||||
|                         </button> |  | ||||||
|                         <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu"> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li> |  | ||||||
|                             <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li> |  | ||||||
|                         </ul> |  | ||||||
|                         <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar"> |  | ||||||
|                             <i class="fa fa-search"></i> |  | ||||||
|                         </button> |  | ||||||
|                     </div> |  | ||||||
| 
 |  | ||||||
|                     <h1 class="menu-title">Doc Server</h1> |  | ||||||
| 
 |  | ||||||
|                     <div class="right-buttons"> |  | ||||||
|                         <a href="/docserver/print.html" title="Print this book" aria-label="Print this book"> |  | ||||||
|                             <i id="print-button" class="fa fa-print"></i> |  | ||||||
|                         </a> |  | ||||||
|                         <a href="/logout" title="Sing out" aria-label="Sign out"> |  | ||||||
|                             <i id="logout-button" class="fa fa-sign-out"></i> |  | ||||||
|                         </a> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <div id="search-wrapper" class="hidden"> |  | ||||||
|                     <form id="searchbar-outer" class="searchbar-outer"> |  | ||||||
|                         <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"> |  | ||||||
|                     </form> |  | ||||||
|                     <div id="searchresults-outer" class="searchresults-outer hidden"> |  | ||||||
|                         <div id="searchresults-header" class="searchresults-header"></div> |  | ||||||
|                         <ul id="searchresults"> |  | ||||||
|                         </ul> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
| 
 |  | ||||||
|                 <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM --> |  | ||||||
|                 <script> |  | ||||||
|                     document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible'); |  | ||||||
|                     document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible'); |  | ||||||
|                     Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) { |  | ||||||
|                         link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1); |  | ||||||
|                     }); |  | ||||||
|                 </script> |  | ||||||
| 
 |  | ||||||
|                 <div id="content" class="content"> |  | ||||||
|                     <main> |  | ||||||
|                         <h1 id="sql-storage"><a class="header" href="#sql-storage">SQL storage</a></h1> |  | ||||||
| <p><a href="/docserver/">Doc Server</a> <a href="users.html">users</a> use <a href="https://www.rust-lang.org">Rust</a> crate <a href="https://github.com/launchbadge/sqlx">SQLx</a></p> |  | ||||||
| <p>As <u>Dataabse Agnostic</u> can it easily support the following databases:</p> |  | ||||||
| <ul> |  | ||||||
| <li><a href="http://postgresql.org/">PostgreSQL</a></li> |  | ||||||
| <li><a href="https://www.mysql.com/">MySQL</a></li> |  | ||||||
| <li><a href="https://sqlite.org/">SQLite</a></li> |  | ||||||
| <li><a href="https://www.microsoft.com/en-us/sql-server">MSSQL</a></li> |  | ||||||
| </ul> |  | ||||||
| <p><a href="https://docs.rs/sqlx/latest/sqlx/any/index.html">sqlx::any</a> is used so:</p> |  | ||||||
| <blockquote> |  | ||||||
| <p><a href="/docserver/">Doc Server</a> for <a href="users.html">users</a> use a Generic database driver with the specific driver selected at runtime.</p> |  | ||||||
| </blockquote> |  | ||||||
| <p><a href="https://github.com/launchbadge/sqlx">SQLx</a> is also used for <a href="sessions.html">sessions</a> <a href="sessions_sql.html">SQL storage</a>.</p> |  | ||||||
| 
 |  | ||||||
|                     </main> |  | ||||||
| 
 |  | ||||||
|                     <nav class="nav-wrapper" aria-label="Page navigation"> |  | ||||||
|                         <!-- Mobile navigation buttons --> |  | ||||||
|                             <a rel="prev" href="users.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                                 <i class="fa fa-angle-left"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                             <a rel="next" href="users_file_storage.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                                 <i class="fa fa-angle-right"></i> |  | ||||||
|                             </a> |  | ||||||
| 
 |  | ||||||
|                         <div style="clear: both"></div> |  | ||||||
|                     </nav> |  | ||||||
|                 </div> |  | ||||||
|             </div> |  | ||||||
| 
 |  | ||||||
|             <nav class="nav-wide-wrapper" aria-label="Page navigation"> |  | ||||||
|                     <a rel="prev" href="users.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"> |  | ||||||
|                         <i class="fa fa-angle-left"></i> |  | ||||||
|                     </a> |  | ||||||
| 
 |  | ||||||
|                     <a rel="next" href="users_file_storage.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right"> |  | ||||||
|                         <i class="fa fa-angle-right"></i> |  | ||||||
|                     </a> |  | ||||||
|             </nav> |  | ||||||
| 
 |  | ||||||
|         </div> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         <script> |  | ||||||
|             window.playground_copyable = true; |  | ||||||
|         </script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/ace.js"></script> |  | ||||||
|         <script src="/docserver/editor.js"></script> |  | ||||||
|         <script src="/docserver/mode-rust.js"></script> |  | ||||||
|         <script src="/docserver/theme-dawn.js"></script> |  | ||||||
|         <script src="/docserver/theme-tomorrow_night.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/elasticlunr.min.js"></script> |  | ||||||
|         <script src="/docserver/mark.min.js"></script> |  | ||||||
|         <script src="/docserver/searcher.js"></script> |  | ||||||
| 
 |  | ||||||
|         <script src="/docserver/clipboard.min.js"></script> |  | ||||||
|         <script src="/docserver/highlight.js"></script> |  | ||||||
|         <script src="/docserver/book.js"></script> |  | ||||||
| 
 |  | ||||||
|         <!-- Custom JS scripts --> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     </div> |  | ||||||
|     </body> |  | ||||||
| </html> |  | ||||||