diff --git a/messages/uniworx/categories/admin/de-de-formal.msg b/messages/uniworx/categories/admin/de-de-formal.msg index 3d6a62ccc..5b905fbf1 100644 --- a/messages/uniworx/categories/admin/de-de-formal.msg +++ b/messages/uniworx/categories/admin/de-de-formal.msg @@ -43,7 +43,7 @@ StudySubTermsChildKey: Kind StudySubTermsChildName: Kindname MailTestFormEmail: E-Mail-Adresse MailTestFormLanguages: Spracheinstellungen -MailRerouteTo dev@Address: Alle Emails werden nicht an die eigentlichen Empfänger versendet, sondern umgeleitet zu _{dev} +MailRerouteTo dev@Address: Alle Emails werden nicht an die eigentlichen Empfänger versendet, sondern umgeleitet zu _{dev}. Druckaufträge werden generiert, aber nicht zum tatsächlichen Druck gesendet. TestDownload: Download-Test BearerTokenUsageWarning: Mit diesem Interface können quesi beliebige Rechte als Tokens kodiert und somit ohne wesentliche weitere Beschränkung frei übertragen werden. Benutzen Sie dieses Interface nur, wenn Sie von einem erfahrenen Entwickler/einer erfahrenen Entwicklerin über die Auswirkungen des konkreten Tokens, dass sie ausstellen möchten, beraten wurden! BearerTokenAuthorityGroups: Token-Authorität (Gruppen) diff --git a/messages/uniworx/categories/admin/en-eu.msg b/messages/uniworx/categories/admin/en-eu.msg index 7b0ad7057..f320c1a3d 100644 --- a/messages/uniworx/categories/admin/en-eu.msg +++ b/messages/uniworx/categories/admin/en-eu.msg @@ -43,7 +43,7 @@ StudySubTermsChildKey: Child StudySubTermsChildName: Child-Name MailTestFormEmail: Email address MailTestFormLanguages: Language settings -MailRerouteTo dev: All email will not be sent to the intended recipients, but rerouted to _{dev} +MailRerouteTo dev: All email will not be sent to the intended recipients, but rerouted to _{dev}. Printjobs are executed within FRADrive only, they are not sent for actual printing. TestDownload: Download test BearerTokenUsageWarning: Using this interface you are able to encode essentially arbitrary permissions into bearer tokens. This allows you to freely hand permissions off arbitrarily and without relevant restrictions. Only use this interface if you have discussed the consequences of the specific token, that you want to issue, with an experienced developer! BearerTokenAuthorityGroups: Authority (groups) diff --git a/src/Auth/LDAP.hs b/src/Auth/LDAP.hs index 18478bb34..329bb0a29 100644 --- a/src/Auth/LDAP.hs +++ b/src/Auth/LDAP.hs @@ -61,7 +61,7 @@ findUser conf@LdapConf{..} ldap ident retAttrs = fromMaybe [] <$> findM (assertM , ldapUserPrincipalName Ldap.:= Text.encodeUtf8 [st|#{ident}@fraport.de|] ] ++ [ ldapUserEmail' Ldap.:= Text.encodeUtf8 ident' - | ident' <- [ident, [st|#{ident}@lmu.de|], [st|#{ident}@fraport.de|]] + | ident' <- [ident, [st|#{ident}@fraport.de|]] , ldapUserEmail' <- toList ldapUserEmail -- ] ++ -- [ ldapUserDisplayName Ldap.:= Text.encodeUtf8 ident -- for Fraport, userDisplayName has the pattern "Surname, Firstnames" diff --git a/src/Foundation/Yesod/Auth.hs b/src/Foundation/Yesod/Auth.hs index 70a8abfb9..aaa04294d 100644 --- a/src/Foundation/Yesod/Auth.hs +++ b/src/Foundation/Yesod/Auth.hs @@ -260,11 +260,11 @@ decodeUser now UserDefaultConf{..} upsertMode ldapData = do | otherwise -> throwM CampusUserInvalidIdent - userEmail <- if -- TODO: refactor - -- | userEmail : _ <- mapMaybe (assertM (elem '@') . either (const Nothing) Just . Text.decodeUtf8') (lookupSome ldapMap $ toList ldapUserEmail) - -- -> return $ CI.mk userEmail - | userEmail : _ <- mapMaybe (assertM validEmail . either (const Nothing) Just . Text.decodeUtf8') (lookupSome ldapMap $ toList ldapUserEmail) + userEmail <- if -- TODO: refactor! NOTE: LDAP doesnt know email for all users; we use userPrincialName instead; however validEmail refutes `E return $ CI.mk userEmail + -- | userEmail : _ <- mapMaybe (assertM validEmail . either (const Nothing) Just . Text.decodeUtf8') (lookupSome ldapMap $ toList ldapUserEmail) -- TOO STRONG, see above! + -- -> return $ CI.mk userEmail | otherwise -> throwM CampusUserInvalidEmail @@ -306,19 +306,20 @@ decodeUser now UserDefaultConf{..} upsertMode ldapData = do , userPrefersPostal = userDefaultPrefersPostal , .. } - userUpdate = [ - -- UserDisplayName =. userDisplayName -- not updated here, since users are allowed to change their DisplayName; see line 272 - UserFirstName =. userFirstName - , UserSurname =. userSurname - , UserEmail =. userEmail - , UserLastLdapSynchronisation =. Just now - , UserLdapPrimaryKey =. userLdapPrimaryKey - , UserMobile =. userMobile - , UserTelephone =. userTelephone - , UserCompanyPersonalNumber =. userCompanyPersonalNumber - , UserCompanyDepartment =. userCompanyDepartment - ] ++ - [ UserLastAuthentication =. Just now | isLogin ] + userUpdate = + [ UserLastAuthentication =. Just now | isLogin ] ++ + [ UserEmail =. userEmail | validEmail' userEmail ] ++ + [ + -- UserDisplayName =. userDisplayName -- not updated here, since users are allowed to change their DisplayName; see line 272 + UserFirstName =. userFirstName + , UserSurname =. userSurname + , UserLastLdapSynchronisation =. Just now + , UserLdapPrimaryKey =. userLdapPrimaryKey + , UserMobile =. userMobile + , UserTelephone =. userTelephone + , UserCompanyPersonalNumber =. userCompanyPersonalNumber + , UserCompanyDepartment =. userCompanyDepartment + ] return (newUser, userUpdate) where diff --git a/src/Handler/Admin/Avs.hs b/src/Handler/Admin/Avs.hs index 3cb709b6f..5d3c66a36 100644 --- a/src/Handler/Admin/Avs.hs +++ b/src/Handler/Admin/Avs.hs @@ -15,6 +15,7 @@ module Handler.Admin.Avs import Import import qualified Control.Monad.State.Class as State -- import Data.Aeson (encode) +import qualified Data.Aeson.Encode.Pretty as Pretty import qualified Data.Text as Text import qualified Data.CaseInsensitive as CI import qualified Data.Set as Set @@ -87,7 +88,7 @@ validateAvsQueryPerson = do makeAvsStatusForm :: Maybe AvsQueryStatus -> Form AvsQueryStatus makeAvsStatusForm tmpl = identifyForm FIDAvsQueryStatus . validateForm validateAvsQueryStatus $ \html -> flip (renderAForm FormStandard) html $ - parseAvsIds <$> areq textField (fslI MsgAvsPersonId) (unparseAvsIds <$> tmpl) + parseAvsIds <$> areq textField (fslI MsgAvsPersonId) (unparseAvsIds <$> tmpl) where parseAvsIds :: Text -> AvsQueryStatus parseAvsIds txt = AvsQueryStatus $ Set.fromList ids @@ -102,6 +103,25 @@ validateAvsQueryStatus = do AvsQueryStatus ids <- State.get guardValidation (MsgAvsQueryStatusInvalid $ tshow ids) $ not (null ids) +makeAvsContactForm :: Maybe AvsQueryContact -> Form AvsQueryContact +makeAvsContactForm tmpl = identifyForm FIDAvsQueryContact . validateForm validateAvsQueryContact $ \html -> + flip (renderAForm FormStandard) html $ + parseAvsIds <$> areq textField (fslI MsgAvsPersonId) (unparseAvsIds <$> tmpl) -- consider using cfAnySeparatedSet here + where + parseAvsIds :: Text -> AvsQueryContact + parseAvsIds txt = AvsQueryContact $ Set.fromList ids + where + nonemptys = filter (not . Text.null) $ Text.strip <$> Text.split (==',') txt + ids = catMaybes $ fmap AvsObjPersonId . readMay <$> nonemptys + unparseAvsIds :: AvsQueryContact -> Text + unparseAvsIds (AvsQueryContact ids) = Text.intercalate ", " $ tshow <$> Set.toAscList ids + +validateAvsQueryContact :: FormValidator AvsQueryContact Handler () +validateAvsQueryContact = do + AvsQueryContact ids <- State.get + guardValidation (MsgAvsQueryStatusInvalid $ tshow ids) $ not (null ids) + + avsLicenceOptions :: OptionList AvsLicence avsLicenceOptions = mkOptionList [ Option @@ -135,24 +155,42 @@ postAdminAvsR = do Left err -> let msg = tshow err in return $ Just [whamlet|

Error:

#{msg}|] Right (AvsResponsePerson pns) -> return $ Just [whamlet|