mirror of
				https://github.com/dani-garcia/vaultwarden.git
				synced 2025-10-31 10:18:19 +02:00 
			
		
		
		
	Updated the admin interface
Mostly updated the admin interface, also some small other items. - Added more diagnostic information to (hopefully) decrease issue reporting, or at least solve them quicker. - Added an option to generate a support string which can be used to copy/paste on the forum or during the creation of an issue. It will try to hide the sensitive information automatically. - Changed the `Created At` and `Last Active` info to be in a column and able to sort them in the users overview. - Some small layout changes. - Updated javascript and css files to the latest versions available. - Decreased the png file sizes using `oxipng` - Updated target='_blank' links to have rel='noreferrer' to prevent javascript window.opener modifications.
This commit is contained in:
		
							
								
								
									
										55
									
								
								src/static/scripts/bootstrap-native.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										55
									
								
								src/static/scripts/bootstrap-native.js
									
									
									
									
										vendored
									
									
								
							| @@ -1,6 +1,6 @@ | ||||
| /*! | ||||
|   * Native JavaScript for Bootstrap v3.0.10 (https://thednp.github.io/bootstrap.native/) | ||||
|   * Copyright 2015-2020 © dnp_theme | ||||
|   * Native JavaScript for Bootstrap v3.0.15 (https://thednp.github.io/bootstrap.native/) | ||||
|   * Copyright 2015-2021 © dnp_theme | ||||
|   * Licensed under MIT (https://github.com/thednp/bootstrap.native/blob/master/LICENSE) | ||||
|   */ | ||||
|  (function (global, factory) { | ||||
| @@ -15,10 +15,14 @@ | ||||
|  | ||||
|   var transitionDuration = 'webkitTransition' in document.head.style ? 'webkitTransitionDuration' : 'transitionDuration'; | ||||
|  | ||||
|   var transitionProperty = 'webkitTransition' in document.head.style ? 'webkitTransitionProperty' : 'transitionProperty'; | ||||
|  | ||||
|   function getElementTransitionDuration(element) { | ||||
|     var duration = supportTransition ? parseFloat(getComputedStyle(element)[transitionDuration]) : 0; | ||||
|     duration = typeof duration === 'number' && !isNaN(duration) ? duration * 1000 : 0; | ||||
|     return duration; | ||||
|     var computedStyle = getComputedStyle(element), | ||||
|         property = computedStyle[transitionProperty], | ||||
|         duration = supportTransition && property && property !== 'none' | ||||
|                  ? parseFloat(computedStyle[transitionDuration]) : 0; | ||||
|     return !isNaN(duration) ? duration * 1000 : 0; | ||||
|   } | ||||
|  | ||||
|   function emulateTransitionEnd(element,handler){ | ||||
| @@ -35,9 +39,15 @@ | ||||
|     return selector instanceof Element ? selector : lookUp.querySelector(selector); | ||||
|   } | ||||
|  | ||||
|   function bootstrapCustomEvent(eventName, componentName, related) { | ||||
|   function bootstrapCustomEvent(eventName, componentName, eventProperties) { | ||||
|     var OriginalCustomEvent = new CustomEvent( eventName + '.bs.' + componentName, {cancelable: true}); | ||||
|     OriginalCustomEvent.relatedTarget = related; | ||||
|     if (typeof eventProperties !== 'undefined') { | ||||
|       Object.keys(eventProperties).forEach(function (key) { | ||||
|         Object.defineProperty(OriginalCustomEvent, key, { | ||||
|           value: eventProperties[key] | ||||
|         }); | ||||
|       }); | ||||
|     } | ||||
|     return OriginalCustomEvent; | ||||
|   } | ||||
|  | ||||
| @@ -352,7 +362,7 @@ | ||||
|     }; | ||||
|     self.slideTo = function (next) { | ||||
|       if (vars.isSliding) { return; } | ||||
|       var activeItem = self.getActiveIndex(), orientation; | ||||
|       var activeItem = self.getActiveIndex(), orientation, eventProperties; | ||||
|       if ( activeItem === next ) { | ||||
|         return; | ||||
|       } else if  ( (activeItem < next ) || (activeItem === 0 && next === slides.length -1 ) ) { | ||||
| @@ -363,8 +373,9 @@ | ||||
|       if ( next < 0 ) { next = slides.length - 1; } | ||||
|       else if ( next >= slides.length ){ next = 0; } | ||||
|       orientation = vars.direction === 'left' ? 'next' : 'prev'; | ||||
|       slideCustomEvent = bootstrapCustomEvent('slide', 'carousel', slides[next]); | ||||
|       slidCustomEvent = bootstrapCustomEvent('slid', 'carousel', slides[next]); | ||||
|       eventProperties = { relatedTarget: slides[next], direction: vars.direction, from: activeItem, to: next }; | ||||
|       slideCustomEvent = bootstrapCustomEvent('slide', 'carousel', eventProperties); | ||||
|       slidCustomEvent = bootstrapCustomEvent('slid', 'carousel', eventProperties); | ||||
|       dispatchCustomEvent.call(element, slideCustomEvent); | ||||
|       if (slideCustomEvent.defaultPrevented) { return; } | ||||
|       vars.index = next; | ||||
| @@ -615,7 +626,7 @@ | ||||
|       } | ||||
|     } | ||||
|     self.show = function () { | ||||
|       showCustomEvent = bootstrapCustomEvent('show', 'dropdown', relatedTarget); | ||||
|       showCustomEvent = bootstrapCustomEvent('show', 'dropdown', { relatedTarget: relatedTarget }); | ||||
|       dispatchCustomEvent.call(parent, showCustomEvent); | ||||
|       if ( showCustomEvent.defaultPrevented ) { return; } | ||||
|       menu.classList.add('show'); | ||||
| @@ -626,12 +637,12 @@ | ||||
|       setTimeout(function () { | ||||
|         setFocus( menu.getElementsByTagName('INPUT')[0] || element ); | ||||
|         toggleDismiss(); | ||||
|         shownCustomEvent = bootstrapCustomEvent( 'shown', 'dropdown', relatedTarget); | ||||
|         shownCustomEvent = bootstrapCustomEvent('shown', 'dropdown', { relatedTarget: relatedTarget }); | ||||
|         dispatchCustomEvent.call(parent, shownCustomEvent); | ||||
|       },1); | ||||
|     }; | ||||
|     self.hide = function () { | ||||
|       hideCustomEvent = bootstrapCustomEvent('hide', 'dropdown', relatedTarget); | ||||
|       hideCustomEvent = bootstrapCustomEvent('hide', 'dropdown', { relatedTarget: relatedTarget }); | ||||
|       dispatchCustomEvent.call(parent, hideCustomEvent); | ||||
|       if ( hideCustomEvent.defaultPrevented ) { return; } | ||||
|       menu.classList.remove('show'); | ||||
| @@ -643,7 +654,7 @@ | ||||
|       setTimeout(function () { | ||||
|         element.Dropdown && element.addEventListener('click',clickHandler,false); | ||||
|       },1); | ||||
|       hiddenCustomEvent = bootstrapCustomEvent('hidden', 'dropdown', relatedTarget); | ||||
|       hiddenCustomEvent = bootstrapCustomEvent('hidden', 'dropdown', { relatedTarget: relatedTarget }); | ||||
|       dispatchCustomEvent.call(parent, hiddenCustomEvent); | ||||
|     }; | ||||
|     self.toggle = function () { | ||||
| @@ -749,7 +760,7 @@ | ||||
|       setFocus(modal); | ||||
|       modal.isAnimating = false; | ||||
|       toggleEvents(1); | ||||
|       shownCustomEvent = bootstrapCustomEvent('shown', 'modal', relatedTarget); | ||||
|       shownCustomEvent = bootstrapCustomEvent('shown', 'modal', { relatedTarget: relatedTarget }); | ||||
|       dispatchCustomEvent.call(modal, shownCustomEvent); | ||||
|     } | ||||
|     function triggerHide(force) { | ||||
| @@ -804,7 +815,7 @@ | ||||
|     }; | ||||
|     self.show = function () { | ||||
|       if (modal.classList.contains('show') && !!modal.isAnimating ) {return} | ||||
|       showCustomEvent = bootstrapCustomEvent('show', 'modal', relatedTarget); | ||||
|       showCustomEvent = bootstrapCustomEvent('show', 'modal', { relatedTarget: relatedTarget }); | ||||
|       dispatchCustomEvent.call(modal, showCustomEvent); | ||||
|       if ( showCustomEvent.defaultPrevented ) { return; } | ||||
|       modal.isAnimating = true; | ||||
| @@ -1193,7 +1204,7 @@ | ||||
|         if (dropLink && !dropLink.classList.contains('active') ) { | ||||
|           dropLink.classList.add('active'); | ||||
|         } | ||||
|         dispatchCustomEvent.call(element, bootstrapCustomEvent( 'activate', 'scrollspy', vars.items[index])); | ||||
|         dispatchCustomEvent.call(element, bootstrapCustomEvent( 'activate', 'scrollspy', { relatedTarget: vars.items[index] })); | ||||
|       } else if ( isActive && !inside ) { | ||||
|         item.classList.remove('active'); | ||||
|         if (dropLink && dropLink.classList.contains('active') && !item.parentNode.getElementsByClassName('active').length ) { | ||||
| @@ -1278,7 +1289,7 @@ | ||||
|       } else { | ||||
|         tabs.isAnimating = false; | ||||
|       } | ||||
|       shownCustomEvent = bootstrapCustomEvent('shown', 'tab', activeTab); | ||||
|       shownCustomEvent = bootstrapCustomEvent('shown', 'tab', { relatedTarget: activeTab }); | ||||
|       dispatchCustomEvent.call(next, shownCustomEvent); | ||||
|     } | ||||
|     function triggerHide() { | ||||
| @@ -1287,8 +1298,8 @@ | ||||
|         nextContent.style.float = 'left'; | ||||
|         containerHeight = activeContent.scrollHeight; | ||||
|       } | ||||
|       showCustomEvent = bootstrapCustomEvent('show', 'tab', activeTab); | ||||
|       hiddenCustomEvent = bootstrapCustomEvent('hidden', 'tab', next); | ||||
|       showCustomEvent = bootstrapCustomEvent('show', 'tab', { relatedTarget: activeTab }); | ||||
|       hiddenCustomEvent = bootstrapCustomEvent('hidden', 'tab', { relatedTarget: next }); | ||||
|       dispatchCustomEvent.call(next, showCustomEvent); | ||||
|       if ( showCustomEvent.defaultPrevented ) { return; } | ||||
|       nextContent.classList.add('active'); | ||||
| @@ -1331,7 +1342,7 @@ | ||||
|         nextContent = queryElement(next.getAttribute('href')); | ||||
|         activeTab = getActiveTab(); | ||||
|         activeContent = getActiveContent(); | ||||
|         hideCustomEvent = bootstrapCustomEvent( 'hide', 'tab', next); | ||||
|         hideCustomEvent = bootstrapCustomEvent( 'hide', 'tab', { relatedTarget: next }); | ||||
|         dispatchCustomEvent.call(activeTab, hideCustomEvent); | ||||
|         if (hideCustomEvent.defaultPrevented) { return; } | ||||
|         tabs.isAnimating = true; | ||||
| @@ -1637,7 +1648,7 @@ | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   var version = "3.0.10"; | ||||
|   var version = "3.0.15"; | ||||
|  | ||||
|   var index = { | ||||
|     Alert: Alert, | ||||
|   | ||||
							
								
								
									
										11
									
								
								src/static/scripts/bootstrap.css
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								src/static/scripts/bootstrap.css
									
									
									
									
										vendored
									
									
								
							| @@ -1,10 +1,10 @@ | ||||
| /*! | ||||
|  * Bootstrap v4.5.2 (https://getbootstrap.com/) | ||||
|  * Bootstrap v4.5.3 (https://getbootstrap.com/) | ||||
|  * Copyright 2011-2020 The Bootstrap Authors | ||||
|  * Copyright 2011-2020 Twitter, Inc. | ||||
|  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) | ||||
|  */ | ||||
|  :root { | ||||
| :root { | ||||
|   --blue: #007bff; | ||||
|   --indigo: #6610f2; | ||||
|   --purple: #6f42c1; | ||||
| @@ -216,6 +216,7 @@ caption { | ||||
|  | ||||
| th { | ||||
|   text-align: inherit; | ||||
|   text-align: -webkit-match-parent; | ||||
| } | ||||
|  | ||||
| label { | ||||
| @@ -3750,6 +3751,8 @@ input[type="button"].btn-block { | ||||
|   display: block; | ||||
|   min-height: 1.5rem; | ||||
|   padding-left: 1.5rem; | ||||
|   -webkit-print-color-adjust: exact; | ||||
|   color-adjust: exact; | ||||
| } | ||||
|  | ||||
| .custom-control-inline { | ||||
| @@ -5289,6 +5292,7 @@ a.badge-dark:focus, a.badge-dark.focus { | ||||
|   position: absolute; | ||||
|   top: 0; | ||||
|   right: 0; | ||||
|   z-index: 2; | ||||
|   padding: 0.75rem 1.25rem; | ||||
|   color: inherit; | ||||
| } | ||||
| @@ -10163,7 +10167,7 @@ a.text-dark:hover, a.text-dark:focus { | ||||
|  | ||||
| .text-break { | ||||
|   word-break: break-word !important; | ||||
|   overflow-wrap: break-word !important; | ||||
|   word-wrap: break-word !important; | ||||
| } | ||||
|  | ||||
| .text-reset { | ||||
| @@ -10256,3 +10260,4 @@ a.text-dark:hover, a.text-dark:focus { | ||||
|     border-color: #dee2e6; | ||||
|   } | ||||
| } | ||||
| /*# sourceMappingURL=bootstrap.css.map */ | ||||
| @@ -4,12 +4,13 @@ | ||||
|  * | ||||
|  * To rebuild or modify this file with the latest versions of the included | ||||
|  * software please visit: | ||||
|  *   https://datatables.net/download/#bs4/dt-1.10.22 | ||||
|  *   https://datatables.net/download/#bs4/dt-1.10.23 | ||||
|  * | ||||
|  * Included libraries: | ||||
|  *   DataTables 1.10.22 | ||||
|  *   DataTables 1.10.23 | ||||
|  */ | ||||
|  | ||||
| @charset "UTF-8"; | ||||
| table.dataTable { | ||||
|   clear: both; | ||||
|   margin-top: 6px !important; | ||||
| @@ -114,7 +115,7 @@ table.dataTable > thead .sorting_desc:before, | ||||
| table.dataTable > thead .sorting_asc_disabled:before, | ||||
| table.dataTable > thead .sorting_desc_disabled:before { | ||||
|   right: 1em; | ||||
|   content: "\2191"; | ||||
|   content: "↑"; | ||||
| } | ||||
| table.dataTable > thead .sorting:after, | ||||
| table.dataTable > thead .sorting_asc:after, | ||||
| @@ -122,7 +123,7 @@ table.dataTable > thead .sorting_desc:after, | ||||
| table.dataTable > thead .sorting_asc_disabled:after, | ||||
| table.dataTable > thead .sorting_desc_disabled:after { | ||||
|   right: 0.5em; | ||||
|   content: "\2193"; | ||||
|   content: "↓"; | ||||
| } | ||||
| table.dataTable > thead .sorting_asc:before, | ||||
| table.dataTable > thead .sorting_desc:after { | ||||
| @@ -165,9 +166,9 @@ div.dataTables_scrollFoot > .dataTables_scrollFootInner > table { | ||||
|  | ||||
| @media screen and (max-width: 767px) { | ||||
|   div.dataTables_wrapper div.dataTables_length, | ||||
|   div.dataTables_wrapper div.dataTables_filter, | ||||
|   div.dataTables_wrapper div.dataTables_info, | ||||
|   div.dataTables_wrapper div.dataTables_paginate { | ||||
| div.dataTables_wrapper div.dataTables_filter, | ||||
| div.dataTables_wrapper div.dataTables_info, | ||||
| div.dataTables_wrapper div.dataTables_paginate { | ||||
|     text-align: center; | ||||
|   } | ||||
|   div.dataTables_wrapper div.dataTables_paginate ul.pagination { | ||||
| @@ -213,10 +214,10 @@ div.dataTables_scrollHead table.table-bordered { | ||||
| div.table-responsive > div.dataTables_wrapper > div.row { | ||||
|   margin: 0; | ||||
| } | ||||
| div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:first-child { | ||||
| div.table-responsive > div.dataTables_wrapper > div.row > div[class^=col-]:first-child { | ||||
|   padding-left: 0; | ||||
| } | ||||
| div.table-responsive > div.dataTables_wrapper > div.row > div[class^="col-"]:last-child { | ||||
| div.table-responsive > div.dataTables_wrapper > div.row > div[class^=col-]:last-child { | ||||
|   padding-right: 0; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -4,20 +4,20 @@ | ||||
|  * | ||||
|  * To rebuild or modify this file with the latest versions of the included | ||||
|  * software please visit: | ||||
|  *   https://datatables.net/download/#bs4/dt-1.10.22 | ||||
|  *   https://datatables.net/download/#bs4/dt-1.10.23 | ||||
|  * | ||||
|  * Included libraries: | ||||
|  *   DataTables 1.10.22 | ||||
|  *   DataTables 1.10.23 | ||||
|  */ | ||||
|  | ||||
| /*! DataTables 1.10.22 | ||||
| /*! DataTables 1.10.23 | ||||
|  * ©2008-2020 SpryMedia Ltd - datatables.net/license | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * @summary     DataTables | ||||
|  * @description Paginate, search and order HTML tables | ||||
|  * @version     1.10.22 | ||||
|  * @version     1.10.23 | ||||
|  * @file        jquery.dataTables.js | ||||
|  * @author      SpryMedia Ltd | ||||
|  * @contact     www.datatables.net | ||||
| @@ -2775,7 +2775,7 @@ | ||||
| 				for ( var i=0, iLen=a.length-1 ; i<iLen ; i++ ) | ||||
| 				{ | ||||
| 					// Protect against prototype pollution | ||||
| 					if (a[i] === '__proto__') { | ||||
| 					if (a[i] === '__proto__' || a[i] === 'constructor') { | ||||
| 						throw new Error('Cannot set prototype values'); | ||||
| 					} | ||||
| 	 | ||||
| @@ -3157,7 +3157,7 @@ | ||||
| 				cells.push( nTd ); | ||||
| 	 | ||||
| 				// Need to create the HTML if new, or if a rendering function is defined | ||||
| 				if ( create || ((!nTrIn || oCol.mRender || oCol.mData !== i) && | ||||
| 				if ( create || ((oCol.mRender || oCol.mData !== i) && | ||||
| 					 (!$.isPlainObject(oCol.mData) || oCol.mData._ !== i+'.display') | ||||
| 				)) { | ||||
| 					nTd.innerHTML = _fnGetCellData( oSettings, iRow, i, 'display' ); | ||||
| @@ -3189,10 +3189,6 @@ | ||||
| 	 | ||||
| 			_fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [nTr, rowData, iRow, cells] ); | ||||
| 		} | ||||
| 	 | ||||
| 		// Remove once webkit bug 131819 and Chromium bug 365619 have been resolved | ||||
| 		// and deployed | ||||
| 		row.nTr.setAttribute( 'role', 'row' ); | ||||
| 	} | ||||
| 	 | ||||
| 	 | ||||
| @@ -9546,7 +9542,7 @@ | ||||
| 	 *  @type string | ||||
| 	 *  @default Version number | ||||
| 	 */ | ||||
| 	DataTable.version = "1.10.22"; | ||||
| 	DataTable.version = "1.10.23"; | ||||
|  | ||||
| 	/** | ||||
| 	 * Private data store, containing all of the settings objects that are | ||||
| @@ -13970,7 +13966,7 @@ | ||||
| 		 * | ||||
| 		 *  @type string | ||||
| 		 */ | ||||
| 		build:"bs4/dt-1.10.22", | ||||
| 		build:"bs4/dt-1.10.23", | ||||
| 	 | ||||
| 	 | ||||
| 		/** | ||||
|   | ||||
		Reference in New Issue
	
	Block a user