Forráskód Böngészése

AMBARI-12906: Alert notifications are created even if credential fields are left empty (Qin Liu via rzang)

Richard Zang 9 éve
szülő
commit
72ac920cd1

+ 37 - 1
ambari-web/app/controllers/main/alerts/manage_alert_notifications_controller.js

@@ -237,6 +237,14 @@ App.ManageAlertNotificationsController = Em.Controller.extend({
         errorKey: 'smtpPortError',
         errorKey: 'smtpPortError',
         validator: 'smtpPortValidation'
         validator: 'smtpPortValidation'
       },
       },
+      {
+        errorKey: 'smtpUsernameError',
+        validator: 'smtpUsernameValidation'
+      },
+      {
+        errorKey: 'smtpPasswordError',
+        validator: 'smtpPasswordValidation'
+      },
       {
       {
         errorKey: 'passwordError',
         errorKey: 'passwordError',
         validator: 'retypePasswordValidation'
         validator: 'retypePasswordValidation'
@@ -384,6 +392,8 @@ App.ManageAlertNotificationsController = Em.Controller.extend({
           this.smtpPortValidation();
           this.smtpPortValidation();
           this.hostsValidation();
           this.hostsValidation();
           this.portValidation();
           this.portValidation();
+          this.smtpUsernameValidation();
+          this.smtpPasswordValidation();
           this.retypePasswordValidation();
           this.retypePasswordValidation();
         },
         },
 
 
@@ -498,6 +508,32 @@ App.ManageAlertNotificationsController = Em.Controller.extend({
           }
           }
         }.observes('controller.inputFields.port.value'),
         }.observes('controller.inputFields.port.value'),
 
 
+        smtpUsernameValidation: function () {
+          var smtpUsernameError = false;
+          var errorMessage = null;
+          if (this.get('controller.inputFields.SMTPUseAuthentication.value')) {
+            if (validator.isEmptyOrSpaces(this.get('controller.inputFields.SMTPUsername.value'))) {
+              smtpUsernameError = true;
+              errorMessage = Em.I18n.t('alerts.notifications.error.SMTPUsername');
+            }
+          }
+          this.set('smtpUsernameError', smtpUsernameError);
+          this.set('controller.inputFields.SMTPUsername.errorMsg', errorMessage);
+        }.observes('controller.inputFields.SMTPUsername.value', 'controller.inputFields.SMTPUseAuthentication.value'),
+
+        smtpPasswordValidation: function () {
+          var smtpPasswordError = false;
+          var errorMessage = null;
+          if (this.get('controller.inputFields.SMTPUseAuthentication.value')) {
+            if (validator.isEmptyOrSpaces(this.get('controller.inputFields.SMTPPassword.value'))) {
+              smtpPasswordError = true;
+              errorMessage = Em.I18n.t('alerts.notifications.error.SMTPPassword');
+            }
+          }
+          this.set('smtpPasswordError', smtpPasswordError);
+          this.set('controller.inputFields.SMTPPassword.errorMsg', errorMessage);
+        }.observes('controller.inputFields.SMTPPassword.value','controller.inputFields.SMTPUseAuthentication.value'),
+
         retypePasswordValidation: function () {
         retypePasswordValidation: function () {
           var passwordValue = this.get('controller.inputFields.SMTPPassword.value');
           var passwordValue = this.get('controller.inputFields.SMTPPassword.value');
           var retypePasswordValue = this.get('controller.inputFields.retypeSMTPPassword.value');
           var retypePasswordValue = this.get('controller.inputFields.retypeSMTPPassword.value');
@@ -510,7 +546,7 @@ App.ManageAlertNotificationsController = Em.Controller.extend({
           }
           }
         }.observes('controller.inputFields.retypeSMTPPassword.value', 'controller.inputFields.SMTPPassword.value'),
         }.observes('controller.inputFields.retypeSMTPPassword.value', 'controller.inputFields.SMTPPassword.value'),
 
 
