chore: add dist_docserver_book as submodule and link to resources
							
								
								
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							
							
						
						| @ -1,3 +1,6 @@ | ||||
| [submodule "pasetoken"] | ||||
| 	path = pasetoken | ||||
| 	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> | ||||