44
55namespace SimpleSAML \Module \perun \Auth \Process ;
66
7+ use DateTime ;
78use SimpleSAML \Auth \ProcessingFilter ;
89use SimpleSAML \Auth \State ;
910use SimpleSAML \Error \Exception ;
@@ -197,10 +198,13 @@ public function process(&$request)
197198 */
198199 public function getLatestAup ($ aups )
199200 {
201+ if (empty ($ aups )) {
202+ return null ;
203+ }
200204 $ latestAup = $ aups [0 ];
201- $ latestDate = \DateTime:: createFromFormat ( self ::DATETIME_FORMAT , $ latestAup ->date );
205+ $ latestDate = self ::parseDateTime ( $ latestAup ->date );
202206 foreach ($ aups as $ aup ) {
203- $ aupDate = \DateTime:: createFromFormat ( self ::DATETIME_FORMAT , $ aup ->date );
207+ $ aupDate = self ::parseDateTime ( $ aup ->date );
204208 if ($ latestDate < $ aupDate ) {
205209 $ latestAup = $ aup ;
206210 $ latestDate = $ aupDate ;
@@ -266,16 +270,25 @@ private function fillAupsToBeApproved($requestedAups, $aups, $userApprovedAups)
266270 {
267271 $ aupsToBeApproved = [];
268272 foreach ($ requestedAups as $ requestedAup ) {
269- $ decodedAups = json_decode ($ aups [$ requestedAup ]);
273+ $ aupsInJson = $ aups [$ requestedAup ];
274+ if (empty ($ aupsInJson )) {
275+ continue ;
276+ }
277+ $ decodedAups = json_decode ($ aupsInJson );
270278 $ latestAup = $ this ->getLatestAup ($ decodedAups );
279+ if ($ latestAup === null ) {
280+ continue ;
281+ }
271282
272- if (array_key_exists ( $ requestedAup , $ userApprovedAups )) {
283+ if (! empty ( $ userApprovedAups[ $ requestedAup ] )) {
273284 $ userAupsList = json_decode ($ userApprovedAups [$ requestedAup ]);
274285 $ userLatestAup = $ this ->getLatestAup ($ userAupsList );
275- $ latestDate = \DateTime::createFromFormat (self ::DATETIME_FORMAT , $ latestAup ->date );
276- $ userLatestDate = \DateTime::createFromFormat (self ::DATETIME_FORMAT , $ userLatestAup ->date );
277- if ($ userLatestDate >= $ latestDate ) {
278- continue ;
286+ if ($ userLatestAup !== null ) {
287+ $ latestDate = self ::parseDateTime ($ latestAup ->date );
288+ $ userLatestDate = self ::parseDateTime ($ userLatestAup ->date );
289+ if ($ userLatestDate >= $ latestDate ) {
290+ continue ;
291+ }
279292 }
280293 }
281294 $ aupsToBeApproved [$ requestedAup ] = $ latestAup ;
@@ -288,11 +301,8 @@ private function mergeAupsToBeApproved(array $perunAupsToBeApproved, array $voAu
288301 $ resultAups = $ perunAupsToBeApproved ;
289302 foreach ($ voAupsToBeApproved as $ aupKey => $ voAup ) {
290303 if (array_key_exists ($ aupKey , $ resultAups )) {
291- $ voLatestDate = \DateTime::createFromFormat (self ::DATETIME_FORMAT , $ voAup ->date );
292- $ perunLatestDate = \DateTime::createFromFormat (
293- self ::DATETIME_FORMAT ,
294- $ perunAupsToBeApproved [$ aupKey ]->date
295- );
304+ $ voLatestDate = self ::parseDateTime ($ voAup ->date );
305+ $ perunLatestDate = self ::parseDateTime ($ perunAupsToBeApproved [$ aupKey ]->date );
296306 if ($ voLatestDate >= $ perunLatestDate ) {
297307 $ resultAups [$ aupKey ] = $ voLatestDate ;
298308 } else {
@@ -304,4 +314,21 @@ private function mergeAupsToBeApproved(array $perunAupsToBeApproved, array $voAu
304314 }
305315 return $ resultAups ;
306316 }
317+
318+ /**
319+ * Parses datetime with format set in self::DATETIME_FORMAT. If parsing fails, value passed in $default will be
320+ * returned (or null if not provided)
321+ *
322+ * @param string $date to be parsed using self::DATETIME_FORMAT format
323+ * @param DateTime|null $default (optional) value to be returned in case of error
324+ * @return DateTime parsed datetime, or default value (null if not provided)
325+ */
326+ private function parseDateTime (string $ date , DateTime $ default = null ): DateTime
327+ {
328+ $ result = DateTime::createFromFormat (self ::DATETIME_FORMAT , $ date );
329+ if ($ result === false ) {
330+ $ result = $ default ;
331+ }
332+ return $ result ;
333+ }
307334}
0 commit comments