4242use OCP \IURLGenerator ;
4343use OCP \IUserSession ;
4444use OCP \Security \ICrypto ;
45+ use OCP \Security \ITrustedDomainHelper ;
4546use OneLogin \Saml2 \Auth ;
4647use OneLogin \Saml2 \Error ;
4748use OneLogin \Saml2 \Settings ;
@@ -74,6 +75,10 @@ class SAMLController extends Controller {
7475 * @var ICrypto
7576 */
7677 private $ crypto ;
78+ /**
79+ * @var ITrustedDomainHelper
80+ */
81+ private $ trustedDomainHelper ;
7782
7883 /**
7984 * @param string $appName
@@ -100,7 +105,8 @@ public function __construct(
100105 IL10N $ l ,
101106 UserResolver $ userResolver ,
102107 UserData $ userData ,
103- ICrypto $ crypto
108+ ICrypto $ crypto ,
109+ ITrustedDomainHelper $ trustedDomainHelper
104110 ) {
105111 parent ::__construct ($ appName , $ request );
106112 $ this ->session = $ session ;
@@ -114,6 +120,7 @@ public function __construct(
114120 $ this ->userResolver = $ userResolver ;
115121 $ this ->userData = $ userData ;
116122 $ this ->crypto = $ crypto ;
123+ $ this ->trustedDomainHelper = $ trustedDomainHelper ;
117124 }
118125
119126 /**
@@ -203,11 +210,17 @@ protected function assertGroupMemberships(): void {
203210 * @throws \Exception
204211 */
205212 public function login (int $ idp = 1 ) {
213+ $ originalUrl = (string )$ this ->request ->getParam ('originalUrl ' , '' );
214+ if (!$ this ->trustedDomainHelper ->isTrustedUrl ($ originalUrl )) {
215+ $ originalUrl = '' ;
216+ }
217+
206218 $ type = $ this ->config ->getAppValue ($ this ->appName , 'type ' );
207219 switch ($ type ) {
208220 case 'saml ' :
209221 $ auth = new Auth ($ this ->samlSettings ->getOneLoginSettingsArray ($ idp ));
210- $ returnUrl = $ this ->request ->getParam ('originalUrl ' , $ this ->urlGenerator ->linkToRouteAbsolute ('user_saml.SAML.login ' ));
222+
223+ $ returnUrl = $ originalUrl ?: $ this ->urlGenerator ->linkToRouteAbsolute ('user_saml.SAML.login ' );
211224 $ ssoUrl = $ auth ->login ($ returnUrl , [], false , false , true );
212225 $ response = new Http \RedirectResponse ($ ssoUrl );
213226
@@ -226,7 +239,7 @@ public function login(int $idp = 1) {
226239 // Pack data as JSON so we can properly extract it later
227240 $ data = json_encode ([
228241 'AuthNRequestID ' => $ auth ->getLastRequestID (),
229- 'OriginalUrl ' => $ this -> request -> getParam ( ' originalUrl ' , '' ) ,
242+ 'OriginalUrl ' => $ originalUrl ,
230243 'Idp ' => $ idp ,
231244 'flow ' => $ flowData ,
232245 ]);
@@ -240,7 +253,7 @@ public function login(int $idp = 1) {
240253 $ response ->addCookie ('saml_data ' , $ data , null , 'None ' );
241254 break ;
242255 case 'environment-variable ' :
243- $ ssoUrl = $ this -> request -> getParam ( ' originalUrl ' , '' ) ;
256+ $ ssoUrl = $ originalUrl ;
244257 if (empty ($ ssoUrl )) {
245258 $ ssoUrl = $ this ->urlGenerator ->getAbsoluteURL ('/ ' );
246259 }
0 commit comments