CVE-2022-2098: Weak Password Requirements (CWE-521)
value: Weak Password Requirements in GitHub repository kromitgmbh/titra prior to 0.78.1.
CWE description: The product does not require that users should have strong passwords, which makes it easier for attackers to compromise user accounts.
CVSS v3 base score: 9.8
Published: 2022-06-16T10:15Z
Repository: https://github.com/kromitgmbh/titra
Language: JavaScript
Files changed: imports/ui/pages/changePassword.html, imports/ui/pages/changePassword.js, imports/ui/pages/register.html, imports/ui/pages/register.js, imports/ui/pages/signIn.js, imports/ui/styles/dark.scss, imports/ui/styles/light.scss, imports/utils/frontend_helpers.js, package-lock.json, package.json
Commit date: 2022-06-16 09:56:10 +0200
Commit message: 🔒 fixed further security vulnerabilities adding additional password validation
💄 improved light and dark theme (thanks @thomas-kromit)

Diff: diff --git a/imports/ui/pages/changePassword.html b/imports/ui/pages/changePassword.html
index d01ff6b..a3ed1f4 100644
--- a/imports/ui/pages/changePassword.html
+++ b/imports/ui/pages/changePassword.html
@@ -13,26 +13,26 @@
                 {{#unless hasTokenSet}}
                 <div class="at-input mb-3 has-feedback">
                   <label class="control-label" for="at-field-password">
                     {{t "login.current_password"}}
                   </label>
-                  <input aria-label='{{t "login.current_password"}}' type="password" class="form-control" id="at-field-current-password" name="at-field-current-password" placeholder="Current Password" autocapitalize="none" autocorrect="off">
+                  <input aria-label='{{t "login.current_password"}}' type="password" class="form-control" id="at-field-current-password" name="at-field-current-password" placeholder="Current Password" autocapitalize="none" autocorrect="off" maxlength="50">
                   <span class="help-block hide"></span>
                 </div>
                 {{/unless}}
                 <div class="at-input mb-3 has-feedback">
                   <label class="control-label" for="at-field-password">
                     {{t "login.password"}}
                   </label>
-                  <input type="password" class="form-control" id="at-field-password" name="at-field-password" placeholder="{{t 'login.password'}}" autocapitalize="none" autocorrect="off">
-                  <span class="help-block hide"></span>
+                  <input type="password" class="form-control" id="at-field-password" name="at-field-password" placeholder="{{t 'login.password'}}" autocapitalize="none" autocorrect="off" maxlength="50" minlength="8">
+                  <div class="js-password-feedback invalid-feedback hide"></div>
                 </div>
                 <div class="at-input mb-3 has-feedback">
                   <label class="control-label" for="at-field-password_again">
                     {{t "login.password_again"}}
                   </label>
-                  <input aria-label='{{t "login.password_again"}}' type="password" class="form-control" id="at-field-password-again" name="at-field-password-again" placeholder="{{t 'login.password_again'}}" autocapitalize="none" autocorrect="off">
+                  <input aria-label='{{t "login.password_again"}}' type="password" class="form-control" id="at-field-password-again" name="at-field-password-again" placeholder="{{t 'login.password_again'}}" autocapitalize="none" autocorrect="off"  maxlength="50" minlength="8">
                   <span class="help-block hide"></span>
                 </div>
                 <div class="row">
                   <div class="col-6 col-md-3 me-auto d-grid">
                     {{#unless hasTokenSet}}
diff --git a/imports/ui/pages/changePassword.js b/imports/ui/pages/changePassword.js
index 66d738c..a0c25ef 100644
--- a/imports/ui/pages/changePassword.js
+++ b/imports/ui/pages/changePassword.js
@@ -1,7 +1,7 @@
 import { FlowRouter } from 'meteor/ostrio:flow-router-extra'
-import { showToast } from '../../utils/frontend_helpers.js'
+import { showToast, validatePassword } from '../../utils/frontend_helpers.js'
 import './changePassword.html'
 import { t } from '../../utils/i18n.js'
 
 Template.changePassword.events({
   'click #changePassword': (event, templateInstance) => {
@@ -12,20 +12,36 @@ Template.changePassword.events({
       templateInstance.$('.notification').text(t('login.password_mismatch'))
       document.querySelector('.notification').classList.toggle('d-none')
       return
     }
     if (FlowRouter.getParam('token') && templateInstance.$('#at-field-password').val() && templateInstance.$('#at-field-password-again').val()) {
+      const passwordValidation = validatePassword(templateInstance.$('#at-field-password').val())
+      if (!passwordValidation.valid) {
+        templateInstance.$('#at-field-password').addClass('is-invalid')
+        templateInstance.$('#at-field-password-again').addClass('is-invalid')
+        templateInstance.$('.notification').text(passwordValidation.message)
+        document.querySelector('.notification').classList.toggle('d-none')
+        return
+      }
       Accounts.resetPassword(FlowRouter.getParam('token'), templateInstance.$('#at-field-password').val(), (error) => {
         if (error) {
           templateInstance.$('.notification').text(t(`login.${error.error}`))
           document.querySelector('.notification').classList.toggle('d-none')
         } else {
           showToast(t('notifications.password_changed'))
           FlowRouter.go('projectlist')
         }
       })
     } else if (Meteor.user() && templateInstance.$('#at-field-current-password').val() && templateInstance.$('#at-field-password').val() && templateInstance.$('#at-field-password-again').val()) {
+      const passwordValidation = validatePassword(templateInstance.$('#at-field-password').val())
+      if (!passwordValidation.valid) {
+        templateInstance.$('#at-field-password').addClass('is-invalid')
+        templateInstance.$('#at-field-password-again').addClass('is-invalid')
+        templateInstance.$('.notification').text(passwordValidation.message)
+        document.querySelector('.notification').classList.toggle('d-none')
+        return
+      }
       Accounts.changePassword(templateInstance.$('#at-field-current-password').val(), templateInstance.$('#at-field-password').val(), (error) => {
         if (error) {
           templateInstance.$('.notification').text(t(`login.${error.error}`))
           document.querySelector('.notification').classList.toggle('d-none')
         } else {
@@ -33,9 +49,27 @@ Template.changePassword.events({
           FlowRouter.go('projectlist')
         }
       })
     }
   },
+  'keyup #at-field-password': (event, templateInstance) => {
+    event.preventDefault()
+    const validetedPW = validatePassword(templateInstance.$('#at-field-password').val())
+    templateInstance.$('.js-password-feedback').text(validetedPW.message)
+    if (validetedPW.valid) {
+      templateInstance.$('#at-field-password').removeClass('is-invalid')
+      templateInstance.$('#at-field-password-again').removeClass('is-invalid')
+      templateInstance.$('.js-password-feedback').removeClass('invalid-feedback')
+      templateInstance.$('.js-password-feedback').addClass('valid-feedback')
+      templateInstance.$('.js-password-feedback').removeClass('hide')
+    } else {
+      templateInstance.$('#at-field-password').addClass('is-invalid')
+      templateInstance.$('.js-password-feedback').removeClass('valid-feedback')
+      templateInstance.$('.js-password-feedback').addClass('invalid-feedback')
+      templateInstance.$('.js-password-feedback').removeClass('hide')
+      templateInstance.$('.js-password-feedback').addClass('d-block')
+    }
+  },
 })
 Template.changePassword.helpers({
   hasTokenSet: () => FlowRouter.getParam('token'),
 })
diff --git a/imports/ui/pages/register.html b/imports/ui/pages/register.html
index 4264651..b93156b 100644
--- a/imports/ui/pages/register.html
+++ b/imports/ui/pages/register.html
@@ -24,18 +24,18 @@
                 </div>
                 <div class="at-input mb-3">
                   <label class="control-label" for="at-field-password">
                     {{t "login.password"}}
                   </label>
-                  <input type="password" class="form-control" id="at-field-password" name="at-field-password" placeholder="{{t 'login.password'}}" autocapitalize="none" autocorrect="off">
+                  <input type="password" class="form-control" id="at-field-password" name="at-field-password" placeholder="{{t 'login.password'}}" autocapitalize="none" autocorrect="off"  maxlength="50" minlength="8">
                   <div class="js-password-feedback invalid-feedback hide"></div>
                 </div>
                 <div class="at-input mb-3 has-feedback">
                   <label class="control-label" for="at-field-password_again">
                     {{t "login.password_again"}}
                   </label>
-                  <input aria-label='{{t "login.password_again"}}' type="password" class="form-control" id="at-field-password-again" name="at-field-password-again" placeholder="{{t 'login.password_again'}}" autocapitalize="none" autocorrect="off">
+                  <input aria-label='{{t "login.password_again"}}' type="password" class="form-control" id="at-field-password-again" name="at-field-password-again" placeholder="{{t 'login.password_again'}}" autocapitalize="none" autocorrect="off"  maxlength="50" minlength="8">
                   <span class="help-block hide"></span>
                 </div>
                 {{#unless currentUser}}
                   <div class="at-input mb-3 has-feedback">
                     <label class="control-label" for="at-field-name">
diff --git a/imports/ui/pages/register.js b/imports/ui/pages/register.js
index 36ccbd6..38ec32a 100644
--- a/imports/ui/pages/register.js
+++ b/imports/ui/pages/register.js
@@ -1,8 +1,8 @@
 import { FlowRouter } from 'meteor/ostrio:flow-router-extra'
 import { t } from '../../utils/i18n.js'
-import { validateEmail, validatePassword } from '../../utils/frontend_helpers.js' 
+import { validateEmail, validatePassword } from '../../utils/frontend_helpers.js'
 import './register.html'
 
 Template.register.events({
   'click #register': (event, templateInstance) => {
     event.preventDefault()
diff --git a/imports/ui/pages/signIn.js b/imports/ui/pages/signIn.js
index f5b711a..5db78e5 100644
--- a/imports/ui/pages/signIn.js
+++ b/imports/ui/pages/signIn.js
@@ -64,19 +64,14 @@ Template.signIn.events({
   },
   'click #at-forgotPwd': (event, templateInstance) => {
     event.preventDefault()
     if (templateInstance.$('#at-field-email').val() && validateEmail(templateInstance.$('#at-field-email').val())) {
       Accounts.forgotPassword({ email: templateInstance.$('#at-field-email').val() }, (error) => {
-        if (error) {
-          templateInstance.$('.notification').text(t('login.email_unknown'))
-          document.querySelector('.notification').classList.remove('d-none')
-        } else {
-          templateInstance.$('.notification').text(t('login.reset_password_mail'))
-          document.querySelector('.notification').classList.remove('d-none')
-          templateInstance.$('#at-field-email').removeClass('is-invalid')
-          templateInstance.$('#at-field-password').removeClass('is-invalid')
-        }
+        templateInstance.$('.notification').text(t('login.reset_password_mail'))
+        document.querySelector('.notification').classList.remove('d-none')
+        templateInstance.$('#at-field-email').removeClass('is-invalid')
+        templateInstance.$('#at-field-password').removeClass('is-invalid')
       })
     } else {
       templateInstance.$('#at-field-email').addClass('is-invalid')
     }
   },
diff --git a/imports/ui/styles/dark.scss b/imports/ui/styles/dark.scss
index eb5dc05..9ef2ab7 100644
--- a/imports/ui/styles/dark.scss
+++ b/imports/ui/styles/dark.scss
@@ -1,5 +1,6 @@
+
 // ++++ [DarkThemeColors] ++++   ///////////////////////////////////////////////////////
 $primary:                               #005a52;       // Color/Background-Color for links, Save-, Selectbuttons 
 $secondary:                             #272727;       // Background-Color for all fields, control buttons, checkboxes
 $success:                               #009688;       
 $info:                                  #86a8a5;
@@ -11,10 +12,11 @@ $dark-border:                           #3a3a3a;
 $dark-form:                             #1d1d1d;
 $grey:                                  #2d2d2d;
 $lightgrey:                             #404040;
 $gray-900:                              #eeeeee;
 $titra-dark:                            #006d62;
+$none:                                  none;
 
 //Tabs/Container
 $tab-background-color:                  $grey;           // Tab/Container-Background-Color
 $tab-border-color:                      $grey;           // Tab/Container-Border-Color
 $border-color:                          $dark;
@@ -157,22 +159,31 @@ $modal-header-bg-color:                 $lightgrey;
 $modal-header-border-b-color:           0px;
 $modal-content-bg-color:                $grey;
 $modal-content-color:                   #dadada;
 
 
+//++++ [AdvancedCustomization] ++++ ///////////////////////////////////////////////////////
 
 
-
-
-
-
-//++++ [AdvancedCustomization] ++++ ///////////////////////////////////////////////////////
-.internal-autofill-selected {
-    appearance:             menulist-button;
-    background-color:       $success !important;
-    background-image:       none !important;
+::selection {
+  color:                    $success !important;
+  background:               $lightgrey !important;
+}
+::-moz-selection {
+  color:                    $success !important;
+  background:               $lightgrey !important;
+}
+.nav-tabs {
+    border-bottom:          0px solid #dee2e6 !important;
 }
+.dt-scrollable {
+    border-top:             0px solid var(--dt-border-color) !important;
+}
+.dt-scrollable__no-data {
+    border:                 0px !important;
+}
+
 .d-flex {
     display:                flex !important;
     color:                  $success !important;
 }
 .table-responsive {
@@ -289,14 +300,21 @@ $modal-content-color:                   #dadada;
     outline:                0;
     box-shadow:             none !important;
 }   
 .tab-borders {
   background-color:         $tab-background-color !important;
-  border-left:              1px solid $dark;
-  border-right:             1px solid $dark;
-  border-bottom:            1px solid $dark;
+  border-left:              1px solid $dark !important;
+  border-right:             1px solid $dark !important;
+  border-bottom:            1px solid $dark !important;
+  border-top:               1px solid $dark !important;
+  border-top-right-radius:  0.25rem !important;
+  border-bottom-right-radius:  0.25rem !important;
+  border-bottom-left-radius:  0.25rem !important;
 }
+
+
+
 .tab-content {
     background-color:       $tab-background-color !important;
 }
 .table {
     color:                  $wv-table-font-color !important;
@@ -334,10 +352,16 @@ $modal-content-color:                   #dadada;
 .alert-secondary {
     color:                  $alert-secondary-color !important;
     background-color:       $alert-secondary-bg-color !important;
     border-color:           $alert-secondary-border-color !important;
 }
+
+.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky > * {
+    top: 0;
+    background: none !important;
+}
+
 .fc-button-primary {
     color:                  $fc-color !important;
     background-color:       $fc-bg-color !important;
     border-color:           $fc-border-color !important;
 } 
@@ -439,30 +463,30 @@ thead, tbody, tfoot, tr, td, th {
 a {
     color:                  $success !important;
     text-decoration:        underline;
 }
 g > text {
-    fill: #FFFFFF;
+    fill:                 #FFFFFF;
 }
 .gantt .grid-header {
-    fill: $grey !important;
-    stroke: $grey !important;
+    fill:                   $grey !important;
+    stroke:                 $grey !important;
 }
 .gantt .grid-row {
-    fill: $grey !important;
+    fill:                   $grey !important;
 }
 .gantt .grid-row:nth-child(even) {
-    fill: $dark-form !important;
+    fill:                   $dark-form !important;
 }
 .gantt .row-line {
-    stroke: $dark !important;
+    stroke:                 $dark !important;
 }
 .gantt .lower-text {
-    fill: $body-color !important;
+    fill:                   $body-color !important;
 }
 .gantt .upper-text {
-    fill: $body-color !important;
+    fill:                   $body-color !important;
 }
 .gantt .bar {
-    fill: $lightgrey !important;
+    fill:                   $lightgrey !important;
 }
 @import "{}/imports/ui/styles/general.scss";
\ No newline at end of file
diff --git a/imports/ui/styles/light.scss b/imports/ui/styles/light.scss
index 7872cf8..d303cd8 100644
--- a/imports/ui/styles/light.scss
+++ b/imports/ui/styles/light.scss
@@ -1,136 +1,156 @@
-$primary: #009688;
-$secondary: #f7f7f7;
-$success: #009688;
-$info: #b2dfdb;
-$warning: #ffc107;
-$danger: #ff5722;
-$light: #BDBDBD;
-$dark: #455A64;
+$primary:             #009688;
+$secondary:           #f7f7f7;
+$success:             #009688;
+$info:                #b2dfdb;
+$warning:             #ffc107;
+$danger:              #ff5722;
+$light:               #BDBDBD;
+$dark:                #455A64;
 $dropdown-link-hover-bg: $dark !default;
 
 .btn-primary {
-    color: #fff !important;
+    color:            #fff !important;
     background-color: #009688 !important;
-    border-color: #009688 !important; 
+    border-color:     #009688 !important; 
 }
 .btn-primary:hover {
-    color: #fff!important;
+    color:            #fff!important;
     background-color: #006e63!important;
-    border-color: #006e63!important;
+    border-color:     #006e63!important;
 }
 .btn-secondary {
-    color: #000 !important;
+    color:            #000 !important;
     background-color: #ffffff !important;
 }
 .btn-secondary:hover {
-    color: #fff !important;
+    color:            #fff !important;
     background-color: #009688 !important;
 }
 .list-group-item {
-  color: #495057;
+  color:              #495057;
 }
 .tab-borders {
-  background-color: $secondary;
-  border-left: 1px solid #dee2e6;
-  border-right: 1px solid #dee2e6;
-  border-bottom: 1px solid #dee2e6;
+  background-color:     $secondary;
+  border-left:          1px solid #dee2e6;
+  border-right:         1px solid #dee2e6;
+  border-bottom:        1px solid #dee2e6;
 }
 .form-select {
-  background: $secondary !important;
+  background:           $secondary !important;
 }
 .all-projects-bg {
-  background: rgba(0,112,101,0.05) !important;
+  background:         rgba(0,112,101,0.05) !important;
 }
 .fc-unthemed td.fc-today {
-  background: rgba(0, 150, 136, 0.5) !important;
+  background:         rgba(0, 150, 136, 0.5) !important;
 }
 .alert-secondary {
-    color: #7b7b7b;
-    background-color: #ffffff;
-    border-color: #e8e8e8;
+    color:              #7b7b7b;
+    background-color:   #ffffff;
+    border-color:       #e8e8e8;
 }
 .btn-outline-secondary {
-  border-color: #ced4da !important;
-  color: #212529 !important;
+  border-color:         #ced4da !important;
+  color:                #212529 !important;
 }
 .btn-outline-secondary:hover{
-  background-color: #ececec !important;
+  background-color:     #ececec !important;
 }
 .fc-button-primary {
-    color: #000000 !important;
-    background-color: $secondary !important;
-    border-color: $light !important;
+    color:              #000000 !important;
+    background-color:     $secondary !important;
+    border-color:         $light !important;
 } 
 .fc-button-primary:hover {
-    color: #000000 !important;
-    background-color: #eee !important;
-    border-color: $light !important;
+    color:                #000000 !important;
+    background-color:     #eee !important;
+    border-color:           $light !important;
 }
 .datatable {
-    --dt-border-color: #d1d8dd;
-    --dt-light-bg: #f5f7fa;
-    --dt-text-color: #000000;
-    --dt-text-light: #dfe2e5;
-    --dt-cell-bg: #fff;
+    --dt-border-color:     #d1d8dd;
+    --dt-light-bg:         #f5f7fa;
+    --dt-text-color:       #000000;
+    --dt-text-light:       #dfe2e5;
+    --dt-cell-bg:          #fff;
     --dt-focus-border-width: 1px;
     --dt-selection-highlight-color: var(--dt-light-yellow);
     --dt-toast-message-border: none;
-    --dt-header-cell-bg: var(--dt-cell-bg);
+    --dt-header-cell-bg:     var(--dt-cell-bg);
 }
 .nav-tabs .nav-link.active, .nav-tabs .nav-item.show .nav-link {
-  color: #495057;
-  background-color: #fff;
-  border-color: #dee2e6 #dee2e6 #fff;
+  color:                    #495057;
+  background-color:         #fff;
+  border-color:             #dee2e6 #dee2e6 #fff;
+  
+}
+.nav-tabs {
+    border-bottom: 0px solid #dee2e6 !important;
+}
+.dt-scrollable {
+    //border-top: 0px solid #d1d8dd;
+    border-top: 0px solid var(--dt-border-color) !important;
+}
+.dt-scrollable__no-data {
+border: 0px !important;
 }
 .nav-tabs .nav-link:hover {
-  color: #495057;
-  background-color: #fff;
-  border-color: #dee2e6 #dee2e6 #fff;
+  color:                    #495057;
+  background-color:         #fff;
+  border-color:             #dee2e6 #dee2e6 #fff;
 }
 .drag.card {
-  background-color: $secondary;  
+  background-color:           $secondary;  
 }
 .card-block .list-group-item {
-  background-color: $secondary;
+  background-color:           $secondary;
 }
 .at-link {
-  color: $dark;
+  color:                      $dark;
 }
 .dp-current {
-  background-color: $primary !important;
+  background-color:           $primary !important;
 }
 .dp-cal-month:hover {
-  background-color: $primary !important;
+  background-color:           $primary !important;
 }
 .dp-cal-year:hover {
-  background-color: $primary !important;
+  background-color:           $primary !important;
 }
 .dp-day:hover {
-  background-color: $primary !important;
+  background-color:           $primary !important;
 }
 .dp-day:hover {
-  background-color: $primary !important;
+  background-color:           $primary !important;
 }
 .dp-prev:hover {
-  background-color: $primary !important;
+  background-color:           $primary !important;
 }
 .dp-next:hover {
-  background-color: $primary !important;
+  background-color:           $primary !important;
 }
 .dp-today:hover {
-  background-color: $primary !important;
+  background-color:           $primary !important;
 }
 .dp-clear:hover {
-  background-color: $primary !important;
+  background-color:           $primary !important;
 }
 .dp-close:hover {
-  background-color: $primary !important;
+  background-color:           $primary !important;
 }
 .dp:before {
-  background: $primary !important;
+  background:                 $primary !important;
 }
 g>text {
-  fill: #212529;
+  fill:                     #212529;
+}
+.tab-borders {
+    background-color:       #f7f7f7 !important;
+    border-left:            1px solid #dee2e6 !important;
+    border-right:           1px solid #dee2e6 !important;
+    border-bottom:          1px solid #dee2e6 !important;
+    border-top:             1px solid #dee2e6 !important;
+    border-top-right-radius:            0.25rem !important;
+    border-bottom-right-radius:         0.25rem !important;
+    border-bottom-left-radius:          0.25rem !important;
 }
-
 @import "{}/imports/ui/styles/general.scss";
diff --git a/imports/utils/frontend_helpers.js b/imports/utils/frontend_helpers.js
index f5cde8a..4df983c 100644
--- a/imports/utils/frontend_helpers.js
+++ b/imports/utils/frontend_helpers.js
@@ -83,17 +83,23 @@ function validatePassword(pwd) {
   const strongRegex = /^(?=.{14,})(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*\W).*$/g
   const mediumRegex = /^(?=.{10,})(((?=.*[A-Z])(?=.*[a-z]))|((?=.*[A-Z])(?=.*[0-9]))|((?=.*[a-z])(?=.*[0-9]))).*$/g
   const enoughRegex = /(?=.{8,}).*/g
   if (pwd.length === 0) {
     return { valid: false, message: t('login.password_insufficient') }
-  } if (enoughRegex.test(pwd) === false) {
+  }
+  if (enoughRegex.test(pwd) === false) {
     return { valid: false, message: t('login.password_insufficient') }
-  } if (strongRegex.test(pwd)) {
+  }
+  if (strongRegex.test(pwd)) {
     return { valid: true, message: t('login.password_strong') }
-  } if (mediumRegex.test(pwd)) {
+  }
+  if (mediumRegex.test(pwd)) {
     return { valid: true, message: t('login.password_medium') }
   }
+  if (pwd.length > 50) {
+    return { valid: false, message: t('login.password_insufficient') }
+  }
   return { valid: true, message: t('login.password_weak') }
 }
 async function emojify(match) {
   const emojiImport = await import('node-emoji')
   return emojiImport.default.emojify(match, (name) => name)
diff --git a/package-lock.json b/package-lock.json
index da155d5..3582f22 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,18 +1,19 @@
 {
   "name": "titra",
-  "version": "0.77.2",
+  "version": "0.78.0",
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
     "@ampproject/remapping": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz",
-      "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
+      "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
       "dev": true,
       "requires": {
-        "@jridgewell/trace-mapping": "^0.3.0"
+        "@jridgewell/gen-mapping": "^0.1.0",
+        "@jridgewell/trace-mapping": "^0.3.9"
       }
     },
     "@babel/code-frame": {
       "version": "7.16.7",
       "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz",
@@ -21,31 +22,31 @@
       "requires": {
         "@babel/highlight": "^7.16.7"
       }
     },
     "@babel/compat-data": {
-      "version": "7.17.10",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz",
-      "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==",
+      "version": "7.18.5",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.5.tgz",
+      "integrity": "sha512-BxhE40PVCBxVEJsSBhB6UWyAuqJRxGsAw8BdHMJ3AKGydcwuWW4kOO3HmqBQAdcq/OP+/DlTVxLvsCzRTnZuGg==",
       "dev": true
     },
     "@babel/core": {
-      "version": "7.18.2",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz",
-      "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==",
+      "version": "7.18.5",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.5.tgz",
+      "integrity": "sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ==",
       "dev": true,
       "requires": {
         "@ampproject/remapping": "^2.1.0",
         "@babel/code-frame": "^7.16.7",
         "@babel/generator": "^7.18.2",
         "@babel/helper-compilation-targets": "^7.18.2",
         "@babel/helper-module-transforms": "^7.18.0",
         "@babel/helpers": "^7.18.2",
-        "@babel/parser": "^7.18.0",
+        "@babel/parser": "^7.18.5",
         "@babel/template": "^7.16.7",
-        "@babel/traverse": "^7.18.2",
-        "@babel/types": "^7.18.2",
+        "@babel/traverse": "^7.18.5",
+        "@babel/types": "^7.18.4",
         "convert-source-map": "^1.7.0",
         "debug": "^4.1.0",
         "gensync": "^1.0.0-beta.2",
         "json5": "^2.2.1",
         "semver": "^6.3.0"
@@ -199,13 +200,13 @@
         "chalk": "^2.0.0",
         "js-tokens": "^4.0.0"
       }
     },
     "@babel/parser": {
-      "version": "7.18.4",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz",
-      "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==",
+      "version": "7.18.5",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.5.tgz",
+      "integrity": "sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw==",
       "dev": true
     },
     "@babel/runtime": {
       "version": "7.18.3",
       "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz",
@@ -224,23 +225,23 @@
         "@babel/parser": "^7.16.7",
         "@babel/types": "^7.16.7"
       }
     },
     "@babel/traverse": {
-      "version": "7.18.2",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz",
-      "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==",
+      "version": "7.18.5",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.5.tgz",
+      "integrity": "sha512-aKXj1KT66sBj0vVzk6rEeAO6Z9aiiQ68wfDgge3nHhA/my6xMM/7HGQUNumKZaoa2qUPQ5whJG9aAifsxUKfLA==",
       "dev": true,
       "requires": {
         "@babel/code-frame": "^7.16.7",
         "@babel/generator": "^7.18.2",
         "@babel/helper-environment-visitor": "^7.18.2",
         "@babel/helper-function-name": "^7.17.9",
         "@babel/helper-hoist-variables": "^7.16.7",
         "@babel/helper-split-export-declaration": "^7.16.7",
-        "@babel/parser": "^7.18.0",
-        "@babel/types": "^7.18.2",
+        "@babel/parser": "^7.18.5",
+        "@babel/types": "^7.18.4",
         "debug": "^4.1.0",
         "globals": "^11.1.0"
       }
     },
     "@babel/types": {
@@ -337,10 +338,20 @@
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
       "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
       "dev": true
     },
+    "@jridgewell/gen-mapping": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
+      "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
+      "dev": true,
+      "requires": {
+        "@jridgewell/set-array": "^1.0.0",
+        "@jridgewell/sourcemap-codec": "^1.4.10"
+      }
+    },
     "@jridgewell/resolve-uri": {
       "version": "3.0.7",
       "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz",
       "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==",
       "dev": true
@@ -606,19 +617,19 @@
         "balanced-match": "^1.0.0",
         "concat-map": "0.0.1"
       }
     },
     "browserslist": {
-      "version": "4.20.3",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz",
-      "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==",
+      "version": "4.20.4",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.4.tgz",
+      "integrity": "sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw==",
       "dev": true,
       "requires": {
-        "caniuse-lite": "^1.0.30001332",
-        "electron-to-chromium": "^1.4.118",
+        "caniuse-lite": "^1.0.30001349",
+        "electron-to-chromium": "^1.4.147",
         "escalade": "^3.1.1",
-        "node-releases": "^2.0.3",
+        "node-releases": "^2.0.5",
         "picocolors": "^1.0.0"
       }
     },
     "bytes": {
       "version": "3.1.2",
@@ -648,13 +659,13 @@
       "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
       "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
       "dev": true
     },
     "caniuse-lite": {
-      "version": "1.0.30001344",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001344.tgz",
-      "integrity": "sha512-0ZFjnlCaXNOAYcV7i+TtdKBp0L/3XEU2MF/x6Du1lrh+SRX4IfzIVL4HNJg5pB2PmFb8rszIGyOvsZnqqRoc2g==",
+      "version": "1.0.30001354",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001354.tgz",
+      "integrity": "sha512-mImKeCkyGDAHNywYFA4bqnLAzTUvVkqPvhY4DV47X+Gl2c5Z8c3KNETnXp14GQt11LvxE8AwjzGxJ+rsikiOzg==",
       "dev": true
     },
     "chalk": {
       "version": "2.4.2",
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
@@ -885,13 +896,13 @@
       "requires": {
         "esutils": "^2.0.2"
       }
     },
     "electron-to-chromium": {
-      "version": "1.4.141",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.141.tgz",
-      "integrity": "sha512-mfBcbqc0qc6RlxrsIgLG2wCqkiPAjEezHxGTu7p3dHHFOurH4EjS9rFZndX5axC8264rI1Pcbw8uQP39oZckeA==",
+      "version": "1.4.156",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.156.tgz",
+      "integrity": "sha512-/Wj5NC7E0wHaMCdqxWz9B0lv7CcycDTiHyXCtbbu3pXM9TV2AOp8BtMqkVuqvJNdEvltBG6LxT2Q+BxY4LUCIA==",
       "dev": true
     },
     "es-abstract": {
       "version": "1.19.1",
       "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
@@ -3402,11 +3413,11 @@
       "integrity": "sha512-XrZ2ujRDZLom3DtquzjtEh+kBLbivErqfbqbNG8sVA7ZCUxerIiorxfM87akQNbBnKttBaiXAZwZi46e2mFX7Q=="
     },
     "to-fast-properties": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
-      "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+      "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
       "dev": true
     },
     "toidentifier": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
diff --git a/package.json b/package.json
index ea481ce..13948f5 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
   "name": "titra",
-  "version": "0.78.0",
+  "version": "0.78.1",
   "private": true,
   "scripts": {
     "start": "meteor run"
   },
   "dependencies": {
@@ -42,11 +42,11 @@
     "sortablejs": "^1.15.0",
     "tiny-date-picker": "^3.2.8",
     "vm2": "^3.9.9"
   },
   "devDependencies": {
-    "@babel/core": "^7.18.2",
+    "@babel/core": "^7.18.5",
     "@babel/eslint-parser": "^7.18.2",
     "eslint": "^8.17.0",
     "eslint-config-airbnb-base": "^15.0.0",
     "eslint-import-resolver-meteor": "^0.4.0",
     "eslint-plugin-i18next": "^5.2.1",

Vulnerable code:                   <input aria-label='{{t "login.current_password"}}' type="password" class="form-control" id="at-field-current-password" name="at-field-current-password" placeholder="Current Password" autocapitalize="none" autocorrect="off">
                  <input type="password" class="form-control" id="at-field-password" name="at-field-password" placeholder="{{t 'login.password'}}" autocapitalize="none" autocorrect="off">
                  <span class="help-block hide"></span>
                  <input aria-label='{{t "login.password_again"}}' type="password" class="form-control" id="at-field-password-again" name="at-field-password-again" placeholder="{{t 'login.password_again'}}" autocapitalize="none" autocorrect="off">
import { showToast } from '../../utils/frontend_helpers.js'
                  <input type="password" class="form-control" id="at-field-password" name="at-field-password" placeholder="{{t 'login.password'}}" autocapitalize="none" autocorrect="off">
                  <input aria-label='{{t "login.password_again"}}' type="password" class="form-control" id="at-field-password-again" name="at-field-password-again" placeholder="{{t 'login.password_again'}}" autocapitalize="none" autocorrect="off">
import { validateEmail, validatePassword } from '../../utils/frontend_helpers.js' 
        if (error) {
          templateInstance.$('.notification').text(t('login.email_unknown'))
          document.querySelector('.notification').classList.remove('d-none')
        } else {
          templateInstance.$('.notification').text(t('login.reset_password_mail'))
          document.querySelector('.notification').classList.remove('d-none')
          templateInstance.$('#at-field-email').removeClass('is-invalid')
          templateInstance.$('#at-field-password').removeClass('is-invalid')
        }




//++++ [AdvancedCustomization] ++++ ///////////////////////////////////////////////////////
.internal-autofill-selected {
    appearance:             menulist-button;
    background-color:       $success !important;
    background-image:       none !important;
  border-left:              1px solid $dark;
  border-right:             1px solid $dark;
  border-bottom:            1px solid $dark;
    fill: #FFFFFF;
    fill: $grey !important;
    stroke: $grey !important;
    fill: $grey !important;
    fill: $dark-form !important;
    stroke: $dark !important;
    fill: $body-color !important;
    fill: $body-color !important;
    fill: $lightgrey !important;
$primary: #009688;
$secondary: #f7f7f7;
$success: #009688;
$info: #b2dfdb;
$warning: #ffc107;
$danger: #ff5722;
$light: #BDBDBD;
$dark: #455A64;
    color: #fff !important;
    border-color: #009688 !important; 
    color: #fff!important;
    border-color: #006e63!important;
    color: #000 !important;
    color: #fff !important;
  color: #495057;
  background-color: $secondary;
  border-left: 1px solid #dee2e6;
  border-right: 1px solid #dee2e6;
  border-bottom: 1px solid #dee2e6;
  background: $secondary !important;
  background: rgba(0,112,101,0.05) !important;
  background: rgba(0, 150, 136, 0.5) !important;
    color: #7b7b7b;
    background-color: #ffffff;
    border-color: #e8e8e8;
  border-color: #ced4da !important;
  color: #212529 !important;
  background-color: #ececec !important;
    color: #000000 !important;
    background-color: $secondary !important;
    border-color: $light !important;
    color: #000000 !important;
    background-color: #eee !important;
    border-color: $light !important;
    --dt-border-color: #d1d8dd;
    --dt-light-bg: #f5f7fa;
    --dt-text-color: #000000;
    --dt-text-light: #dfe2e5;
    --dt-cell-bg: #fff;
    --dt-header-cell-bg: var(--dt-cell-bg);
  color: #495057;
  background-color: #fff;
  border-color: #dee2e6 #dee2e6 #fff;
  color: #495057;
  background-color: #fff;
  border-color: #dee2e6 #dee2e6 #fff;
  background-color: $secondary;  
  background-color: $secondary;
  color: $dark;
  background-color: $primary !important;
  background-color: $primary !important;
  background-color: $primary !important;
  background-color: $primary !important;
  background-color: $primary !important;
  background-color: $primary !important;
  background-color: $primary !important;
  background-color: $primary !important;
  background-color: $primary !important;
  background-color: $primary !important;
  background: $primary !important;
  fill: #212529;

  } if (enoughRegex.test(pwd) === false) {
  } if (strongRegex.test(pwd)) {
  } if (mediumRegex.test(pwd)) {
  "version": "0.77.2",
      "version": "2.1.2",
      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz",
      "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==",
        "@jridgewell/trace-mapping": "^0.3.0"
      "version": "7.17.10",
      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz",
      "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==",
      "version": "7.18.2",
      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz",
      "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==",
        "@babel/parser": "^7.18.0",
        "@babel/traverse": "^7.18.2",
        "@babel/types": "^7.18.2",
      "version": "7.18.4",
      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz",
      "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==",
      "version": "7.18.2",
      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz",
      "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==",
        "@babel/parser": "^7.18.0",
        "@babel/types": "^7.18.2",
      "version": "4.20.3",
      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz",
      "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==",
        "caniuse-lite": "^1.0.30001332",
        "electron-to-chromium": "^1.4.118",
        "node-releases": "^2.0.3",
      "version": "1.0.30001344",
      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001344.tgz",
      "integrity": "sha512-0ZFjnlCaXNOAYcV7i+TtdKBp0L/3XEU2MF/x6Du1lrh+SRX4IfzIVL4HNJg5pB2PmFb8rszIGyOvsZnqqRoc2g==",
      "version": "1.4.141",
      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.141.tgz",
      "integrity": "sha512-mfBcbqc0qc6RlxrsIgLG2wCqkiPAjEezHxGTu7p3dHHFOurH4EjS9rFZndX5axC8264rI1Pcbw8uQP39oZckeA==",
      "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
  "version": "0.78.0",
    "@babel/core": "^7.18.2",
Fixed code:                   <input aria-label='{{t "login.current_password"}}' type="password" class="form-control" id="at-field-current-password" name="at-field-current-password" placeholder="Current Password" autocapitalize="none" autocorrect="off" maxlength="50">
                  <input type="password" class="form-control" id="at-field-password" name="at-field-password" placeholder="{{t 'login.password'}}" autocapitalize="none" autocorrect="off" maxlength="50" minlength="8">
                  <div class="js-password-feedback invalid-feedback hide"></div>
                  <input aria-label='{{t "login.password_again"}}' type="password" class="form-control" id="at-field-password-again" name="at-field-password-again" placeholder="{{t 'login.password_again'}}" autocapitalize="none" autocorrect="off"  maxlength="50" minlength="8">
import { showToast, validatePassword } from '../../utils/frontend_helpers.js'
      const passwordValidation = validatePassword(templateInstance.$('#at-field-password').val())
      if (!passwordValidation.valid) {
        templateInstance.$('#at-field-password').addClass('is-invalid')
        templateInstance.$('#at-field-password-again').addClass('is-invalid')
        templateInstance.$('.notification').text(passwordValidation.message)
        document.querySelector('.notification').classList.toggle('d-none')
        return
      }
      const passwordValidation = validatePassword(templateInstance.$('#at-field-password').val())
      if (!passwordValidation.valid) {
        templateInstance.$('#at-field-password').addClass('is-invalid')
        templateInstance.$('#at-field-password-again').addClass('is-invalid')
        templateInstance.$('.notification').text(passwordValidation.message)
        document.querySelector('.notification').classList.toggle('d-none')
        return
      }
  'keyup #at-field-password': (event, templateInstance) => {
    event.preventDefault()
    const validetedPW = validatePassword(templateInstance.$('#at-field-password').val())
    templateInstance.$('.js-password-feedback').text(validetedPW.message)
    if (validetedPW.valid) {
      templateInstance.$('#at-field-password').removeClass('is-invalid')
      templateInstance.$('#at-field-password-again').removeClass('is-invalid')
      templateInstance.$('.js-password-feedback').removeClass('invalid-feedback')
      templateInstance.$('.js-password-feedback').addClass('valid-feedback')
      templateInstance.$('.js-password-feedback').removeClass('hide')
    } else {
      templateInstance.$('#at-field-password').addClass('is-invalid')
      templateInstance.$('.js-password-feedback').removeClass('valid-feedback')
      templateInstance.$('.js-password-feedback').addClass('invalid-feedback')
      templateInstance.$('.js-password-feedback').removeClass('hide')
      templateInstance.$('.js-password-feedback').addClass('d-block')
    }
  },
                  <input type="password" class="form-control" id="at-field-password" name="at-field-password" placeholder="{{t 'login.password'}}" autocapitalize="none" autocorrect="off"  maxlength="50" minlength="8">
                  <input aria-label='{{t "login.password_again"}}' type="password" class="form-control" id="at-field-password-again" name="at-field-password-again" placeholder="{{t 'login.password_again'}}" autocapitalize="none" autocorrect="off"  maxlength="50" minlength="8">
import { validateEmail, validatePassword } from '../../utils/frontend_helpers.js'
        templateInstance.$('.notification').text(t('login.reset_password_mail'))
        document.querySelector('.notification').classList.remove('d-none')
        templateInstance.$('#at-field-email').removeClass('is-invalid')
        templateInstance.$('#at-field-password').removeClass('is-invalid')

$none:                                  none;
//++++ [AdvancedCustomization] ++++ ///////////////////////////////////////////////////////
::selection {
  color:                    $success !important;
  background:               $lightgrey !important;
}
::-moz-selection {
  color:                    $success !important;
  background:               $lightgrey !important;
}
.nav-tabs {
    border-bottom:          0px solid #dee2e6 !important;
.dt-scrollable {
    border-top:             0px solid var(--dt-border-color) !important;
}
.dt-scrollable__no-data {
    border:                 0px !important;
}

  border-left:              1px solid $dark !important;
  border-right:             1px solid $dark !important;
  border-bottom:            1px solid $dark !important;
  border-top:               1px solid $dark !important;
  border-top-right-radius:  0.25rem !important;
  border-bottom-right-radius:  0.25rem !important;
  border-bottom-left-radius:  0.25rem !important;




.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky > * {
    top: 0;
    background: none !important;
}

    fill:                 #FFFFFF;
    fill:                   $grey !important;
    stroke:                 $grey !important;
    fill:                   $grey !important;
    fill:                   $dark-form !important;
    stroke:                 $dark !important;
    fill:                   $body-color !important;
    fill:                   $body-color !important;
    fill:                   $lightgrey !important;
$primary:             #009688;
$secondary:           #f7f7f7;
$success:             #009688;
$info:                #b2dfdb;
$warning:             #ffc107;
$danger:              #ff5722;
$light:               #BDBDBD;
$dark:                #455A64;
    color:            #fff !important;
    border-color:     #009688 !important; 
    color:            #fff!important;
    border-color:     #006e63!important;
    color:            #000 !important;
    color:            #fff !important;
  color:              #495057;
  background-color:     $secondary;
  border-left:          1px solid #dee2e6;
  border-right:         1px solid #dee2e6;
  border-bottom:        1px solid #dee2e6;
  background:           $secondary !important;
  background:         rgba(0,112,101,0.05) !important;
  background:         rgba(0, 150, 136, 0.5) !important;
    color:              #7b7b7b;
    background-color:   #ffffff;
    border-color:       #e8e8e8;
  border-color:         #ced4da !important;
  color:                #212529 !important;
  background-color:     #ececec !important;
    color:              #000000 !important;
    background-color:     $secondary !important;
    border-color:         $light !important;
    color:                #000000 !important;
    background-color:     #eee !important;
    border-color:           $light !important;
    --dt-border-color:     #d1d8dd;
    --dt-light-bg:         #f5f7fa;
    --dt-text-color:       #000000;
    --dt-text-light:       #dfe2e5;
    --dt-cell-bg:          #fff;
    --dt-header-cell-bg:     var(--dt-cell-bg);
  color:                    #495057;
  background-color:         #fff;
  border-color:             #dee2e6 #dee2e6 #fff;
  
}
.nav-tabs {
    border-bottom: 0px solid #dee2e6 !important;
}
.dt-scrollable {
    //border-top: 0px solid #d1d8dd;
    border-top: 0px solid var(--dt-border-color) !important;
}
.dt-scrollable__no-data {
border: 0px !important;
  color:                    #495057;
  background-color:         #fff;
  border-color:             #dee2e6 #dee2e6 #fff;
  background-color:           $secondary;  
  background-color:           $secondary;
  color:                      $dark;
  background-color:           $primary !important;
  background-color:           $primary !important;
  background-color:           $primary !important;
  background-color:           $primary !important;
  background-color:           $primary !important;
  background-color:           $primary !important;
  background-color:           $primary !important;
  background-color:           $primary !important;
  background-color:           $primary !important;
  background-color:           $primary !important;
  background:                 $primary !important;
  fill:                     #212529;
}
.tab-borders {
    background-color:       #f7f7f7 !important;
    border-left:            1px solid #dee2e6 !important;
    border-right:           1px solid #dee2e6 !important;
    border-bottom:          1px solid #dee2e6 !important;
    border-top:             1px solid #dee2e6 !important;
    border-top-right-radius:            0.25rem !important;
    border-bottom-right-radius:         0.25rem !important;
    border-bottom-left-radius:          0.25rem !important;
  }
  if (enoughRegex.test(pwd) === false) {
  }
  if (strongRegex.test(pwd)) {
  }
  if (mediumRegex.test(pwd)) {
  if (pwd.length > 50) {
    return { valid: false, message: t('login.password_insufficient') }
  }
  "version": "0.78.0",
      "version": "2.2.0",
      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
      "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
        "@jridgewell/gen-mapping": "^0.1.0",
        "@jridgewell/trace-mapping": "^0.3.9"
      "version": "7.18.5",
      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.5.tgz",
      "integrity": "sha512-BxhE40PVCBxVEJsSBhB6UWyAuqJRxGsAw8BdHMJ3AKGydcwuWW4kOO3HmqBQAdcq/OP+/DlTVxLvsCzRTnZuGg==",
      "version": "7.18.5",
      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.5.tgz",
      "integrity": "sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ==",
        "@babel/parser": "^7.18.5",
        "@babel/traverse": "^7.18.5",
        "@babel/types": "^7.18.4",
      "version": "7.18.5",
      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.5.tgz",
      "integrity": "sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw==",
      "version": "7.18.5",
      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.5.tgz",
      "integrity": "sha512-aKXj1KT66sBj0vVzk6rEeAO6Z9aiiQ68wfDgge3nHhA/my6xMM/7HGQUNumKZaoa2qUPQ5whJG9aAifsxUKfLA==",
        "@babel/parser": "^7.18.5",
        "@babel/types": "^7.18.4",
    "@jridgewell/gen-mapping": {
      "version": "0.1.1",
      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
      "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
      "dev": true,
      "requires": {
        "@jridgewell/set-array": "^1.0.0",
        "@jridgewell/sourcemap-codec": "^1.4.10"
      }
    },
      "version": "4.20.4",
      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.4.tgz",
      "integrity": "sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw==",
        "caniuse-lite": "^1.0.30001349",
        "electron-to-chromium": "^1.4.147",
        "node-releases": "^2.0.5",
      "version": "1.0.30001354",
      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001354.tgz",
      "integrity": "sha512-mImKeCkyGDAHNywYFA4bqnLAzTUvVkqPvhY4DV47X+Gl2c5Z8c3KNETnXp14GQt11LvxE8AwjzGxJ+rsikiOzg==",
      "version": "1.4.156",
      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.156.tgz",
      "integrity": "sha512-/Wj5NC7E0wHaMCdqxWz9B0lv7CcycDTiHyXCtbbu3pXM9TV2AOp8BtMqkVuqvJNdEvltBG6LxT2Q+BxY4LUCIA==",
      "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
  "version": "0.78.1",
    "@babel/core": "^7.18.5",