22
33namespace SimpleSAML \Module \perun \Auth \Process ;
44
5+ use Jose \Component \KeyManagement \JWKFactory ;
6+ use Jose \Component \Core \AlgorithmManager ;
7+ use Jose \Component \Signature \JWSBuilder ;
8+ use Jose \Component \Signature \Serializer \CompactSerializer ;
9+ use Jose \Component \Signature \Algorithm \RS512 ;
510use SimpleSAML \Auth \ProcessingFilter ;
611use SimpleSAML \Error \Exception ;
712use SimpleSAML \Logger ;
813use SimpleSAML \Module ;
9- use SimpleSAML \Module \perun \AttributeUtils ;
1014use SimpleSAML \Module \perun \UpdateUESThread ;
11- use SimpleSAML \Configuration ;
12- use SimpleSAML \Module \perun ;
1315
1416/**
1517 * Class sspmod_perun_Auth_Process_UpdateUserExtSource
@@ -23,6 +25,9 @@ class UpdateUserExtSource extends ProcessingFilter
2325{
2426 private $ attrMap ;
2527 private $ attrsToConversion ;
28+ private $ pathToKey ;
29+
30+ const SCRIPT_NAME = 'updateUes ' ;
2631
2732 public function __construct ($ config , $ reserved )
2833 {
@@ -36,26 +41,77 @@ public function __construct($config, $reserved)
3641 );
3742 }
3843
44+ if (!isset ($ config ['pathToKey ' ])) {
45+ throw new Exception (
46+ 'perun:UpdateUserExtSource: missing mandatory configuration option \'pathToKey \'. '
47+ );
48+ }
49+
3950 if (isset ($ config ['arrayToStringConversion ' ])) {
4051 $ this ->attrsToConversion = (array )$ config ['arrayToStringConversion ' ];
4152 } else {
4253 $ this ->attrsToConversion = [];
4354 }
4455
4556 $ this ->attrMap = (array )$ config ['attrMap ' ];
57+ $ this ->pathToKey = $ config ['pathToKey ' ];
4658 }
4759
4860 public function process (&$ request )
4961 {
62+ $ id = uniqid ("" , true );
63+
64+ $ dataChallenge = [
65+ 'id ' => $ id ,
66+ 'scriptName ' => self ::SCRIPT_NAME
67+ ];
68+
69+ $ json = json_encode ($ dataChallenge );
70+
71+ $ curlChallenge = curl_init ();
72+ curl_setopt ($ curlChallenge , CURLOPT_POSTFIELDS , $ json );
73+ curl_setopt ($ curlChallenge , CURLOPT_URL , Module::getModuleURL ('perun/getChallenge.php ' ));
74+ curl_setopt ($ curlChallenge , CURLOPT_RETURNTRANSFER , true );
75+
76+ $ challenge = curl_exec ($ curlChallenge );
77+
78+ if (empty ($ challenge )) {
79+ Logger::error ('Retrieving the challenge was not successful. ' );
80+ return ;
81+ }
82+
83+ $ jwk = JWKFactory::createFromKeyFile ($ this ->pathToKey );
84+ $ algorithmManager = new AlgorithmManager ([new RS512 ()]);
85+ $ jwsBuilder = new JWSBuilder ($ algorithmManager );
86+
5087 $ data = [
5188 'attributes ' => $ request ['Attributes ' ],
5289 'attrMap ' => $ this ->attrMap ,
5390 'attrsToConversion ' => $ this ->attrsToConversion ,
5491 'perunUserId ' => $ request ['perun ' ]['user ' ]->getId ()
5592 ];
5693
57- $ cmd = 'curl -X POST -H "Content-Type: application/json" -d \'' . json_encode ($ data ) . '\' ' .
58- Module::getModuleURL ('perun/updateUes.php ' ) . ' > /dev/null & ' ;
94+ $ payload = json_encode ([
95+ 'iat ' => time (),
96+ 'nbf ' => time (),
97+ 'exp ' => time () + 300 ,
98+ 'challenge ' => $ challenge ,
99+ 'id ' => $ id ,
100+ 'data ' => $ data
101+ ]);
102+
103+ $ jws = $ jwsBuilder
104+ ->create ()
105+ ->withPayload ($ payload )
106+ ->addSignature ($ jwk , ['alg ' => 'RS512 ' ])
107+ ->build ();
108+
109+ $ serializer = new CompactSerializer ();
110+ $ token = $ serializer ->serialize ($ jws , 0 );
111+
112+ $ cmd = 'curl -X POST -H "Content-Type: application/json" -d ' . escapeshellarg ($ token ) . ' ' .
113+ escapeshellarg (Module::getModuleURL ('perun/updateUes.php ' )) . ' > /dev/null & ' ;
114+
59115 exec ($ cmd );
60116 }
61117}
0 commit comments