-        someErrorExists: Em.computed.or('nameError', 'emailToError', 'emailFromError', 'smtpPortError', 'hostError', 'portError', 'passwordError'),
+        someErrorExists: Em.computed.or('nameError', 'emailToError', 'emailFromError', 'smtpPortError', 'hostError', 'portError', 'smtpUsernameError', 'smtpPasswordError', 'passwordError'),
 
 
         setParentErrors: function () {
         setParentErrors: function () {
           this.set('parentView.hasErrors', this.get('someErrorExists'));
           this.set('parentView.hasErrors', this.get('someErrorExists'));

+ 2 - 0
ambari-web/app/messages.js

@@ -1035,6 +1035,8 @@ Em.I18n.translations = {
   'alerts.notifications.error.integer': 'Must be an integer',
   'alerts.notifications.error.integer': 'Must be an integer',
   'alerts.notifications.error.host': 'Hosts must be a valid Fully Qualified Domain Name (FQDN)',
   'alerts.notifications.error.host': 'Hosts must be a valid Fully Qualified Domain Name (FQDN)',
 
 
+  'alerts.notifications.error.SMTPUsername': 'Username is required',
+  'alerts.notifications.error.SMTPPassword': 'Password is required',
   'alerts.notifications.error.retypePassword': 'Password confirmation must match password',
   'alerts.notifications.error.retypePassword': 'Password confirmation must match password',
 
 
   'alerts.notifications.addCustomPropertyPopup.header': 'Add Property',
   'alerts.notifications.addCustomPropertyPopup.header': 'Add Property',

+ 10 - 2
ambari-web/app/templates/main/alerts/create_alert_notification.hbs

@@ -149,20 +149,28 @@
         </div>
         </div>
       </div>
       </div>
 
 
-      <div class="control-group">
+      <div {{bindAttr class=":control-group controller.inputFields.SMTPUsername.errorMsg:error"}}>
         <label class="control-label">{{controller.inputFields.SMTPUsername.label}}</label>
         <label class="control-label">{{controller.inputFields.SMTPUsername.label}}</label>
 
 
         <div class="controls">
         <div class="controls">
           {{view Em.TextField disabledBinding="controller.inputFields.SMTPUseAuthentication.invertedValue" valueBinding="controller.inputFields.SMTPUsername.value" class="input-xlarge"}}
           {{view Em.TextField disabledBinding="controller.inputFields.SMTPUseAuthentication.invertedValue" valueBinding="controller.inputFields.SMTPUsername.value" class="input-xlarge"}}
         </div>
         </div>
+
+        <div class="controls error-msg">
+          {{controller.inputFields.SMTPUsername.errorMsg}}
+        </div>
       </div>
       </div>
 
 
-      <div class="control-group">
+      <div {{bindAttr class=":control-group controller.inputFields.SMTPPassword.errorMsg:error"}}>
         <label class="control-label">{{controller.inputFields.SMTPPassword.label}}</label>
         <label class="control-label">{{controller.inputFields.SMTPPassword.label}}</label>
 
 
         <div class="controls">
         <div class="controls">
           {{view Em.TextField type="password" disabledBinding="controller.inputFields.SMTPUseAuthentication.invertedValue" valueBinding="controller.inputFields.SMTPPassword.value" class="input-xlarge"}}
           {{view Em.TextField type="password" disabledBinding="controller.inputFields.SMTPUseAuthentication.invertedValue" valueBinding="controller.inputFields.SMTPPassword.value" class="input-xlarge"}}
         </div>
         </div>
+
+        <div class="controls error-msg">
+          {{controller.inputFields.SMTPPassword.errorMsg}}
+        </div>
       </div>
       </div>
 
 
       <div {{bindAttr class=":control-group controller.inputFields.retypeSMTPPassword.errorMsg:error"}}>
       <div {{bindAttr class=":control-group controller.inputFields.retypeSMTPPassword.errorMsg:error"}}>

+ 10 - 0
ambari-web/app/utils/validator.js

@@ -282,5 +282,15 @@ module.exports = {
     var remotePattern = /^(?:(?:https?|ftp):\/{2})(?:\S+(?::\S*)?@)?(?:(?:(?:[\w\-.]))*)(?::[0-9]+)?(?:\/\S*)?$/,
     var remotePattern = /^(?:(?:https?|ftp):\/{2})(?:\S+(?::\S*)?@)?(?:(?:(?:[\w\-.]))*)(?::[0-9]+)?(?:\/\S*)?$/,
       localPattern = /^file:\/{2,3}([a-zA-Z][:|]\/){0,1}[\w~!*'();@&=\/\\\-+$,?%#.\[\]]+$/;
       localPattern = /^file:\/{2,3}([a-zA-Z][:|]\/){0,1}[\w~!*'();@&=\/\\\-+$,?%#.\[\]]+$/;
     return remotePattern.test(value) || localPattern.test(value);
     return remotePattern.test(value) || localPattern.test(value);
+  },
+
+  /**
+   * Validate if empty or has white spaces
+   * @param value
+   * @return {boolean}
+   */
+  isEmptyOrSpaces: function(value) {
+    var regex = /(\s+)/;
+    return (!value || regex.test(value));
   }
   }
 };
 };

+ 91 - 3
ambari-web/test/controllers/main/alerts/manage_alert_notifications_controller_test.js

@@ -518,6 +518,8 @@ describe('App.ManageAlertNotificationsController', function () {
               name: {},
               name: {},
               global: {},
               global: {},
               allGroups: {},
               allGroups: {},
+              SMTPUseAuthentication: {},
+              SMTPUsername: {},
               SMTPPassword: {},
               SMTPPassword: {},
               retypeSMTPPassword: {},
               retypeSMTPPassword: {},
               method: {}
               method: {}
@@ -539,7 +541,7 @@ describe('App.ManageAlertNotificationsController', function () {
         view = getBodyClass();
         view = getBodyClass();
       });
       });
 
 
-      App.TestAliases.testAsComputedOr(getBodyClass(), 'someErrorExists', ['nameError', 'emailToError', 'emailFromError', 'smtpPortError', 'hostError', 'portError', 'passwordError']);
+      App.TestAliases.testAsComputedOr(getBodyClass(), 'someErrorExists', ['nameError', 'emailToError', 'emailFromError', 'smtpPortError', 'hostError', 'portError', 'smtpUsernameError', 'smtpPasswordError', 'passwordError']);
 
 
       describe('#selectAllGroups', function () {
       describe('#selectAllGroups', function () {
 
 
@@ -606,6 +608,92 @@ describe('App.ManageAlertNotificationsController', function () {
 
 
       });
       });
 
 
+      describe('#smtpUsernameValidation', function () {
+
+        it('should check inputFields.SMTPUsername.value', function () {
+
+          view.set('parentView.hasErrors', false);
+          view.set('controller.inputFields.SMTPUsername.errorMsg', null);
+          view.set('controller.inputFields.SMTPUseAuthentication.value', true);
+          view.set('controller.inputFields.SMTPUsername.value', '');
+          view.set('controller.inputFields.SMTPPassword.value', 'pass');
+          view.set('controller.inputFields.retypeSMTPPassword.value', 'pass');
+          expect(view.get('controller.inputFields.SMTPUsername.errorMsg')).to.equal(Em.I18n.t('alerts.notifications.error.SMTPUsername'));
+          expect(view.get('parentView.hasErrors')).to.be.true;
+
+        });
+
+        it('should check inputFields.SMTPUsername.value (2)', function () {
+
+          view.set('parentView.hasErrors', true);
+          view.set('controller.inputFields.SMTPUsername.errorMsg', 'error');
+          view.set('controller.inputFields.SMTPUseAuthentication.value', true);
+          view.set('controller.inputFields.SMTPUsername.value', 'test');
+          view.set('controller.inputFields.SMTPPassword.value', 'pass');
+          view.set('controller.inputFields.retypeSMTPPassword.value', 'pass');
+          expect(view.get('controller.inputFields.SMTPUsername.errorMsg')).to.equal(null);
+          expect(view.get('parentView.hasErrors')).to.be.false;
+
+        });
+
+        it('should check inputFields.SMTPUsername.value (3)', function () {
+
+          view.set('parentView.hasErrors', true);
+          view.set('controller.inputFields.SMTPUsername.errorMsg', 'error');
+          view.set('controller.inputFields.SMTPUseAuthentication.value', false);
+          view.set('controller.inputFields.SMTPUsername.value', '');
+          view.set('controller.inputFields.SMTPPassword.value', '');
+          view.set('controller.inputFields.retypeSMTPPassword.value', '');
+          expect(view.get('controller.inputFields.SMTPUsername.errorMsg')).to.equal(null);
+          expect(view.get('parentView.hasErrors')).to.be.false;
+
+        });
+
+      });
+
+      describe('#smtpPasswordValidation', function () {
+
+        it('should check inputFields.SMTPPassword.value', function () {
+
+          view.set('parentView.hasErrors', false);
+          view.set('controller.inputFields.SMTPPassword.errorMsg', null);
+          view.set('controller.inputFields.SMTPUseAuthentication.value', true);
+          view.set('controller.inputFields.SMTPUsername.value', 'user');
+          view.set('controller.inputFields.SMTPPassword.value', '');
+          view.set('controller.inputFields.retypeSMTPPassword.value', '');
+          expect(view.get('controller.inputFields.SMTPPassword.errorMsg')).to.equal(Em.I18n.t('alerts.notifications.error.SMTPPassword'));
+          expect(view.get('parentView.hasErrors')).to.be.true;
+
+        });
+
+        it('should check inputFields.SMTPPassword.value (2)', function () {
+
+          view.set('parentView.hasErrors', true);
+          view.set('controller.inputFields.SMTPPassword.errorMsg', 'error');
+          view.set('controller.inputFields.SMTPUseAuthentication.value', true);
+          view.set('controller.inputFields.SMTPUsername.value', 'user');
+          view.set('controller.inputFields.SMTPPassword.value', 'test');
+          view.set('controller.inputFields.retypeSMTPPassword.value', 'test');
+          expect(view.get('controller.inputFields.SMTPPassword.errorMsg')).to.equal(null);
+          expect(view.get('parentView.hasErrors')).to.be.false;
+
+        });
+
+        it('should check inputFields.SMTPPassword.value (3)', function () {
+
+          view.set('parentView.hasErrors', true);
+          view.set('controller.inputFields.SMTPPassword.errorMsg', 'error');
+          view.set('controller.inputFields.SMTPUseAuthentication.value', false);
+          view.set('controller.inputFields.SMTPUsername.value', '');
+          view.set('controller.inputFields.SMTPPassword.value', '');
+          view.set('controller.inputFields.retypeSMTPPassword.value', '');
+          expect(view.get('controller.inputFields.SMTPPassword.errorMsg')).to.equal(null);
+          expect(view.get('parentView.hasErrors')).to.be.false;
+
+        });
+
+      });
+
       describe('#retypePasswordValidation', function () {
       describe('#retypePasswordValidation', function () {
 
 
         it('should check inputFields.retypeSMTPPassword.value', function () {
         it('should check inputFields.retypeSMTPPassword.value', function () {
@@ -639,11 +727,11 @@ describe('App.ManageAlertNotificationsController', function () {
             {
             {
               method: 'EMAIL',
               method: 'EMAIL',
               errors: ['portError', 'hostError'],
               errors: ['portError', 'hostError'],
-              validators: ['emailToValidation', 'emailFromValidation', 'smtpPortValidation', 'retypePasswordValidation']
+              validators: ['emailToValidation', 'emailFromValidation', 'smtpPortValidation', 'smtpUsernameValidation', 'smtpPasswordValidation', 'retypePasswordValidation']
             },
             },
             {
             {
               method: 'SNMP',
               method: 'SNMP',
-              errors: ['emailToError', 'emailFromError', 'smtpPortError', 'passwordError'],
+              errors: ['emailToError', 'emailFromError', 'smtpPortError', 'smtpUsernameError', 'smtpPasswordError', 'passwordError'],
               validators: ['portValidation', 'hostsValidation']
               validators: ['portValidation', 'hostsValidation']
             }
             }
           ],
           ],