diff --git a/services/web/app/src/Features/User/UserPagesController.js b/services/web/app/src/Features/User/UserPagesController.js index cdba47fe2b..483c943490 100644 --- a/services/web/app/src/Features/User/UserPagesController.js +++ b/services/web/app/src/Features/User/UserPagesController.js @@ -144,7 +144,6 @@ const UserPagesController = { req ), oauthUseV2: Settings.oauthUseV2 || false, - samlInitPath: _.get(Settings, ['saml', 'ukamf', 'initPath']), institutionLinked, institutionNotLinked, samlBeta: req.session.samlBeta, diff --git a/services/web/app/src/infrastructure/ExpressLocals.js b/services/web/app/src/infrastructure/ExpressLocals.js index 1e3bf6bcb4..e91d1b6e35 100644 --- a/services/web/app/src/infrastructure/ExpressLocals.js +++ b/services/web/app/src/infrastructure/ExpressLocals.js @@ -38,6 +38,7 @@ const Path = require('path') const Features = require('./Features') Modules = require('./Modules') const moment = require('moment') +const lodash = require('lodash') const jsPath = Settings.useMinifiedJs ? '/minjs/' : '/js/' @@ -529,6 +530,8 @@ module.exports = function(app, webRouter, privateApiRouter, publicApiRouter) { res.locals.ExposedSettings = { isOverleaf: Settings.overleaf != null, appName: Settings.appName, + hasSamlFeature: Features.hasFeature('saml'), + samlInitPath: lodash.get(Settings, ['saml', 'ukamf', 'initPath']), siteUrl: Settings.siteUrl, recaptchaSiteKeyV3: Settings.recaptcha != null ? Settings.recaptcha.siteKeyV3 : undefined, diff --git a/services/web/app/views/user/settings.pug b/services/web/app/views/user/settings.pug index f0df944fe7..4eb4c00d53 100644 --- a/services/web/app/views/user/settings.pug +++ b/services/web/app/views/user/settings.pug @@ -291,5 +291,4 @@ block content span(ng-show="state.inflight") #{translate("deleting")}... script(type='text/javascript'). - window.passwordStrengthOptions = !{StringHelper.stringifyJsonForScript(settings.passwordStrengthOptions || {})} - window.samlInitPath = '#{samlInitPath}'; \ No newline at end of file + window.passwordStrengthOptions = !{StringHelper.stringifyJsonForScript(settings.passwordStrengthOptions || {})} \ No newline at end of file diff --git a/services/web/app/views/user/settings/user-affiliations.pug b/services/web/app/views/user/settings/user-affiliations.pug index 74194d6618..3211ac6855 100644 --- a/services/web/app/views/user/settings/user-affiliations.pug +++ b/services/web/app/views/user/settings/user-affiliations.pug @@ -1,3 +1,6 @@ +mixin aboutInstitutionLink() + a(href="/") #{translate("find_out_more_about_institution_login")}. + form.row( ng-controller="UserAffiliationsController" name="affiliationsForm" @@ -19,12 +22,12 @@ form.row( | {{ userEmail.email + (userEmail.default ? ' (primary)' : '') }} div(ng-if="!userEmail.confirmedAt").small strong #{translate('unconfirmed')}. - span(ng-if="!userEmail.affiliation.institution.ssoEnabled") #{translate('please_check_your_inbox')}. + span(ng-if="!hasSamlFeature || (hasSamlFeature && !userEmail.affiliation.institution.ssoEnabled)")  #{translate('please_check_your_inbox')}. br a( href, ng-click="resendConfirmationEmail(userEmail)", - ng-if="!userEmail.affiliation.institution.ssoEnabled" + ng-if="!hasSamlFeature || (hasSamlFeature && !userEmail.affiliation.institution.ssoEnabled)" ) #{translate('resend_confirmation_email')} div(ng-if="userEmail.confirmedAt && userEmail.affiliation.institution && userEmail.affiliation.institution.confirmed && userEmail.affiliation.institution.licence != 'free'").small span.label.label-primary #{translate("professional")} @@ -105,7 +108,7 @@ form.row( | !{translate("can_link_your_institution_acct", {institutionName: '{{userEmail.affiliation.institution.name}}'})} p.small | !{translate("doing_this_allow_log_in_through_institution")}  - a(href="/") #{translate("find_out_more_about_institution_login")} + +aboutInstitutionLink() td.with-border.affiliations-table-inline-actions(ng-if="!userEmail.samlProviderId && !institutionAlreadyLinked(userEmail)") button.btn-sm.btn.btn-info(ng-click="linkInstitutionAcct(userEmail.email, userEmail.affiliation.institution.id)" ng-disabled="ui.isMakingRequest") | #{translate("link_accounts")} @@ -134,7 +137,20 @@ form.row( input-type="email" input-required="true" ) - td + if hasFeature('saml') + td( + colspan="2" + ng-if="newAffiliation && newAffiliation.university && newAffiliation.university.ssoEnabled" + ) + p.affiliations-table-label {{ newAffiliation.university.name }} + p !{translate("to_add_email_accounts_need_to_be_linked", {institutionName: "{{newAffiliation.university.name}}"})} + p !{translate("doing_this_will_verify_affiliation_and_allow_log_in", {institutionName: "{{newAffiliation.university.name}}"})}  + +aboutInstitutionLink() + button.btn-sm.btn.btn-primary.btn-link-accounts(ng-click="linkInstitutionAcct(newAffiliation.email, newAffiliation.university.id)" ng-disabled="ui.isMakingRequest") + | #{translate("link_accounts_and_add_email")} + td( + ng-if="shouldShowRolesAndAddEmailButton()" + ) p.affiliations-table-label( ng-if="newAffiliation.university && !ui.showManualUniversitySelectionUI" ) @@ -163,7 +179,9 @@ form.row( show-university-and-country="ui.showManualUniversitySelectionUI" show-role-and-department="ui.isValidEmail && newAffiliation.university" ) - td + td( + ng-if="shouldShowRolesAndAddEmailButton()" + ) button.btn.btn-sm.btn-primary( ng-disabled="affiliationsForm.$invalid || ui.isMakingRequest" ng-click="addNewEmail()" diff --git a/services/web/public/src/main/affiliations/controllers/UserAffiliationsController.js b/services/web/public/src/main/affiliations/controllers/UserAffiliationsController.js index b25b45c2ee..c7ef0e82b6 100644 --- a/services/web/public/src/main/affiliations/controllers/UserAffiliationsController.js +++ b/services/web/public/src/main/affiliations/controllers/UserAffiliationsController.js @@ -28,7 +28,21 @@ define(['base'], App => $scope.closeInstitutionNotification = type => { $scope.hideInstitutionNotifications[type] = true } - + $scope.hasSamlFeature = ExposedSettings.hasSamlFeature + $scope.samlInitPath = ExposedSettings.samlInitPath + $scope.shouldShowRolesAndAddEmailButton = () => { + const newAffiliation = $scope.newAffiliation + const hasSamlFeature = $scope.hasSamlFeature + return ( + !newAffiliation || + (newAffiliation && !newAffiliation.university) || + (!hasSamlFeature && newAffiliation && newAffiliation.university) || + (hasSamlFeature && + newAffiliation && + newAffiliation.university && + !newAffiliation.university.ssoEnabled) + ) + } const LOCAL_AND_DOMAIN_REGEX = /([^@]+)@(.+)/ const EMAIL_REGEX = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\ ".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA -Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ @@ -91,7 +105,7 @@ define(['base'], App => $scope.ui.isMakingRequest = true $scope.ui.isProcessing = true $window.location.href = `${ - window.samlInitPath + $scope.samlInitPath }?university_id=${institutionId}&auto=true&email=${email}` } diff --git a/services/web/public/stylesheets/app/account-settings.less b/services/web/public/stylesheets/app/account-settings.less index 92e218054f..fd98f43c87 100644 --- a/services/web/public/stylesheets/app/account-settings.less +++ b/services/web/public/stylesheets/app/account-settings.less @@ -96,3 +96,7 @@ tbody > tr.affiliations-table-warning-row > td { .affiliations-table-label { padding-top: 4px; } + +.btn-link-accounts { + margin-bottom: (@line-height-computed / 2) - @table-cell-padding; +}