CVE-2022-2098 (published 2022-06-16T10:15Z)

Weak Password Requirements in GitHub repository kromitgmbh/titra prior to 0.78.1.

Severity: MEDIUM
CVSS v2 base score: 5.0 (AV:N/AC:L/Au:N/C:P/I:N/A:N)
CVSS v3 base score: 9.8, CRITICAL (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)

Weakness information:
cwe_id: CWE-521
cwe_name: Weak Password Requirements
description: The product does not require that users should have strong passwords, which makes it easier for attackers to compromise user accounts.
extended_description: Authentication mechanisms often rely on a memorized secret (also known as a password) to provide an assertion of identity for a user of a system. It is therefore important that this password be of sufficient complexity and impractical for an adversary to guess. The specific requirements around how complex a password needs to be depends on the type of system being protected. Selecting the correct password requirements and enforcing them through implementation are critical to the overall success of the authentication mechanism.
         

Fix information:
repo_url: https://github.com/kromitgmbh/titra
commit_details: repo_url: https://github.com/kromitgmbh/titra
author: Fabian Kromer
author_date: 2022-06-16 09:56:10+02:00
msg: 🔒 fixed further security vulnerabilities adding additional password validation
💄 improved light and dark theme (thanks @thomas-kromit)
repository: repo_url: https://github.com/kromitgmbh/titra
repo_name: kromitgmbh/titra
description: titra - modern open source project time tracking for freelancers and small teams
repo_language: JavaScript
owner: kromitgmbh
file_changes: filename: changePassword.html
change_type: ModificationType.MODIFY
diff: @@ -15,7 +15,7 @@
                   <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}}
@@ -23,14 +23,14 @@
                   <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">

programming_language: HTML
filename: changePassword.js
change_type: ModificationType.MODIFY
diff: @@ -1,5 +1,5 @@
 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'
 
@@ -14,6 +14,14 @@ Template.changePassword.events({
       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}`))
@@ -24,6 +32,14 @@ Template.changePassword.events({
         }
       })
     } 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}`))
@@ -35,6 +51,24 @@ Template.changePassword.events({
       })
     }
   },
+  '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'),

programming_language: JavaScript
filename: register.html
change_type: ModificationType.MODIFY
diff: @@ -26,14 +26,14 @@
                   <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}}

programming_language: HTML
filename: register.js
change_type: ModificationType.MODIFY
diff: @@ -1,6 +1,6 @@
 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({

programming_language: JavaScript
filename: signIn.js
change_type: ModificationType.MODIFY
diff: @@ -66,15 +66,10 @@ Template.signIn.events({
     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')

programming_language: JavaScript
filename: dark.scss
change_type: ModificationType.MODIFY
diff: @@ -1,3 +1,4 @@
+
 // ++++ [DarkThemeColors] ++++   ///////////////////////////////////////////////////////
 $primary:                               #005a52;       // Color/Background-Color for links, Save-, Selectbuttons 
 $secondary:                             #272727;       // Background-Color for all fields, control buttons, checkboxes
@@ -13,6 +14,7 @@ $grey:                                  #2d2d2d;
 $lightgrey:                             #404040;
 $gray-900:                              #eeeeee;
 $titra-dark:                            #006d62;
+$none:                                  none;
 
 //Tabs/Container
 $tab-background-color:                  $grey;           // Tab/Container-Background-Color
@@ -159,18 +161,27 @@ $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;
@@ -291,10 +302,17 @@ $modal-content-color:                   #dadada;
 }   
 .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;
 }
@@ -336,6 +354,12 @@ $modal-content-color:                   #dadada;
     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;
@@ -441,28 +465,28 @@ a {
     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

programming_language: CSS
filename: light.scss
change_type: ModificationType.MODIFY
diff: @@ -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";

programming_language: CSS
filename: frontend_helpers.js
change_type: ModificationType.MODIFY
diff: @@ -85,13 +85,19 @@ function validatePassword(pwd) {
   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) {

programming_language: JavaScript
filename: package-lock.json
change_type: ModificationType.MODIFY
diff: @@ -1,16 +1,17 @@
 {
   "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": {
@@ -23,15 +24,15 @@
       }
     },
     "@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",
@@ -40,10 +41,10 @@
         "@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",
@@ -201,9 +202,9 @@
       }
     },
     "@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": {
@@ -226,9 +227,9 @@
       }
     },
     "@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",
@@ -237,8 +238,8 @@
         "@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"
       }
@@ -339,6 +340,16 @@
       "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",
@@ -608,15 +619,15 @@
       }
     },
     "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"
       }
     },
@@ -650,9 +661,9 @@
       "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": {
@@ -887,9 +898,9 @@
       }
     },
     "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": {
@@ -3404,7 +3415,7 @@
     "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": {

programming_language: JavaScript
filename: package.json
change_type: ModificationType.MODIFY
diff: @@ -1,6 +1,6 @@
 {
   "name": "titra",
-  "version": "0.78.0",
+  "version": "0.78.1",
   "private": true,
   "scripts": {
     "start": "meteor run"
@@ -44,7 +44,7 @@
     "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",

programming_language: JavaScript