@@ -107,6 +107,8 @@ import qualified URI.ByteString as URI
107
107
import Wire.API.Routes.Internal.Spar
108
108
import Wire.API.Routes.Named
109
109
import Wire.API.Routes.Public.Spar
110
+ import Wire.API.Servant.Tentatively
111
+ import qualified Wire.API.Servant.Tentatively as Tentatively
110
112
import Wire.API.Team.Member (HiddenPerm (CreateUpdateDeleteIdp , ReadIdp ))
111
113
import Wire.API.User
112
114
import Wire.API.User.IdentityProvider
@@ -122,7 +124,9 @@ app ctx0 req cont = do
122
124
let rid = getRequestId defaultRequestIdHeaderName req
123
125
let ctx = ctx0 {sparCtxRequestId = rid}
124
126
SAML. setHttpCachePolicy
125
- ( serve
127
+ ( serve -- TODO: "instance MimeUnrender JSON (Tentatively IdPMetadataInfo)" missing,
128
+ -- probably because IdPMetadataInfo doesn't have one. is this something we didn't
129
+ -- need before?
126
130
(Proxy @ SparAPI )
127
131
(hoistServer (Proxy @ SparAPI ) (runSparToHandler ctx) (api $ sparCtxOpts ctx) :: Server SparAPI )
128
132
)
@@ -607,13 +611,14 @@ idpCreate ::
607
611
Member (Error SparError ) r
608
612
) =>
609
613
Maybe UserId ->
610
- IdPMetadataInfo ->
614
+ Tentatively IdPMetadataInfo ->
611
615
Maybe SAML. IdPId ->
612
616
Maybe WireIdPAPIVersion ->
613
617
Maybe (Range 1 32 Text ) ->
614
618
Sem r IdP
615
- idpCreate zusr ( IdPMetadataValue rawIdpMetadata idpmeta) mReplaces (fromMaybe defWireIdPAPIVersion -> apiversion) mHandle = withDebugLog " idpCreateXML" (Just . show . (^. SAML. idpId)) $ do
619
+ idpCreate zusr tentativeMetaData mReplaces (fromMaybe defWireIdPAPIVersion -> apiversion) mHandle = withDebugLog " idpCreateXML" (Just . show . (^. SAML. idpId)) $ do
616
620
teamid <- Brig. getZUsrCheckPerm zusr CreateUpdateDeleteIdp
621
+ IdPMetadataValue rawIdpMetadata idpmeta <- forceIt tentativeMetaData
617
622
GalleyAccess. assertSSOEnabled teamid
618
623
idp <-
619
624
maybe (IdPConfigStore. newHandle teamid) (pure . IdPHandle . fromRange) mHandle
@@ -624,6 +629,10 @@ idpCreate zusr (IdPMetadataValue rawIdpMetadata idpmeta) mReplaces (fromMaybe de
624
629
IdPConfigStore. setReplacedBy (Replaced replaces) (Replacing (idp ^. SAML. idpId))
625
630
pure idp
626
631
632
+ -- what should we give you, forceIt? an error action? a function that takes an http error and throws it in the locally appropriate fashion?
633
+ forceIt :: (Applicative m ) => Tentatively a -> m a
634
+ forceIt = undefined -- t e = Tentatively.forceTentatively t & either e pure
635
+
627
636
idpCreateV7 ::
628
637
( Member Random r ,
629
638
Member (Logger String ) r ,
@@ -734,14 +743,14 @@ idpUpdate ::
734
743
Member (Error SparError ) r
735
744
) =>
736
745
Maybe UserId ->
737
- IdPMetadataInfo ->
746
+ Tentatively IdPMetadataInfo ->
738
747
SAML. IdPId ->
739
748
Maybe (Range 1 32 Text ) ->
740
749
Sem r IdP
741
- idpUpdate zusr ( IdPMetadataValue raw xml) idpid mHandle = withDebugLog " idpUpdateCore" (Just . show . (^. SAML. idpId)) $ do
742
- (teamid, idp) <- validateIdPUpdate zusr idpmeta idpid
750
+ idpUpdate zusr idpmeta idpid mHandle = withDebugLog " idpUpdateCore" (Just . show . (^. SAML. idpId)) $ do
751
+ (idpText, teamid, idp) <- validateIdPUpdate zusr idpmeta idpid
743
752
GalleyAccess. assertSSOEnabled teamid
744
- IdPRawMetadataStore. store (idp ^. SAML. idpId) raw
753
+ IdPRawMetadataStore. store (idp ^. SAML. idpId) idpText
745
754
let idp' :: IdP = case mHandle of
746
755
Just idpHandle -> idp & (SAML. idpExtraInfo . handle) .~ IdPHandle (fromRange idpHandle)
747
756
Nothing -> idp
@@ -772,12 +781,16 @@ validateIdPUpdate ::
772
781
Member (Error SparError ) r
773
782
) =>
774
783
Maybe UserId ->
775
- SAML. IdPMetadata ->
784
+ Tentatively IdPMetadataInfo ->
776
785
SAML. IdPId ->
777
- m (TeamId , IdP )
778
- validateIdPUpdate zusr _idpMetadata _idpId = withDebugLog " validateIdPUpdate" (Just . show . (_2 %~ (^. SAML. idpId))) $ do
786
+ m (Text , TeamId , IdP )
787
+ validateIdPUpdate zusr tentativeIdpMeta _idpId = withDebugLog " validateIdPUpdate" (const $ Just $ show _idpId) $ do
788
+ -- access control
779
789
previousIdP <- IdPConfigStore. getConfig _idpId
780
790
(_, teamId) <- authorizeIdP zusr previousIdP
791
+
792
+ -- parse xml & continue with application logic.
793
+ IdPMetadataValue idpText _idpMetadata <- forceIt tentativeIdpMeta
781
794
unless (previousIdP ^. SAML. idpExtraInfo . team == teamId) $
782
795
throw errUnknownIdP
783
796
_idpExtraInfo <- do
@@ -807,7 +820,7 @@ validateIdPUpdate zusr _idpMetadata _idpId = withDebugLog "validateIdPUpdate" (J
807
820
808
821
let requri = _idpMetadata ^. SAML. edRequestURI
809
822
enforceHttps requri
810
- pure (teamId, SAML. IdPConfig {.. })
823
+ pure (idpText, teamId, SAML. IdPConfig {.. })
811
824
where
812
825
-- If the new issuer was previously used, it has to be removed from the list of old issuers,
813
826
-- to prevent it from getting deleted in a later step
0 commit comments