diff --git a/.php-cs-fixer.cache b/.php-cs-fixer.cache index 04df92ac..c6fb1f24 100644 --- a/.php-cs-fixer.cache +++ b/.php-cs-fixer.cache @@ -1 +1 @@ -{"php":"8.1.29","version":"3.52.1:v3.52.1#6e77207f0d851862ceeb6da63e6e22c01b1587bc","indent":" ","lineEnding":"\n","rules":{"array_syntax":{"syntax":"short"},"no_unused_imports":true,"ordered_imports":{"imports_order":["const","class","function"]},"php_unit_fqcn_annotation":true,"phpdoc_return_self_reference":true,"phpdoc_scalar":true},"hashes":{"\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder2251\/examples\/profile\/routes\/web.php":"4d6d95a1a884c50539b3ba82cb1cae6e","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder14248\/examples\/profile\/routes\/web.php":"4d6d95a1a884c50539b3ba82cb1cae6e","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder6481\/examples\/digitalidentity\/app\/Http\/Controllers\/ReceiptController.php":"10f70ffe111a0030b29762494cc5de7d","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder17383\/examples\/digitalidentity\/app\/Http\/Controllers\/IdentityController.php":"369515522c3efd6cd55a8363d4e97c05","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder7913\/examples\/digitalidentity\/app\/Http\/Controllers\/IdentityController.php":"369515522c3efd6cd55a8363d4e97c05","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder9690\/tests\/Identity\/DigitalIdentityServiceTest.php":"d3bcc6557c58c4301e0875c38f7c0c12","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder13374\/tests\/Identity\/DigitalIdentityServiceTest.php":"70473ccb2db6eb62fdedfff721a214a8","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder5073\/tests\/Identity\/DigitalIdentityServiceTest.php":"99d9b9277669e852ff57a8d0342d6c39","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder12947\/tests\/Identity\/DigitalIdentityServiceTest.php":"9ac6d6a63849af693c9a0d20e75d1431","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder6060\/tests\/Identity\/ReceiptItemKeyTest.php":"55d8ca1a8d0503d5c1db4cae2d334f02","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder16745\/tests\/Identity\/ReceiptItemKeyTest.php":"5f59fbb78733add24176a1f18b573bd8","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder15237\/tests\/Identity\/ReceiptItemKeyTest.php":"759ee7f5430046ffd1f4b66727dfdfac","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder2482\/tests\/Identity\/ReceiptItemKeyTest.php":"759ee7f5430046ffd1f4b66727dfdfac","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder9500\/tests\/Identity\/ReceiptItemKeyTest.php":"759ee7f5430046ffd1f4b66727dfdfac","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder8154\/tests\/Identity\/ReceiptItemKeyTest.php":"759ee7f5430046ffd1f4b66727dfdfac","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder3096\/tests\/Identity\/ReceiptItemKeyTest.php":"759ee7f5430046ffd1f4b66727dfdfac","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder10727\/tests\/Identity\/DigitalIdentityServiceTest.php":"9ac6d6a63849af693c9a0d20e75d1431","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder1094\/tests\/Identity\/DigitalIdentityServiceTest.php":"9ac6d6a63849af693c9a0d20e75d1431","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder1203\/tests\/Identity\/DigitalIdentityServiceTest.php":"954b753c374f04913b3a73c0584824d7","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder8242\/tests\/Identity\/DigitalIdentityServiceTest.php":"a2830bae77f9853790b730ab1c52a9c0","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder8662\/tests\/Identity\/DigitalIdentityServiceTest.php":"a2830bae77f9853790b730ab1c52a9c0","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder9336\/tests\/Identity\/DigitalIdentityServiceTest.php":"a2830bae77f9853790b730ab1c52a9c0","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder4589\/tests\/Identity\/DigitalIdentityServiceTest.php":"a2830bae77f9853790b730ab1c52a9c0","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder7107\/src\/Util\/Json.php":"416feed44d604ebe1ab41024bfe1e842","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder676\/src\/Util\/Json.php":"416feed44d604ebe1ab41024bfe1e842","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder3256\/src\/Util\/Json.php":"fcfdbafac60b46074a2e5bff67a4da5e","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder16969\/src\/Util\/Json.php":"43f6186a4d9a6fa33f171b50d1fd16cf","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder2814\/src\/Util\/Json.php":"981cbea86ffe2c2d2f0dc1a0bae0d131","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder14602\/src\/Util\/Json.php":"35167d47b2c78183ce0239909063207f","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder6556\/src\/Util\/Json.php":"438bb921ff61fc933627c10b42950061","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder14722\/src\/Util\/Json.php":"baf949e9e66eaef974049925a9a3c07a","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder2471\/src\/Util\/Json.php":"399e30560c468f336ca381fc5ef60a6a","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder16727\/src\/Profile\/Util\/Attribute\/AnchorConverter.php":"ed067e23d37fc508a688fe507a58f093","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder4520\/src\/Profile\/Util\/Attribute\/AnchorConverter.php":"ed067e23d37fc508a688fe507a58f093","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder14740\/src\/Profile\/Util\/Attribute\/AnchorConverter.php":"7ff610cf299b932c8e18a7ac767d9b79","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder5419\/src\/Profile\/Util\/Attribute\/AnchorConverter.php":"7ff610cf299b932c8e18a7ac767d9b79","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder9224\/src\/Profile\/Util\/Attribute\/AnchorConverter.php":"7ff610cf299b932c8e18a7ac767d9b79","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder7635\/src\/Profile\/Util\/Attribute\/AnchorConverter.php":"7ff610cf299b932c8e18a7ac767d9b79","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder11320\/src\/Profile\/Util\/Attribute\/AnchorConverter.php":"7ff610cf299b932c8e18a7ac767d9b79","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder2840\/src\/Util\/Json.php":"399e30560c468f336ca381fc5ef60a6a","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder4668\/src\/Profile\/Util\/Attribute\/AnchorConverter.php":"7ff610cf299b932c8e18a7ac767d9b79","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder793\/src\/Util\/Json.php":"399e30560c468f336ca381fc5ef60a6a","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder13155\/src\/Util\/Json.php":"399e30560c468f336ca381fc5ef60a6a","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder15963\/src\/Util\/Json.php":"399e30560c468f336ca381fc5ef60a6a","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder14757\/src\/Util\/Json.php":"3823f798ec319e906874613cae901c2b","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder2396\/src\/Util\/Json.php":"3823f798ec319e906874613cae901c2b","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder15785\/src\/Util\/Json.php":"f3bceeffab837a6c1867ee2faa60b5e3","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder6944\/src\/Util\/Json.php":"f3bceeffab837a6c1867ee2faa60b5e3","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder14577\/src\/DigitalIdentityClient.php":"23ce922c1c224fe16e2ffda312ff9723","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder13671\/src\/Util\/Json.php":"f3bceeffab837a6c1867ee2faa60b5e3","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder17359\/src\/DigitalIdentityClient.php":"91d4b2079927f23dcd4b4c11b7addb71","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder8823\/src\/Util\/Json.php":"f3bceeffab837a6c1867ee2faa60b5e3","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder5305\/src\/DigitalIdentityClient.php":"0f901f713835ac4747b4132e3147cc68","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder17072\/src\/Util\/Json.php":"f3bceeffab837a6c1867ee2faa60b5e3","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder9380\/src\/DigitalIdentityClient.php":"0f901f713835ac4747b4132e3147cc68","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder9175\/src\/Util\/Json.php":"f3bceeffab837a6c1867ee2faa60b5e3","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder4237\/src\/DigitalIdentityClient.php":"0f901f713835ac4747b4132e3147cc68","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder5464\/tests\/Identity\/ReceiptItemKeyTest.php":"759ee7f5430046ffd1f4b66727dfdfac","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder2115\/src\/DigitalIdentityClient.php":"0f901f713835ac4747b4132e3147cc68","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder1066\/tests\/Identity\/ReceiptItemKeyTest.php":"759ee7f5430046ffd1f4b66727dfdfac","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder1075\/src\/DigitalIdentityClient.php":"0f901f713835ac4747b4132e3147cc68","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder11516\/tests\/Identity\/ReceiptItemKeyTest.php":"759ee7f5430046ffd1f4b66727dfdfac","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder18199\/src\/DigitalIdentityClient.php":"0f901f713835ac4747b4132e3147cc68","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder14323\/tests\/Identity\/DigitalIdentityServiceTest.php":"a2830bae77f9853790b730ab1c52a9c0","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder8335\/tests\/Identity\/DigitalIdentityServiceTest.php":"a2830bae77f9853790b730ab1c52a9c0","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder18769\/tests\/Identity\/DigitalIdentityServiceTest.php":"a2830bae77f9853790b730ab1c52a9c0","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder16269\/tests\/Identity\/DigitalIdentityServiceTest.php":"a2830bae77f9853790b730ab1c52a9c0","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder2045\/tests\/Identity\/DigitalIdentityServiceTest.php":"a2830bae77f9853790b730ab1c52a9c0","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder4112\/src\/DigitalIdentityClient.php":"0f901f713835ac4747b4132e3147cc68","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder4430\/tests\/Identity\/DigitalIdentityServiceTest.php":"a2830bae77f9853790b730ab1c52a9c0","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder5343\/src\/DigitalIdentityClient.php":"0f901f713835ac4747b4132e3147cc68","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder18883\/src\/DigitalIdentityClient.php":"0f901f713835ac4747b4132e3147cc68","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder5545\/src\/DigitalIdentityClient.php":"0f901f713835ac4747b4132e3147cc68","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder5258\/src\/DigitalIdentityClient.php":"0f901f713835ac4747b4132e3147cc68","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder6300\/src\/DigitalIdentityClient.php":"e47a018ced67b5654c33892a16c12b24","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder883\/src\/DigitalIdentityClient.php":"9fba09c315d5bba5bd7b90ae9a717003","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder9271\/src\/DigitalIdentityClient.php":"9fba09c315d5bba5bd7b90ae9a717003","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder18128\/src\/Profile\/Util\/Attribute\/AnchorConverter.php":"7ff610cf299b932c8e18a7ac767d9b79","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder11252\/src\/Util\/Json.php":"f3bceeffab837a6c1867ee2faa60b5e3","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder8070\/src\/Util\/Json.php":"3614821552571b08458651531fa2244a","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder14329\/src\/Profile\/Util\/Attribute\/AnchorConverter.php":"7ff610cf299b932c8e18a7ac767d9b79","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder11739\/src\/Profile\/Util\/Attribute\/AnchorConverter.php":"7ff610cf299b932c8e18a7ac767d9b79","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder9179\/src\/Profile\/Util\/Attribute\/AnchorConverter.php":"7ff610cf299b932c8e18a7ac767d9b79","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder3527\/src\/Profile\/Util\/Attribute\/AnchorConverter.php":"7ff610cf299b932c8e18a7ac767d9b79","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder8434\/src\/Profile\/Util\/Attribute\/AnchorConverter.php":"7ff610cf299b932c8e18a7ac767d9b79","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder4161\/src\/Profile\/Util\/Attribute\/AnchorConverter.php":"7ff610cf299b932c8e18a7ac767d9b79","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder8925\/src\/Profile\/Util\/Attribute\/AnchorConverter.php":"7ff610cf299b932c8e18a7ac767d9b79","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder9863\/src\/Profile\/Util\/Attribute\/AnchorConverter.php":"7ff610cf299b932c8e18a7ac767d9b79","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder14952\/src\/Profile\/Util\/Attribute\/AnchorConverter.php":"7ff610cf299b932c8e18a7ac767d9b79","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder10903\/src\/Util\/Json.php":"2b9e6981db0d7c984f0681cc6198d2fa","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder16968\/src\/Profile\/Util\/Attribute\/AnchorConverter.php":"7ff610cf299b932c8e18a7ac767d9b79","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder13512\/src\/Util\/Json.php":"f3bceeffab837a6c1867ee2faa60b5e3","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder10629\/src\/Util\/Json.php":"f3bceeffab837a6c1867ee2faa60b5e3","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder951\/src\/Util\/Json.php":"f3bceeffab837a6c1867ee2faa60b5e3","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder5246\/src\/Util\/Json.php":"f3bceeffab837a6c1867ee2faa60b5e3","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder17794\/src\/Util\/Json.php":"34d6f488baf792a5f65fb005ade1cb21","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder14129\/src\/Util\/Json.php":"17a68a33bd185354336301ae7ab20357","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder18673\/src\/Util\/Json.php":"0015fd9dba1e470dd3f9103b3645c6bf","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder14989\/src\/Util\/Json.php":"0015fd9dba1e470dd3f9103b3645c6bf","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder16311\/src\/Util\/Json.php":"703611be04e77b206274447d586eeb78","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder15550\/src\/Util\/Json.php":"703611be04e77b206274447d586eeb78","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder17676\/src\/Util\/Json.php":"703611be04e77b206274447d586eeb78","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder20242\/src\/Util\/Json.php":"703611be04e77b206274447d586eeb78","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder4853\/src\/Util\/Json.php":"5c34e189670912a642f01880daf37f2b","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder792\/src\/Util\/Json.php":"5c34e189670912a642f01880daf37f2b","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder11173\/src\/Util\/Json.php":"5c34e189670912a642f01880daf37f2b","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder640\/src\/Util\/Json.php":"ec9942ed9643d6694b3464ef5e95ff14","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder31\/src\/Util\/Json.php":"ec9942ed9643d6694b3464ef5e95ff14","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder12677\/src\/Util\/Json.php":"9254d07997116f33d53f3e153652efac","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder5735\/src\/Util\/Json.php":"402873b822b8ff0ab506b867b0284b27","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder10939\/src\/Util\/Json.php":"402873b822b8ff0ab506b867b0284b27","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder11755\/src\/Util\/Json.php":"402873b822b8ff0ab506b867b0284b27","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder9318\/src\/Util\/Json.php":"ec9942ed9643d6694b3464ef5e95ff14","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder13404\/src\/Util\/Json.php":"c4fb1fb130d8553a3cc091fe29120375","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder8092\/src\/Util\/Json.php":"e309c022805530654120c3f46da286c8","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder20477\/src\/Util\/Json.php":"3f4a63e967fa3613c453202901551c8f","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder20545\/src\/Util\/Json.php":"e309c022805530654120c3f46da286c8","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder1983\/src\/Util\/Json.php":"898389c83f9899f1cb767f2ff0830405","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder7856\/src\/Util\/Json.php":"a4d756b12101cc8076bb274216478765","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder19874\/src\/Util\/Json.php":"e5167f42e08bbe70b18817ce5f059c8d","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder19449\/src\/Util\/Json.php":"1ad92f37cc957bae66e983ae1be2ec82","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder7291\/src\/Util\/Json.php":"eb93f1a61ff4653943c7cbbad92b4ed9","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder8369\/src\/Util\/Json.php":"87109bc8d7c76aee5a0279db0d399076","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder1323\/src\/Util\/Json.php":"e74f6b19b813e269a0a722867c1cb668","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder5881\/src\/Util\/Json.php":"e0cefb8ebd92e9ece8bc2d0d1c589b63","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder8174\/src\/Util\/Json.php":"e0cefb8ebd92e9ece8bc2d0d1c589b63","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder19818\/src\/Util\/Json.php":"e0cefb8ebd92e9ece8bc2d0d1c589b63","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder978\/src\/Util\/Json.php":"e0cefb8ebd92e9ece8bc2d0d1c589b63","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder17708\/src\/Util\/Json.php":"e0cefb8ebd92e9ece8bc2d0d1c589b63","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder8198\/src\/Util\/Json.php":"e0cefb8ebd92e9ece8bc2d0d1c589b63","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder9911\/src\/Util\/Json.php":"2173a371cae72ea1c14e71245dafd121","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder743\/src\/Util\/Json.php":"2173a371cae72ea1c14e71245dafd121","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder17774\/src\/Util\/Json.php":"2173a371cae72ea1c14e71245dafd121","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder2001\/src\/Util\/Json.php":"2173a371cae72ea1c14e71245dafd121","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder18642\/src\/Util\/Json.php":"2173a371cae72ea1c14e71245dafd121","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder787\/src\/Util\/Json.php":"b944483bdefcb8644782ac516d296a79","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder11064\/src\/Util\/Json.php":"b944483bdefcb8644782ac516d296a79","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder6989\/src\/Util\/Json.php":"b944483bdefcb8644782ac516d296a79","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder6811\/src\/Util\/Json.php":"b944483bdefcb8644782ac516d296a79","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder5471\/src\/Util\/Json.php":"7308fd8e9f42d86934a5aea104849a6e","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder17646\/src\/Util\/Json.php":"7308fd8e9f42d86934a5aea104849a6e","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder4263\/src\/Util\/Json.php":"7308fd8e9f42d86934a5aea104849a6e","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder18621\/src\/Util\/Json.php":"b944483bdefcb8644782ac516d296a79","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder18994\/src\/Util\/Json.php":"7308fd8e9f42d86934a5aea104849a6e","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder3936\/src\/Util\/Json.php":"7308fd8e9f42d86934a5aea104849a6e","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder13966\/src\/Util\/Json.php":"b944483bdefcb8644782ac516d296a79","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder13895\/src\/Util\/Json.php":"2173a371cae72ea1c14e71245dafd121","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder18054\/src\/Util\/Json.php":"2173a371cae72ea1c14e71245dafd121","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder17506\/src\/Util\/Json.php":"2173a371cae72ea1c14e71245dafd121","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder10224\/src\/Util\/Json.php":"e0cefb8ebd92e9ece8bc2d0d1c589b63","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder3087\/src\/Util\/Json.php":"e0cefb8ebd92e9ece8bc2d0d1c589b63","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder17683\/src\/Util\/Json.php":"e0cefb8ebd92e9ece8bc2d0d1c589b63","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder4535\/src\/Util\/Json.php":"e0cefb8ebd92e9ece8bc2d0d1c589b63","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder6783\/.php-cs-fixer.dist.php":"0a31d73e56a1ecd093b4f761852ee1d3","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder17761\/.php-cs-fixer.dist.php":"0a31d73e56a1ecd093b4f761852ee1d3","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder19549\/src\/Util\/Json.php":"e0cefb8ebd92e9ece8bc2d0d1c589b63","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder17713\/src\/Util\/Json.php":"6b09dbb84c5bc28d1f253869a6e9aa6a","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder14312\/src\/Util\/Json.php":"6b09dbb84c5bc28d1f253869a6e9aa6a","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder17129\/src\/Util\/Json.php":"6b09dbb84c5bc28d1f253869a6e9aa6a","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder6586\/src\/Util\/Json.php":"6b09dbb84c5bc28d1f253869a6e9aa6a","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder7395\/src\/Util\/Json.php":"506e473433b735d2ba4b6f623f294ae3","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder139\/src\/Util\/Json.php":"506e473433b735d2ba4b6f623f294ae3","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder16609\/src\/Util\/Json.php":"506e473433b735d2ba4b6f623f294ae3","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder5188\/src\/Util\/Json.php":"506e473433b735d2ba4b6f623f294ae3","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder16358\/src\/Util\/Json.php":"506e473433b735d2ba4b6f623f294ae3","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder16910\/src\/Util\/Json.php":"6b09dbb84c5bc28d1f253869a6e9aa6a","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder15948\/src\/Util\/Json.php":"e0cefb8ebd92e9ece8bc2d0d1c589b63","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder7555\/src\/Util\/Json.php":"eb93f1a61ff4653943c7cbbad92b4ed9","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder13803\/src\/Util\/Json.php":"1ad92f37cc957bae66e983ae1be2ec82","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder328\/src\/Util\/Json.php":"e5167f42e08bbe70b18817ce5f059c8d","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder2830\/src\/Util\/Json.php":"a4d756b12101cc8076bb274216478765","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder8983\/src\/Util\/Json.php":"e309c022805530654120c3f46da286c8","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder20557\/src\/Util\/Json.php":"ec9942ed9643d6694b3464ef5e95ff14","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder7262\/src\/Util\/Json.php":"402873b822b8ff0ab506b867b0284b27","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder12558\/src\/Util\/Json.php":"402873b822b8ff0ab506b867b0284b27","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder2921\/src\/Util\/Json.php":"402873b822b8ff0ab506b867b0284b27","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder21265\/src\/Util\/Json.php":"9254d07997116f33d53f3e153652efac","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder13708\/src\/Util\/Json.php":"ec9942ed9643d6694b3464ef5e95ff14","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder3632\/src\/Util\/Json.php":"5c34e189670912a642f01880daf37f2b","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder680\/src\/Util\/Json.php":"5c34e189670912a642f01880daf37f2b","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder14936\/src\/Util\/Json.php":"5c34e189670912a642f01880daf37f2b","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder13229\/src\/Util\/Json.php":"5c34e189670912a642f01880daf37f2b","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder4031\/src\/Util\/Json.php":"5c34e189670912a642f01880daf37f2b","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder330\/src\/Util\/Json.php":"5c34e189670912a642f01880daf37f2b","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder18123\/src\/Util\/Json.php":"5c34e189670912a642f01880daf37f2b","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder21026\/src\/Util\/Json.php":"5c34e189670912a642f01880daf37f2b","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder13768\/src\/Util\/Json.php":"5c34e189670912a642f01880daf37f2b","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder5865\/src\/Util\/Json.php":"5c34e189670912a642f01880daf37f2b","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder30\/src\/Util\/Json.php":"5c34e189670912a642f01880daf37f2b","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder13281\/src\/Util\/Json.php":"5c34e189670912a642f01880daf37f2b","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder7240\/src\/Util\/Json.php":"5c34e189670912a642f01880daf37f2b","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder2674\/src\/Identity\/WrappedReceipt.php":"3a77a22be093a1da75438ea2bb9fcb20","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder12684\/src\/DigitalIdentityClient.php":"9fba09c315d5bba5bd7b90ae9a717003","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder1573\/src\/Util\/Config.php":"46ed5ebc2a984ab4af8c108119bfad2e","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder8169\/src\/DigitalIdentityClient.php":"9fba09c315d5bba5bd7b90ae9a717003","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder18629\/tests\/DigitalIdentityClientTest.php":"80700900f098b612b7b973e4dfbe744c","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder19904\/src\/Identity\/DigitalIdentityService.php":"d1ca6e501e690798ca13ec028cbf505e","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder4683\/examples\/profile\/sdk\/src\/Identity\/DigitalIdentityService.php":"d1ca6e501e690798ca13ec028cbf505e","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder7034\/tests\/DigitalIdentityClientTest.php":"80700900f098b612b7b973e4dfbe744c","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder20120\/tests\/DigitalIdentityClientTest.php":"80700900f098b612b7b973e4dfbe744c","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder13320\/tests\/DigitalIdentityClientTest.php":"80700900f098b612b7b973e4dfbe744c","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder6703\/tests\/DigitalIdentityClientTest.php":"5f76cb916302ba067a29022496f89f08","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder3296\/tests\/DigitalIdentityClientTest.php":"5f76cb916302ba067a29022496f89f08","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder22224\/tests\/DigitalIdentityClientTest.php":"c2e9abfc9da60a57ce9a6a13009ef514","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder14862\/src\/DigitalIdentityClient.php":"9fba09c315d5bba5bd7b90ae9a717003","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder12538\/examples\/profile\/sdk\/src\/Identity\/DigitalIdentityService.php":"d1ca6e501e690798ca13ec028cbf505e","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder9837\/tests\/Identity\/DigitalIdentityServiceTest.php":"a2830bae77f9853790b730ab1c52a9c0","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder11954\/tests\/Identity\/DigitalIdentityServiceTest.php":"a2830bae77f9853790b730ab1c52a9c0","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder20262\/tests\/Identity\/DigitalIdentityServiceTest.php":"a2830bae77f9853790b730ab1c52a9c0","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder10165\/tests\/DigitalIdentityClientTest.php":"953eff9597ede61c3443df04ab6f73a1","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder21693\/tests\/Identity\/DigitalIdentityServiceTest.php":"a2830bae77f9853790b730ab1c52a9c0","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder21939\/tests\/Identity\/DigitalIdentityServiceTest.php":"a2830bae77f9853790b730ab1c52a9c0","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder1101\/tests\/DigitalIdentityClientTest.php":"0202399f750760f0a9fe103f288136fe","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder1472\/tests\/Identity\/DigitalIdentityServiceTest.php":"a2830bae77f9853790b730ab1c52a9c0","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder21854\/tests\/DigitalIdentityClientTest.php":"f41cd7bc113d5aea083c34a8b9e91d75","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder2270\/tests\/Identity\/DigitalIdentityServiceTest.php":"a2830bae77f9853790b730ab1c52a9c0","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder7872\/tests\/Identity\/DigitalIdentityServiceTest.php":"a2830bae77f9853790b730ab1c52a9c0","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder1307\/tests\/Identity\/DigitalIdentityServiceTest.php":"a2830bae77f9853790b730ab1c52a9c0","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder5105\/tests\/DigitalIdentityClientTest.php":"528c3b0f2dc6f0ad109085a4bc2e7ef8","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder14108\/tests\/DigitalIdentityClientTest.php":"528c3b0f2dc6f0ad109085a4bc2e7ef8","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder20536\/tests\/DigitalIdentityClientTest.php":"528c3b0f2dc6f0ad109085a4bc2e7ef8","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder22047\/tests\/DigitalIdentityClientTest.php":"528c3b0f2dc6f0ad109085a4bc2e7ef8","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder20880\/tests\/Identity\/DigitalIdentityServiceTest.php":"a2830bae77f9853790b730ab1c52a9c0","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder9281\/tests\/Identity\/DigitalIdentityServiceTest.php":"a2830bae77f9853790b730ab1c52a9c0","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder10376\/tests\/DigitalIdentityClientTest.php":"0af037fdbccbe745e05d9e5d76f47fc9","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder3106\/tests\/Identity\/DigitalIdentityServiceTest.php":"a2830bae77f9853790b730ab1c52a9c0","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder15880\/tests\/Identity\/DigitalIdentityServiceTest.php":"a2830bae77f9853790b730ab1c52a9c0","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder18815\/tests\/DigitalIdentityClientTest.php":"0af037fdbccbe745e05d9e5d76f47fc9","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder5895\/tests\/DigitalIdentityClientTest.php":"0af037fdbccbe745e05d9e5d76f47fc9","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder11712\/tests\/Identity\/DigitalIdentityServiceTest.php":"a2830bae77f9853790b730ab1c52a9c0","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder20786\/tests\/Identity\/DigitalIdentityServiceTest.php":"a2830bae77f9853790b730ab1c52a9c0","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder5851\/tests\/DigitalIdentityClientTest.php":"f4df423ac41e5ba91d3bb481e7f1a93f","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder18644\/tests\/Identity\/DigitalIdentityServiceTest.php":"a2830bae77f9853790b730ab1c52a9c0","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder4888\/tests\/Identity\/DigitalIdentityServiceTest.php":"a2830bae77f9853790b730ab1c52a9c0","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder164\/tests\/DigitalIdentityClientTest.php":"f4df423ac41e5ba91d3bb481e7f1a93f","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder20836\/tests\/DigitalIdentityClientTest.php":"f4df423ac41e5ba91d3bb481e7f1a93f","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder12690\/tests\/DigitalIdentityClientTest.php":"45529bd7b31bb206e9e84d0ca2f6c107","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder6330\/tests\/DigitalIdentityClientTest.php":"45529bd7b31bb206e9e84d0ca2f6c107","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder15499\/tests\/DigitalIdentityClientTest.php":"f4df423ac41e5ba91d3bb481e7f1a93f","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder6442\/tests\/DigitalIdentityClientTest.php":"fca1404f1ad711562bbbfbdbd7b17093","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder12990\/tests\/DigitalIdentityClientTest.php":"314f82e6800417e3d455b0ccbd4fd013","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder21119\/tests\/DigitalIdentityClientTest.php":"0ba5e47b02cebf2edc2f7fc4b4c22ab2","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder8949\/tests\/DigitalIdentityClientTest.php":"0ba5e47b02cebf2edc2f7fc4b4c22ab2","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder17749\/tests\/DigitalIdentityClientTest.php":"0ba5e47b02cebf2edc2f7fc4b4c22ab2","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder141\/tests\/DigitalIdentityClientTest.php":"7afddf255900f83a72e0a37a93a6f6fe","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder2618\/tests\/DigitalIdentityClientTest.php":"7afddf255900f83a72e0a37a93a6f6fe","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder15512\/tests\/DigitalIdentityClientTest.php":"7afddf255900f83a72e0a37a93a6f6fe","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder5546\/tests\/DigitalIdentityClientTest.php":"7afddf255900f83a72e0a37a93a6f6fe","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder7040\/tests\/DigitalIdentityClientTest.php":"7afddf255900f83a72e0a37a93a6f6fe","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder9182\/tests\/DigitalIdentityClientTest.php":"7afddf255900f83a72e0a37a93a6f6fe","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder17462\/examples\/doc-scan\/app\/Http\/Controllers\/HomeController.php":"c32a3dc3cb5ae67c23c66ec5aff73365","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder10025\/examples\/doc-scan\/app\/Http\/Controllers\/HomeController.php":"c32a3dc3cb5ae67c23c66ec5aff73365","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder18182\/examples\/digitalidentity\/app\/Http\/Kernel.php":"aad72f11b36f9393d25b1a8941ba8b39","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder944\/examples\/doc-scan\/app\/Http\/Controllers\/HomeController.php":"c32a3dc3cb5ae67c23c66ec5aff73365","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder533\/src\/Util\/Json.php":"5c34e189670912a642f01880daf37f2b","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder1252\/src\/Util\/Json.php":"5c34e189670912a642f01880daf37f2b","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder8028\/src\/Util\/Json.php":"5c34e189670912a642f01880daf37f2b","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder12731\/src\/Util\/Json.php":"5c34e189670912a642f01880daf37f2b","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder30801\/src\/Util\/Json.php":"7ebb6b44136d8e703d460029dec27318","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder24448\/src\/Util\/Json.php":"761bcc459afb5518e772b4a83552d051","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder11957\/src\/Util\/Json.php":"761bcc459afb5518e772b4a83552d051","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder26441\/src\/Util\/Json.php":"761bcc459afb5518e772b4a83552d051","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder31456\/src\/Util\/Json.php":"761bcc459afb5518e772b4a83552d051","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder15272\/src\/Util\/Json.php":"761bcc459afb5518e772b4a83552d051","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder16060\/src\/Util\/Json.php":"761bcc459afb5518e772b4a83552d051","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder9581\/src\/Util\/Json.php":"761bcc459afb5518e772b4a83552d051","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder2255\/src\/Util\/Json.php":"761bcc459afb5518e772b4a83552d051","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder24541\/src\/Util\/Json.php":"761bcc459afb5518e772b4a83552d051","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder8103\/src\/Util\/Json.php":"761bcc459afb5518e772b4a83552d051","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder8531\/src\/Util\/Json.php":"8e53d5d66d55e0619d026ce821ec4237","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder12372\/src\/Util\/Json.php":"0a82acbcdf378adf0211899e0770843d"}} \ No newline at end of file +{"php":"8.1.29","version":"3.59.3:v3.59.3#30ba9ecc2b0e5205e578fe29973c15653d9bfd29","indent":" ","lineEnding":"\n","rules":{"array_syntax":{"syntax":"short"},"no_unused_imports":true,"ordered_imports":{"imports_order":["const","class","function"]},"php_unit_fqcn_annotation":true,"phpdoc_return_self_reference":true,"phpdoc_scalar":true},"hashes":{"\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder32718\/tests\/Util\/JsonTest.php":"229e164156257a33bc40ec45910f1561","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder30753\/tests\/Util\/JsonTest.php":"229e164156257a33bc40ec45910f1561","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder24222\/tests\/Util\/JsonTest.php":"229e164156257a33bc40ec45910f1561","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder25907\/tests\/DigitalIdentityClientTest.php":"7afddf255900f83a72e0a37a93a6f6fe","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder35317\/src\/DigitalIdentityClient.php":"9fba09c315d5bba5bd7b90ae9a717003","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder3167\/src\/Identity\/DigitalIdentityService.php":"d1ca6e501e690798ca13ec028cbf505e","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder667\/src\/Identity\/DigitalIdentityService.php":"d1ca6e501e690798ca13ec028cbf505e","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder32289\/src\/Identity\/DigitalIdentityService.php":"d1ca6e501e690798ca13ec028cbf505e","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder821\/tests\/DigitalIdentityClientTest.php":"7afddf255900f83a72e0a37a93a6f6fe","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder8036\/tests\/DigitalIdentityClientTest.php":"7afddf255900f83a72e0a37a93a6f6fe","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder3553\/tests\/DigitalIdentityClientTest.php":"7afddf255900f83a72e0a37a93a6f6fe","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder9961\/tests\/DigitalIdentityClientTest.php":"7afddf255900f83a72e0a37a93a6f6fe","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder34449\/tests\/DigitalIdentityClientTest.php":"7afddf255900f83a72e0a37a93a6f6fe","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder32249\/src\/Profile\/Util\/Attribute\/AnchorConverter.php":"c348f7a24bc5c13dc8b7362319cbfc9a","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder37291\/src\/Profile\/Util\/Attribute\/AnchorConverter.php":"c348f7a24bc5c13dc8b7362319cbfc9a","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder3093\/src\/Profile\/Util\/Attribute\/AnchorConverter.php":"c348f7a24bc5c13dc8b7362319cbfc9a","\/private\/var\/folders\/hs\/kw0d0_0d2kj8xl5yd5_t2rz40000gn\/T\/PHP CS Fixertemp_folder28127\/src\/Profile\/Util\/Attribute\/AnchorConverter.php":"c348f7a24bc5c13dc8b7362319cbfc9a"}} \ No newline at end of file diff --git a/src/DocScan/Session/Create/SdkConfig.php b/src/DocScan/Session/Create/SdkConfig.php index 51b85112..453ad44a 100644 --- a/src/DocScan/Session/Create/SdkConfig.php +++ b/src/DocScan/Session/Create/SdkConfig.php @@ -63,11 +63,6 @@ class SdkConfig implements \JsonSerializable */ private $attemptsConfiguration; - /** - * @var string|null - */ - private $biometricConsentFlow; - /** * @param string|null $allowedCaptureMethods * @param string|null $primaryColour @@ -80,7 +75,6 @@ class SdkConfig implements \JsonSerializable * @param string|null $privacyPolicyUrl * @param bool|null $allowHandoff * @param array|null $idDocumentTextDataExtractionRetriesConfig - * @param string|null $biometricConsentFlow */ public function __construct( ?string $allowedCaptureMethods, @@ -93,9 +87,7 @@ public function __construct( ?string $errorUrl, ?string $privacyPolicyUrl = null, ?bool $allowHandoff = null, - ?array $idDocumentTextDataExtractionRetriesConfig = null, - ?string $biometricConsentFlow = null - + ?array $idDocumentTextDataExtractionRetriesConfig = null ) { $this->allowedCaptureMethods = $allowedCaptureMethods; $this->primaryColour = $primaryColour; @@ -110,8 +102,6 @@ public function __construct( if (!is_null($idDocumentTextDataExtractionRetriesConfig)) { $this->attemptsConfiguration = new AttemptsConfiguration($idDocumentTextDataExtractionRetriesConfig); } - $this->biometricConsentFlow = $biometricConsentFlow; - } /** @@ -131,7 +121,6 @@ public function jsonSerialize(): \stdClass 'privacy_policy_url' => $this->getPrivacyPolicyUrl(), 'allow_handoff' => $this->getAllowHandoff(), 'attempts_configuration' => $this->getAttemptsConfiguration(), - 'biometric_consent_flow' => $this->getBiometricConsentFlow() ]); } @@ -222,12 +211,4 @@ public function getAttemptsConfiguration(): ?AttemptsConfiguration { return $this->attemptsConfiguration; } - - /** - * @return string|null - */ - public function getBiometricConsentFlow(): ?string - { - return $this->biometricConsentFlow; - } } diff --git a/src/DocScan/Session/Create/SdkConfigBuilder.php b/src/DocScan/Session/Create/SdkConfigBuilder.php index acf30fcc..c91adc05 100644 --- a/src/DocScan/Session/Create/SdkConfigBuilder.php +++ b/src/DocScan/Session/Create/SdkConfigBuilder.php @@ -66,11 +66,6 @@ class SdkConfigBuilder */ private $idDocumentTextDataExtractionRetriesConfig; - /** - * @var string|null - */ - private $biometricConsentFlow; - public function withAllowsCamera(): self { return $this->withAllowedCaptureMethod(self::CAMERA); @@ -141,11 +136,6 @@ public function withAllowHandoff(bool $allowHandoff): self return $this; } - public function withBiometricConsentFlow(string $biometricConsentFlow): self - { - $this->biometricConsentFlow = $biometricConsentFlow; - return $this; - } /** * Allows configuring the number of attempts permitted for text extraction on an ID document * @@ -213,8 +203,7 @@ public function build(): SdkConfig $this->errorUrl, $this->privacyPolicyUrl, $this->allowHandoff, - $this->idDocumentTextDataExtractionRetriesConfig, - $this->biometricConsentFlow + $this->idDocumentTextDataExtractionRetriesConfig ); } } diff --git a/src/DocScan/Session/Create/Task/RequestedTextExtractionTaskBuilder.php b/src/DocScan/Session/Create/Task/RequestedTextExtractionTaskBuilder.php index 174828f9..5b29fca1 100644 --- a/src/DocScan/Session/Create/Task/RequestedTextExtractionTaskBuilder.php +++ b/src/DocScan/Session/Create/Task/RequestedTextExtractionTaskBuilder.php @@ -58,23 +58,6 @@ public function withManualCheck(string $manualCheck): self return $this->setManualCheck($manualCheck); } - /** - * @var bool - */ - private $createExpandedDocumentFields; - - /** - * - * @param string $createExpandedDocumentFields - * - * @return $this - */ - public function withCreateExpandedDocumentFields(bool $createExpandedDocumentFields): self - { - $this->createExpandedDocumentFields = $createExpandedDocumentFields; - return $this; - } - /** * @return RequestedTextExtractionTask */ @@ -82,8 +65,7 @@ public function build(): RequestedTextExtractionTask { Validation::notEmptyString($this->manualCheck, 'manualCheck'); - $config = new RequestedTextExtractionTaskConfig($this->manualCheck, $this->chipData, - $this->createExpandedDocumentFields); + $config = new RequestedTextExtractionTaskConfig($this->manualCheck, $this->chipData); return new RequestedTextExtractionTask($config); } } diff --git a/src/DocScan/Session/Create/Task/RequestedTextExtractionTaskConfig.php b/src/DocScan/Session/Create/Task/RequestedTextExtractionTaskConfig.php index 7e5716d1..9a9fb083 100644 --- a/src/DocScan/Session/Create/Task/RequestedTextExtractionTaskConfig.php +++ b/src/DocScan/Session/Create/Task/RequestedTextExtractionTaskConfig.php @@ -19,21 +19,14 @@ class RequestedTextExtractionTaskConfig implements RequestedTaskConfigInterface */ private $chipData; - /** - * @var bool|null - */ - private $createExpandedDocumentFields; - /** * @param string $manualCheck * @param string|null $chipData - * @param bool|null $createExpandedDocumentFields */ - public function __construct(string $manualCheck, ?string $chipData = null, ?bool $createExpandedDocumentFields = false) + public function __construct(string $manualCheck, ?string $chipData = null) { $this->manualCheck = $manualCheck; $this->chipData = $chipData; - $this->createExpandedDocumentFields = $createExpandedDocumentFields; } /** @@ -44,7 +37,6 @@ public function jsonSerialize(): stdClass return (object)Json::withoutNullValues([ 'manual_check' => $this->getManualCheck(), 'chip_data' => $this->getChipData(), - 'create_expanded_document_fields' => $this->getCreateExpandedDocumentFields(), ]); } @@ -63,12 +55,4 @@ public function getChipData(): ?string { return $this->chipData; } - - /** - * @return bool - */ - public function getCreateExpandedDocumentFields(): ?bool - { - return $this->createExpandedDocumentFields; - } } diff --git a/src/DocScan/Session/Retrieve/CustomAccountWatchlistCaSearchConfigResponse.php b/src/DocScan/Session/Retrieve/CustomAccountWatchlistCaSearchConfigResponse.php index efa7819d..d1372b54 100644 --- a/src/DocScan/Session/Retrieve/CustomAccountWatchlistCaSearchConfigResponse.php +++ b/src/DocScan/Session/Retrieve/CustomAccountWatchlistCaSearchConfigResponse.php @@ -35,7 +35,7 @@ public function __construct(array $searchConfig) $this->apiKey = $searchConfig['api_key']; $this->monitoring = $searchConfig['monitoring']; $this->clientRef = $searchConfig['client_ref']; - $this->tags = array_key_exists('tags', $searchConfig) ? json_decode($searchConfig['tags'], true) : []; + $this->tags = json_decode($searchConfig['tags'], true); } /** diff --git a/src/DocScan/Session/Retrieve/IdDocumentResourceResponse.php b/src/DocScan/Session/Retrieve/IdDocumentResourceResponse.php index 6d9dc824..b6e7f46a 100644 --- a/src/DocScan/Session/Retrieve/IdDocumentResourceResponse.php +++ b/src/DocScan/Session/Retrieve/IdDocumentResourceResponse.php @@ -24,11 +24,6 @@ class IdDocumentResourceResponse extends ResourceResponse */ private $documentFields; - /** - * @var ExpandedDocumentFieldsResponse|null - */ - private $expandedDocumentFields; - /** * @var DocumentIdPhotoResponse|null */ @@ -54,10 +49,6 @@ public function __construct(array $idDocument) $this->documentFields = isset($idDocument['document_fields']) ? new DocumentFieldsResponse($idDocument['document_fields']) : null; - - $this->expandedDocumentFields = isset($idDocument['expanded_document_fields']) - ? new ExpandedDocumentFieldsResponse($idDocument['expanded_document_fields']) - : null; $this->documentIdPhoto = isset($idDocument['document_id_photo']) ? new DocumentIdPhotoResponse($idDocument['document_id_photo']) @@ -96,14 +87,6 @@ public function getDocumentFields(): ?DocumentFieldsResponse return $this->documentFields; } - /** - * @return ExpandedDocumentFieldsResponse|null - */ - public function getExpandedDocumentFields(): ?ExpandedDocumentFieldsResponse - { - return $this->expandedDocumentFields; - } - /** * @return DocumentIdPhotoResponse|null */ diff --git a/src/Identity/Constraint/Constraint.php b/src/Identity/Constraint/Constraint.php new file mode 100644 index 00000000..f5afe554 --- /dev/null +++ b/src/Identity/Constraint/Constraint.php @@ -0,0 +1,8 @@ +wantedAnchors = $wantedAnchors; + + Validation::isBoolean($softPreference, 'soft_preference'); + $this->softPreference = $softPreference; + } + + public function jsonSerialize(): stdClass + { + return (object)[ + 'anchors' => $this->wantedAnchors, + 'soft_preference' => $this->softPreference, + ]; + } + + /** + * @return WantedAnchor[] + */ + public function getWantedAnchors(): array + { + return $this->wantedAnchors; + } + + /** + * @return bool + */ + public function isSoftPreference(): bool + { + return $this->softPreference; + } +} diff --git a/src/Identity/Constraint/SourceConstraint.php b/src/Identity/Constraint/SourceConstraint.php new file mode 100644 index 00000000..cd903789 --- /dev/null +++ b/src/Identity/Constraint/SourceConstraint.php @@ -0,0 +1,43 @@ +type = 'SOURCE'; + + Validation::isArrayOfType($wantedAnchors, [WantedAnchor::class], 'anchors'); + $this->preferredSources = new PreferredSources($wantedAnchors, $softPreference); + } + + public function getType(): string + { + return $this->type; + } + + public function getPreferredSources(): PreferredSources + { + return $this->preferredSources; + } + + public function jsonSerialize(): object + { + return (object)[ + 'type' => $this->getType(), + 'preferred_sources' => $this->getPreferredSources(), + ]; + } +} diff --git a/src/Identity/Constraint/SourceConstraintBuilder.php b/src/Identity/Constraint/SourceConstraintBuilder.php new file mode 100644 index 00000000..59b62e16 --- /dev/null +++ b/src/Identity/Constraint/SourceConstraintBuilder.php @@ -0,0 +1,46 @@ +wantedAnchors = $wantedAnchors; + + return $this; + } + + public function withWantedAnchor(WantedAnchor $wantedAnchor): self + { + $this->wantedAnchors[] = $wantedAnchor; + + return $this; + } + + public function withSoftPreference(bool $softPreference): self + { + $this->softPreference = $softPreference; + + return $this; + } + + public function build(): SourceConstraint + { + return new SourceConstraint($this->wantedAnchors, $this->softPreference); + } +} diff --git a/src/Identity/Extension/BasicExtensionBuilder.php b/src/Identity/Extension/BasicExtensionBuilder.php new file mode 100644 index 00000000..97d913aa --- /dev/null +++ b/src/Identity/Extension/BasicExtensionBuilder.php @@ -0,0 +1,40 @@ +type = $type; + + return $this; + } + + /** + * @param mixed $content + * + * @return $this + */ + public function withContent($content): self + { + $this->content = $content; + + return $this; + } + + public function build(): Extension + { + return new Extension($this->type, $this->content); + } +} diff --git a/src/Identity/Extension/Extension.php b/src/Identity/Extension/Extension.php new file mode 100644 index 00000000..d7e436b1 --- /dev/null +++ b/src/Identity/Extension/Extension.php @@ -0,0 +1,38 @@ +type = $type; + + Validation::notNull($type, 'content'); + $this->content = $content; + } + + /** + * @return stdClass + */ + public function jsonSerialize(): stdClass + { + return (object)[ + 'type' => $this->type, + 'content' => $this->content, + ]; + } +} diff --git a/src/Identity/Extension/ExtensionBuilderInterface.php b/src/Identity/Extension/ExtensionBuilderInterface.php new file mode 100644 index 00000000..1ab39bd8 --- /dev/null +++ b/src/Identity/Extension/ExtensionBuilderInterface.php @@ -0,0 +1,8 @@ +latitude = $latitude; + + Validation::withinRange($longitude, -180, 180, 'longitude'); + $this->longitude = $longitude; + + Validation::notLessThan($radius, 0, 'radius'); + $this->radius = $radius; + + Validation::notLessThan($maxUncertainty, 0, 'maxUncertainty'); + $this->maxUncertainty = $maxUncertainty; + } + + /** + * @inheritDoc + * + * @return stdClass + */ + public function jsonSerialize(): stdClass + { + return (object)[ + 'expected_device_location' => [ + 'latitude' => $this->latitude, + 'longitude' => $this->longitude, + 'radius' => $this->radius, + 'max_uncertainty_radius' => $this->maxUncertainty, + ] + ]; + } +} diff --git a/src/Identity/Extension/LocationConstraintExtensionBuilder.php b/src/Identity/Extension/LocationConstraintExtensionBuilder.php new file mode 100644 index 00000000..556cd19d --- /dev/null +++ b/src/Identity/Extension/LocationConstraintExtensionBuilder.php @@ -0,0 +1,82 @@ +latitude = $latitude; + return $this; + } + + /** + * Allows you to specify the Longitude of the user's expected location + */ + public function withLongitude(float $longitude): self + { + $this->longitude = $longitude; + return $this; + } + + /** + * Radius of the circle, centred on the specified location coordinates, where the device is + * allowed to perform the share. + * + * If not provided, a default value of 150m will be used. + * + * @param float $radius + * The allowable distance, in metres, from the given lat/long location + */ + public function withRadius(float $radius): self + { + $this->radius = $radius; + return $this; + } + + /** + * Maximum acceptable distance, in metres, of the area of uncertainty associated with the device + * location coordinates. + * + * If not provided, a default value of 150m will be used. + * + * @param float $maxUncertainty + * Maximum allowed measurement uncertainty, in metres + * + * @return $this + */ + public function withMaxUncertainty(float $maxUncertainty): self + { + $this->maxUncertainty = $maxUncertainty; + + return $this; + } + + public function build(): Extension + { + $content = new LocationConstraintContent( + $this->latitude, + $this->longitude, + $this->radius, + $this->maxUncertainty + ); + + return new Extension(self::LOCATION_CONSTRAINT, $content); + } +} diff --git a/src/Identity/Extension/ThirdPartyAttributeContent.php b/src/Identity/Extension/ThirdPartyAttributeContent.php new file mode 100644 index 00000000..0eeec95a --- /dev/null +++ b/src/Identity/Extension/ThirdPartyAttributeContent.php @@ -0,0 +1,38 @@ +expiryDate = $expiryDate; + + Validation::isArrayOfType($definitions, [AttributeDefinition::class], 'definitions'); + $this->definitions = $definitions; + } + + public function jsonSerialize(): stdClass + { + return (object)[ + 'expiry_date' => $this->expiryDate + ->setTimezone(new \DateTimeZone('UTC')) + ->format(\DateTime::RFC3339_EXTENDED), + 'definitions' => $this->definitions, + ]; + } +} diff --git a/src/Identity/Extension/ThirdPartyAttributeExtensionBuilder.php b/src/Identity/Extension/ThirdPartyAttributeExtensionBuilder.php new file mode 100644 index 00000000..132fa720 --- /dev/null +++ b/src/Identity/Extension/ThirdPartyAttributeExtensionBuilder.php @@ -0,0 +1,66 @@ +expiryDate = $expiryDate; + + return $this; + } + + public function withDefinition(string $definition): self + { + $this->definitions[] = new AttributeDefinition($definition); + + return $this; + } + + /** + * @param string[] $definitions + */ + public function withDefinitions(array $definitions): self + { + Validation::isArrayOfStrings($definitions, 'definitions'); + $this->definitions = array_map( + function ($definition): AttributeDefinition { + return new AttributeDefinition($definition); + }, + $definitions + ); + + return $this; + } + + public function build(): Extension + { + return new Extension( + self::THIRD_PARTY_ATTRIBUTE, + new ThirdPartyAttributeContent( + $this->expiryDate, + $this->definitions + ) + ); + } +} diff --git a/src/Identity/Extension/TransactionalFlowExtensionBuilder.php b/src/Identity/Extension/TransactionalFlowExtensionBuilder.php new file mode 100644 index 00000000..22eb5821 --- /dev/null +++ b/src/Identity/Extension/TransactionalFlowExtensionBuilder.php @@ -0,0 +1,35 @@ +content = $content; + + return $this; + } + + /** + * @return Extension with TRANSACTIONAL_FLOW type + */ + public function build(): Extension + { + return new Extension(static::TYPE, $this->content); + } +} diff --git a/src/Identity/Policy/Policy.php b/src/Identity/Policy/Policy.php new file mode 100644 index 00000000..62ade060 --- /dev/null +++ b/src/Identity/Policy/Policy.php @@ -0,0 +1,75 @@ +wantedAttributes = $wantedAttributes; + + Validation::isArrayOfIntegers($wantedAuthTypes, 'wantedAuthTypes'); + $this->wantedAuthTypes = $wantedAuthTypes; + + $this->wantedRememberMe = $wantedRememberMe; + $this->wantedRememberMeOptional = $wantedRememberMeOptional; + $this->identityProfileRequirements = $identityProfileRequirements; + } + + + public function jsonSerialize(): stdClass + { + return (object)[ + 'wanted' => $this->wantedAttributes, + 'wanted_auth_types' => $this->wantedAuthTypes, + 'wanted_remember_me' => $this->wantedRememberMe, + 'wanted_remember_me_optional' => $this->wantedRememberMeOptional, + 'identity_profile_requirements' => $this->identityProfileRequirements, + ]; + } + + /** + * IdentityProfileRequirements requested in the policy + * + * @return object|null + */ + public function getIdentityProfileRequirements() + { + return $this->identityProfileRequirements; + } +} diff --git a/src/Identity/Policy/PolicyBuilder.php b/src/Identity/Policy/PolicyBuilder.php new file mode 100644 index 00000000..e8a8b190 --- /dev/null +++ b/src/Identity/Policy/PolicyBuilder.php @@ -0,0 +1,332 @@ +getName(); + + if (null !== $wantedAttribute->getDerivation()) { + $key = $wantedAttribute->getDerivation(); + } + + if (null !== $wantedAttribute->getConstraints()) { + $key .= '-' . hash('sha256', Json::encode($wantedAttribute->getConstraints())); + } + + $this->wantedAttributes[$key] = $wantedAttribute; + + return $this; + } + + /** + * @param Constraint[]|null $constraints + */ + public function withWantedAttributeByName( + string $name, + array $constraints = null, + bool $acceptSelfAsserted = null + ): self { + $wantedAttributeBuilder = (new WantedAttributeBuilder()) + ->withName($name); + + if ($constraints !== null) { + $wantedAttributeBuilder->withConstraints($constraints); + } + + if ($acceptSelfAsserted !== null) { + $wantedAttributeBuilder->withAcceptSelfAsserted($acceptSelfAsserted); + } + + return $this->withWantedAttribute($wantedAttributeBuilder->build()); + } + + /** + * @param Constraint[]|null $constraints + */ + public function withFamilyName(array $constraints = null, bool $acceptSelfAsserted = null): self + { + return $this->withWantedAttributeByName( + UserProfile::ATTR_FAMILY_NAME, + $constraints, + $acceptSelfAsserted + ); + } + + /** + * @param Constraint[]|null $constraints + */ + public function withGivenNames(array $constraints = null, bool $acceptSelfAsserted = null): self + { + return $this->withWantedAttributeByName( + UserProfile::ATTR_GIVEN_NAMES, + $constraints, + $acceptSelfAsserted + ); + } + + /** + * @param Constraint[]|null $constraints + */ + public function withFullName(array $constraints = null, bool $acceptSelfAsserted = null): self + { + return $this->withWantedAttributeByName( + UserProfile::ATTR_FULL_NAME, + $constraints, + $acceptSelfAsserted + ); + } + + /** + * @param Constraint[]|null $constraints + */ + public function withDateOfBirth(array $constraints = null, bool $acceptSelfAsserted = null): self + { + return $this->withWantedAttributeByName( + UserProfile::ATTR_DATE_OF_BIRTH, + $constraints, + $acceptSelfAsserted + ); + } + + /** + * @param Constraint[]|null $constraints + */ + public function withAgeOver(int $age, array $constraints = null, bool $acceptSelfAsserted = null): self + { + return $this->withAgeDerivedAttribute( + UserProfile::AGE_OVER . $age, + $constraints, + $acceptSelfAsserted + ); + } + + /** + * @param Constraint[]|null $constraints + */ + public function withAgeUnder(int $age, array $constraints = null, bool $acceptSelfAsserted = null): self + { + return $this->withAgeDerivedAttribute( + UserProfile::AGE_UNDER . $age, + $constraints, + $acceptSelfAsserted + ); + } + + /** + * @param Constraint[]|null $constraints + */ + public function withAgeDerivedAttribute( + string $derivation, + array $constraints = null, + bool $acceptSelfAsserted = null + ): self { + $wantedAttributeBuilder = (new WantedAttributeBuilder()) + ->withName(UserProfile::ATTR_DATE_OF_BIRTH) + ->withDerivation($derivation); + + if ($constraints !== null) { + $wantedAttributeBuilder->withConstraints($constraints); + } + + if ($acceptSelfAsserted !== null) { + $wantedAttributeBuilder->withAcceptSelfAsserted($acceptSelfAsserted); + } + + return $this->withWantedAttribute($wantedAttributeBuilder->build()); + } + + /** + * @param Constraint[]|null $constraints + */ + public function withGender(array $constraints = null, bool $acceptSelfAsserted = null): self + { + return $this->withWantedAttributeByName( + UserProfile::ATTR_GENDER, + $constraints, + $acceptSelfAsserted + ); + } + + /** + * @param Constraint[]|null $constraints + */ + public function withPostalAddress(array $constraints = null, bool $acceptSelfAsserted = null): self + { + return $this->withWantedAttributeByName( + UserProfile::ATTR_POSTAL_ADDRESS, + $constraints, + $acceptSelfAsserted + ); + } + + /** + * @param Constraint[]|null $constraints + */ + public function withStructuredPostalAddress(array $constraints = null, bool $acceptSelfAsserted = null): self + { + return $this->withWantedAttributeByName( + UserProfile::ATTR_STRUCTURED_POSTAL_ADDRESS, + $constraints, + $acceptSelfAsserted + ); + } + + /** + * @param Constraint[]|null $constraints + */ + public function withNationality(array $constraints = null, bool $acceptSelfAsserted = null): self + { + return $this->withWantedAttributeByName( + UserProfile::ATTR_NATIONALITY, + $constraints, + $acceptSelfAsserted + ); + } + + /** + * @param Constraint[]|null $constraints + */ + public function withPhoneNumber(array $constraints = null, bool $acceptSelfAsserted = null): self + { + return $this->withWantedAttributeByName( + UserProfile::ATTR_PHONE_NUMBER, + $constraints, + $acceptSelfAsserted + ); + } + + /** + * @param Constraint[]|null $constraints + */ + public function withSelfie(array $constraints = null, bool $acceptSelfAsserted = null): self + { + return $this->withWantedAttributeByName( + UserProfile::ATTR_SELFIE, + $constraints, + $acceptSelfAsserted + ); + } + + /** + * @param Constraint[]|null $constraints + */ + public function withDocumentDetails(array $constraints = null, bool $acceptSelfAsserted = null): self + { + return $this->withWantedAttributeByName( + UserProfile::ATTR_DOCUMENT_DETAILS, + $constraints, + $acceptSelfAsserted + ); + } + + /** + * @param Constraint[]|null $constraints + */ + public function withDocumentImages(array $constraints = null, bool $acceptSelfAsserted = null): self + { + return $this->withWantedAttributeByName( + UserProfile::ATTR_DOCUMENT_IMAGES, + $constraints, + $acceptSelfAsserted + ); + } + + /** + * @param Constraint[]|null $constraints + */ + public function withEmail(array $constraints = null, bool $acceptSelfAsserted = null): self + { + return $this->withWantedAttributeByName( + UserProfile::ATTR_EMAIL_ADDRESS, + $constraints, + $acceptSelfAsserted + ); + } + + + public function withSelfieAuthentication(bool $enabled = true): self + { + return $this->withWantedAuthType(self::SELFIE_AUTH_TYPE, $enabled); + } + + + public function withPinAuthentication(bool $enabled = true): self + { + return $this->withWantedAuthType(self::PIN_AUTH_TYPE, $enabled); + } + + public function withWantedAuthType(int $wantedAuthType, bool $enabled = true): self + { + if ($enabled) { + $this->wantedAuthTypes[$wantedAuthType] = $wantedAuthType; + } else { + unset($this->wantedAuthTypes[$wantedAuthType]); + } + + return $this; + } + + + public function withWantedRememberMe(bool $wantedRememberMe): self + { + $this->wantedRememberMe = $wantedRememberMe; + return $this; + } + + public function withWantedRememberMeOptional(bool $wantedRememberMeOptional): self + { + $this->wantedRememberMeOptional = $wantedRememberMeOptional; + return $this; + } + + /** + * Use an Identity Profile Requirement object for the share + * + * @param object $identityProfileRequirements + * @return $this + */ + public function withIdentityProfileRequirements($identityProfileRequirements): self + { + $this->identityProfileRequirements = $identityProfileRequirements; + return $this; + } + + + public function build(): Policy + { + return new Policy( + array_values($this->wantedAttributes), + array_values($this->wantedAuthTypes), + $this->wantedRememberMe, + $this->wantedRememberMeOptional, + $this->identityProfileRequirements + ); + } +} diff --git a/src/Identity/Policy/WantedAnchor.php b/src/Identity/Policy/WantedAnchor.php new file mode 100644 index 00000000..1714ca8a --- /dev/null +++ b/src/Identity/Policy/WantedAnchor.php @@ -0,0 +1,29 @@ +value = $value; + $this->subType = $subType; + } + + public function jsonSerialize(): stdClass + { + return (object)[ + 'name' => $this->value, + 'sub_type' => $this->subType, + ]; + } +} diff --git a/src/Identity/Policy/WantedAnchorBuilder.php b/src/Identity/Policy/WantedAnchorBuilder.php new file mode 100644 index 00000000..9625445f --- /dev/null +++ b/src/Identity/Policy/WantedAnchorBuilder.php @@ -0,0 +1,32 @@ +value = $value; + return $this; + } + + public function withSubType(string $subType): self + { + $this->subType = $subType; + return $this; + } + + public function build(): WantedAnchor + { + Validation::notNull($this->value, 'value'); + Validation::notNull($this->subType, 'sub_type'); + + return new WantedAnchor($this->value, $this->subType); + } +} diff --git a/src/Identity/Policy/WantedAttribute.php b/src/Identity/Policy/WantedAttribute.php new file mode 100644 index 00000000..dc34da79 --- /dev/null +++ b/src/Identity/Policy/WantedAttribute.php @@ -0,0 +1,123 @@ +name = $name; + + $this->derivation = $derivation; + $this->optional = $optional; + $this->acceptSelfAsserted = $acceptSelfAsserted; + + if (null !== $constraints) { + Validation::isArrayOfType($constraints, [Constraint::class], 'constraints'); + $this->constraints = $constraints; + } + } + + /** + * Name identifying the WantedAttribute + * + * @return string + */ + public function getName(): string + { + return $this->name; + } + + /** + * Additional derived criteria. + * + * @return string + */ + public function getDerivation(): ?string + { + return $this->derivation; + } + + /** + * List of constraints to add to an attribute. + * + * If you do not provide any particular constraints, Yoti will provide you with the + * information from the most recently added source. + * + * @return Constraint[] $constraints + */ + public function getConstraints(): ?array + { + return $this->constraints; + } + + /** + * Accept self asserted attributes. + * + * These are attributes that have been self-declared, and not verified by Yoti. + * + * @return bool|null + */ + public function getAcceptSelfAsserted(): ?bool + { + return $this->acceptSelfAsserted; + } + + /** + * @return bool + */ + public function getOptional(): bool + { + return $this->optional; + } + + public function jsonSerialize(): stdClass + { + $data = new stdClass(); + $data->name = $this->getName(); + $data->optional = $this->getOptional(); + + if (null !== $this->getDerivation()) { + $data->derivation = $this->getDerivation(); + } + + if (null !== $this->getConstraints()) { + $data->constraints = $this->getConstraints(); + } + + if (null !== $this->getAcceptSelfAsserted()) { + $data->accept_self_asserted = $this->getAcceptSelfAsserted(); + } + + return $data; + } +} diff --git a/src/Identity/Policy/WantedAttributeBuilder.php b/src/Identity/Policy/WantedAttributeBuilder.php new file mode 100644 index 00000000..c2a53f1f --- /dev/null +++ b/src/Identity/Policy/WantedAttributeBuilder.php @@ -0,0 +1,77 @@ +name = $name; + + return $this; + } + + public function withDerivation(string $derivation): self + { + $this->derivation = $derivation; + + return $this; + } + + public function withOptional(bool $optional): self + { + $this->optional = $optional; + + return $this; + } + + public function withAcceptSelfAsserted(bool $acceptSelfAsserted): self + { + $this->acceptSelfAsserted = $acceptSelfAsserted; + + return $this; + } + + /** + * @param Constraint[] $constraints + */ + public function withConstraints(array $constraints): self + { + $this->constraints = $constraints; + + return $this; + } + + public function withConstraint(Constraint $constraint): self + { + $this->constraints[] = $constraint; + + return $this; + } + + public function build(): WantedAttribute + { + return new WantedAttribute( + $this->name, + $this->derivation, + $this->optional, + $this->acceptSelfAsserted, + $this->constraints, + ); + } +} diff --git a/src/Identity/ShareSessionCreated.php b/src/Identity/ShareSessionCreated.php new file mode 100644 index 00000000..4bb0f924 --- /dev/null +++ b/src/Identity/ShareSessionCreated.php @@ -0,0 +1,71 @@ +id = $sessionData['id']; + } + + if (isset($sessionData['status'])) { + Validation::isString($sessionData['status'], 'status'); + $this->status = $sessionData['status']; + } + + if (isset($sessionData['expiry'])) { + Validation::isString($sessionData['expiry'], 'expiry'); + $this->expiry = $sessionData['expiry']; + } + } + + /** + * @return string + */ + public function getId(): string + { + return $this->id; + } + + /** + * @return string + */ + public function getStatus(): string + { + return $this->status; + } + + /** + * @return string + */ + public function getExpiry(): string + { + return $this->expiry; + } + + public function jsonSerialize(): object + { + return (object)[ + 'id' => $this->getId(), + 'status' => $this->getStatus(), + 'expiry' => $this->getExpiry(), + ]; + } +} diff --git a/src/Identity/ShareSessionCreatedQrCode.php b/src/Identity/ShareSessionCreatedQrCode.php new file mode 100644 index 00000000..901074b0 --- /dev/null +++ b/src/Identity/ShareSessionCreatedQrCode.php @@ -0,0 +1,48 @@ +id = $sessionData['id']; + } + + if (isset($sessionData['uri'])) { + $this->uri = $sessionData['uri']; + } + } + + public function jsonSerialize(): object + { + return (object)[ + 'id' => $this->id, + 'uri' => $this->uri + ]; + } + + /** + * @return string + */ + public function getId(): string + { + return $this->id; + } + + /** + * @return string + */ + public function getUri(): string + { + return $this->uri; + } +} diff --git a/src/Identity/ShareSessionFetched.php b/src/Identity/ShareSessionFetched.php new file mode 100644 index 00000000..ac171a2f --- /dev/null +++ b/src/Identity/ShareSessionFetched.php @@ -0,0 +1,117 @@ + $sessionData + */ + public function __construct(array $sessionData) + { + if (isset($sessionData['id'])) { + $this->id = $sessionData['id']; + } + if (isset($sessionData['status'])) { + $this->status = $sessionData['status']; + } + if (isset($sessionData['expiry'])) { + $this->expiry = $sessionData['expiry']; + } + if (isset($sessionData['created'])) { + $this->created = $sessionData['created']; + } + if (isset($sessionData['updated'])) { + $this->updated = $sessionData['updated']; + } + if (isset($sessionData['qrCode'])) { + $this->qrCodeId = $sessionData['qrCode']['id']; + } + if (isset($sessionData['receipt'])) { + $this->receiptId = $sessionData['receipt']['id']; + } + } + + public function jsonSerialize(): object + { + return (object)[ + 'id' => $this->id, + 'status' => $this->status, + 'expiry' => $this->expiry, + 'created' => $this->created, + 'updated' => $this->updated, + 'qrCodeId' => $this->qrCodeId, + 'receiptId' => $this->receiptId, + ]; + } + + /** + * @return string + */ + public function getId(): string + { + return $this->id; + } + + /** + * @return string + */ + public function getStatus(): string + { + return $this->status; + } + + /** + * @return string + */ + public function getCreated(): string + { + return $this->created; + } + + /** + * @return string + */ + public function getUpdated(): string + { + return $this->updated; + } + + /** + * @return string + */ + public function getExpiry(): string + { + return $this->expiry; + } + + /** + * @return string + */ + public function getQrCodeId(): string + { + return $this->qrCodeId; + } + + /** + * @return string + */ + public function getReceiptId(): string + { + return $this->receiptId; + } +} diff --git a/src/Identity/ShareSessionFetchedQrCode.php b/src/Identity/ShareSessionFetchedQrCode.php new file mode 100644 index 00000000..1f8aaabf --- /dev/null +++ b/src/Identity/ShareSessionFetchedQrCode.php @@ -0,0 +1,110 @@ + $sessionData + */ + public function __construct(array $sessionData) + { + if (isset($sessionData['id'])) { + $this->id = $sessionData['id']; + } + if (isset($sessionData['expiry'])) { + $this->expiry = $sessionData['expiry']; + } + if (isset($sessionData['policy'])) { + $this->policy = $sessionData['policy']; + } + if (isset($sessionData['extensions'])) { + foreach ($sessionData['extensions'] as $extension) { + $this->extensions[] = new Extension($extension['type'], $extension['content']); + } + } + if (isset($sessionData['session'])) { + $this->session = new ShareSessionCreated($sessionData['session']); + } + if (isset($sessionData['redirectUri'])) { + $this->redirectUri = $sessionData['redirectUri']; + } + } + + public function jsonSerialize(): object + { + return (object)[ + 'id' => $this->id, + 'expiry' => $this->expiry, + 'policy' => $this->policy, + 'extensions' => $this->extensions, + 'session' => $this->session, + 'redirectUri' => $this->redirectUri, + ]; + } + + /** + * @return string + */ + public function getId(): string + { + return $this->id; + } + + /** + * @return string + */ + public function getExpiry(): string + { + return $this->expiry; + } + + /** + * @return string + */ + public function getPolicy(): string + { + return $this->policy; + } + + /** + * @return Extension[] + */ + public function getExtensions(): array + { + return $this->extensions; + } + + /** + * @return ShareSessionCreated + */ + public function getSession(): ShareSessionCreated + { + return $this->session; + } + + /** + * @return string + */ + public function getRedirectUri(): string + { + return $this->redirectUri; + } +} diff --git a/src/Identity/ShareSessionNotification.php b/src/Identity/ShareSessionNotification.php new file mode 100644 index 00000000..5a6fc24f --- /dev/null +++ b/src/Identity/ShareSessionNotification.php @@ -0,0 +1,70 @@ + + */ + private array $headers; + + /** + * @param string[] $headers + */ + public function __construct(string $url, string $method, bool $verifyTls, array $headers) + { + $this->url = $url; + $this->method = $method; + $this->verifyTls = $verifyTls; + $this->headers = $headers; + } + + public function jsonSerialize(): object + { + return (object)[ + 'url' => $this->getUrl(), + 'method' => $this->getMethod(), + 'verifyTls' => $this->isVerifyTls(), + 'headers' => $this->getHeaders(), + ]; + } + + /** + * @return string + */ + public function getUrl(): string + { + return $this->url; + } + + /** + * @return string + */ + public function getMethod(): string + { + return $this->method; + } + + /** + * @return bool + */ + public function isVerifyTls(): bool + { + return $this->verifyTls; + } + + /** + * @return string[] + */ + public function getHeaders(): array + { + return $this->headers; + } +} diff --git a/src/Identity/ShareSessionNotificationBuilder.php b/src/Identity/ShareSessionNotificationBuilder.php new file mode 100644 index 00000000..39d7aba3 --- /dev/null +++ b/src/Identity/ShareSessionNotificationBuilder.php @@ -0,0 +1,65 @@ + + */ + private array $headers; + + public function withUrl(string $url): self + { + $this->url = $url; + + return $this; + } + + public function withMethod(string $method = 'POST'): self + { + $this->method = $method; + + return $this; + } + + public function withVerifyTls(bool $verifyTls = true): self + { + $this->verifyTls = $verifyTls; + + return $this; + } + + /** + * @param string[] $headers + */ + public function withHeaders(array $headers): self + { + $this->headers = $headers; + + return $this; + } + + public function withHeader(string $key, string $header): self + { + $this->headers[$key] = $header; + + return $this; + } + + public function build(): ShareSessionNotification + { + return new ShareSessionNotification( + $this->url, + $this->method, + $this->verifyTls, + $this->headers + ); + } +} diff --git a/src/Identity/ShareSessionRequest.php b/src/Identity/ShareSessionRequest.php new file mode 100644 index 00000000..94e9cadb --- /dev/null +++ b/src/Identity/ShareSessionRequest.php @@ -0,0 +1,110 @@ +|null + */ + private ?array $subject; + + private Policy $policy; + + /** + * @var Extension[]|null + */ + private ?array $extensions = null; + + private string $redirectUri; + + private ?ShareSessionNotification $notification; + + /** + * @param array|null $subject + * @param Policy $policy + * @param Extension[]|null $extensions + * @param string $redirectUri + * @param ShareSessionNotification|null $notification + */ + public function __construct( + Policy $policy, + string $redirectUri, + ?array $extensions = null, + ?array $subject = null, + ?ShareSessionNotification $notification = null + ) { + $this->policy = $policy; + $this->redirectUri = $redirectUri; + + if (null !== $extensions) { + Validation::isArrayOfType($extensions, [Extension::class], 'extensions'); + $this->extensions = $extensions; + } + + $this->subject = $subject; + $this->notification = $notification; + } + + /** + * @return array|null + */ + public function getSubject(): ?array + { + return $this->subject; + } + + /** + * @return Policy + */ + public function getPolicy(): Policy + { + return $this->policy; + } + + /** + * @return Extension[]|null + */ + public function getExtensions(): ?array + { + return $this->extensions; + } + + /** + * @return string + */ + public function getRedirectUri(): string + { + return $this->redirectUri; + } + + /** + * @return ShareSessionNotification|null + */ + public function getNotification(): ?ShareSessionNotification + { + return $this->notification; + } + + public function jsonSerialize(): \stdClass + { + $data = new \stdClass(); + $data->policy = $this->getPolicy(); + $data->redirectUri = $this->getRedirectUri(); + if (null !== $this->getSubject()) { + $data->subject = $this->getSubject(); + } + if (null !== $this->getExtensions()) { + $data->extensions = $this->getExtensions(); + } + if (null !== $this->getNotification()) { + $data->notification = $this->getNotification(); + } + + return $data; + } +} diff --git a/src/Identity/ShareSessionRequestBuilder.php b/src/Identity/ShareSessionRequestBuilder.php new file mode 100644 index 00000000..583d06fe --- /dev/null +++ b/src/Identity/ShareSessionRequestBuilder.php @@ -0,0 +1,84 @@ + + */ + private ?array $subject = null; + + private Policy $policy; + + /** + * @var Extension[] + */ + private ?array $extensions = null; + + private string $redirectUri; + + private ?ShareSessionNotification $notification = null; + + /** + * @param array $subject + */ + public function withSubject(array $subject): self + { + $this->subject = $subject; + + return $this; + } + + public function withPolicy(Policy $policy): self + { + $this->policy = $policy; + + return $this; + } + + /** + * @param Extension[] $extensions + */ + public function withExtensions(array $extensions): self + { + $this->extensions = $extensions; + + return $this; + } + + public function withExtension(Extension $extension): self + { + $this->extensions[] = $extension; + + return $this; + } + + public function withRedirectUri(string $redirectUri): self + { + $this->redirectUri = $redirectUri; + + return $this; + } + + public function withNotification(ShareSessionNotification $notification): ShareSessionRequestBuilder + { + $this->notification = $notification; + + return $this; + } + + public function build(): ShareSessionRequest + { + return new ShareSessionRequest( + $this->policy, + $this->redirectUri, + $this->extensions, + $this->subject, + $this->notification + ); + } +} diff --git a/tests/Identity/Constraint/PreferredSourcesTest.php b/tests/Identity/Constraint/PreferredSourcesTest.php new file mode 100644 index 00000000..8b5b4ff1 --- /dev/null +++ b/tests/Identity/Constraint/PreferredSourcesTest.php @@ -0,0 +1,42 @@ + $wantedAnchors, + 'soft_preference' => true + ]; + + $this->assertInstanceOf(PreferredSources::class, $preferredSource); + $this->assertEquals(json_encode($expected), json_encode($preferredSource)); + $this->assertEquals($wantedAnchors, $preferredSource->getWantedAnchors()); + $this->assertTrue($preferredSource->isSoftPreference()); + } +} diff --git a/tests/Identity/Constraint/SourceConstraintsBuilderTest.php b/tests/Identity/Constraint/SourceConstraintsBuilderTest.php new file mode 100644 index 00000000..ac6423c6 --- /dev/null +++ b/tests/Identity/Constraint/SourceConstraintsBuilderTest.php @@ -0,0 +1,66 @@ +withWantedAnchor(new WantedAnchor('SOME_VALUE')) + ->withSoftPreference(true) + ->build(); + + $this->assertInstanceOf(SourceConstraint::class, $sourceConstraint); + $this->assertInstanceOf(PreferredSources::class, $sourceConstraint->getPreferredSources()); + $this->assertEquals('SOURCE', $sourceConstraint->getType()); + } + + /** + * @covers ::build + * @covers ::withWantedAnchors + * @covers \Yoti\Identity\Constraint\SourceConstraint::__construct + * @covers \Yoti\Identity\Constraint\SourceConstraint::jsonSerialize + */ + public function testShouldBuildCorrectlyWithMultipleAnchors() + { + $wantedAnchors = [ + new WantedAnchor('some'), + new WantedAnchor('some_2'), + ]; + + $sourceConstraint = (new SourceConstraintBuilder()) + ->withWantedAnchors($wantedAnchors) + ->build(); + + $expectedConstraint = [ + 'type' => 'SOURCE', + 'preferred_sources' => $sourceConstraint->getPreferredSources() + ]; + + $this->assertEquals($wantedAnchors, $sourceConstraint->getPreferredSources()->getWantedAnchors()); + $this->assertEquals( + json_encode($wantedAnchors), + json_encode($sourceConstraint->getPreferredSources()->getWantedAnchors()) + ); + $this->assertEquals(json_encode($expectedConstraint), json_encode($sourceConstraint)); + } +} diff --git a/tests/Identity/Extension/BasicExtensionBuilderTest.php b/tests/Identity/Extension/BasicExtensionBuilderTest.php new file mode 100644 index 00000000..026a045f --- /dev/null +++ b/tests/Identity/Extension/BasicExtensionBuilderTest.php @@ -0,0 +1,40 @@ +withType($someType) + ->withContent($someContent) + ->build(); + + $expectedJson = json_encode([ + 'type' => $someType, + 'content' => $someContent, + ]); + + $this->assertEquals($expectedJson, json_encode($constraints)); + } +} diff --git a/tests/Identity/Extension/LocationConstraintContentTest.php b/tests/Identity/Extension/LocationConstraintContentTest.php new file mode 100644 index 00000000..a0973db1 --- /dev/null +++ b/tests/Identity/Extension/LocationConstraintContentTest.php @@ -0,0 +1,44 @@ + [ + 'latitude' => $expectedLatitude, + 'longitude' => $expectedLongitude, + 'radius' => $expectedRadius, + 'max_uncertainty_radius' => $expectedMaxUncertainty, + ], + ]); + + $this->assertEquals($expectedJson, json_encode($content)); + } +} diff --git a/tests/Identity/Extension/LocationConstraintExtensionBuilderTest.php b/tests/Identity/Extension/LocationConstraintExtensionBuilderTest.php new file mode 100644 index 00000000..875b8bb7 --- /dev/null +++ b/tests/Identity/Extension/LocationConstraintExtensionBuilderTest.php @@ -0,0 +1,164 @@ +expectException(\RangeException::class); + $this->expectExceptionMessage('\'latitude\' value \'-91\' is less than \'-90\''); + + (new LocationConstraintExtensionBuilder()) + ->withLatitude(-91) + ->withLongitude(0) + ->build(); + } + + /** + * @covers ::withLatitude + */ + public function testLatitudeTooHigh() + { + $this->expectException(\RangeException::class); + $this->expectExceptionMessage('\'latitude\' value \'91\' is greater than \'90\''); + + (new LocationConstraintExtensionBuilder()) + ->withLatitude(91) + ->withLongitude(0) + ->build(); + } + + /** + * @covers ::withLongitude + */ + public function testLongitudeTooLow() + { + $this->expectException(\RangeException::class); + $this->expectExceptionMessage('\'longitude\' value \'-181\' is less than \'-180\''); + + (new LocationConstraintExtensionBuilder()) + ->withLatitude(0) + ->withLongitude(-181) + ->build(); + } + + /** + * @covers ::withLongitude + */ + public function testLongitudeTooHigh() + { + $this->expectException(\RangeException::class); + $this->expectExceptionMessage('\'longitude\' value \'181\' is greater than \'180\''); + + (new LocationConstraintExtensionBuilder()) + ->withLatitude(0) + ->withLongitude(181) + ->build(); + } + + /** + * @covers ::withRadius + */ + public function testRadiusLessThanZero() + { + $this->expectException(\RangeException::class); + $this->expectExceptionMessage('\'radius\' value \'-1\' is less than \'0\''); + + (new LocationConstraintExtensionBuilder()) + ->withLatitude(0) + ->withLongitude(0) + ->withRadius(-1) + ->build(); + } + + /** + * @covers ::withMaxUncertainty + */ + public function testMaxUncertaintyLessThanZero() + { + $this->expectException(\RangeException::class); + $this->expectExceptionMessage('\'maxUncertainty\' value \'-1\' is less than \'0\''); + + (new LocationConstraintExtensionBuilder()) + ->withLatitude(0) + ->withLongitude(0) + ->withMaxUncertainty(-1) + ->build(); + } + + /** + * @covers ::build + */ + public function testBuild() + { + $expectedLatitude = 50.8169; + $expectedLongitude = -0.1367; + $expectedRadius = 30; + $expectedMaxUncertainty = 40; + + $extension = (new LocationConstraintExtensionBuilder()) + ->withLatitude($expectedLatitude) + ->withLongitude($expectedLongitude) + ->withRadius($expectedRadius) + ->withMaxUncertainty($expectedMaxUncertainty) + ->build(); + + $expectedJson = json_encode([ + 'type' => self::TYPE_LOCATION_CONSTRAINT, + 'content' => [ + 'expected_device_location' => [ + 'latitude' => $expectedLatitude, + 'longitude' => $expectedLongitude, + 'radius' => $expectedRadius, + 'max_uncertainty_radius' => $expectedMaxUncertainty, + ], + ], + ]); + + $this->assertEquals($expectedJson, json_encode($extension)); + } + + /** + * @covers ::build + */ + public function testBuildDefaultValues() + { + $expectedLatitude = 50.8169; + $expectedLongitude = -0.1367; + $expectedDefaultRadius = 150; + $expectedDefaultMaxUncertainty = 150; + + $extension = (new LocationConstraintExtensionBuilder()) + ->withLatitude($expectedLatitude) + ->withLongitude($expectedLongitude) + ->build(); + + $expectedJson = json_encode([ + 'type' => self::TYPE_LOCATION_CONSTRAINT, + 'content' => [ + 'expected_device_location' => [ + 'latitude' => $expectedLatitude, + 'longitude' => $expectedLongitude, + 'radius' => $expectedDefaultRadius, + 'max_uncertainty_radius' => $expectedDefaultMaxUncertainty, + ], + ], + ]); + + $this->assertEquals($expectedJson, json_encode($extension)); + } +} diff --git a/tests/Identity/Extension/ThirdPartyAttributeContentTest.php b/tests/Identity/Extension/ThirdPartyAttributeContentTest.php new file mode 100644 index 00000000..4fe6b729 --- /dev/null +++ b/tests/Identity/Extension/ThirdPartyAttributeContentTest.php @@ -0,0 +1,42 @@ + '2019-12-02T12:00:00.123+00:00', + 'definitions' => [ + [ + 'name' => $someDefinition, + ], + ], + ]); + + $this->assertEquals($expectedJson, json_encode($thirdPartyAttributeContent)); + } +} diff --git a/tests/Identity/Extension/ThirdPartyAttributeExtensionBuilderTest.php b/tests/Identity/Extension/ThirdPartyAttributeExtensionBuilderTest.php new file mode 100644 index 00000000..43252040 --- /dev/null +++ b/tests/Identity/Extension/ThirdPartyAttributeExtensionBuilderTest.php @@ -0,0 +1,132 @@ +someDate = new \DateTime(self::SOME_DATE_STRING); + } + + /** + * @covers ::withExpiryDate + * @covers ::withDefinition + * @covers ::build + */ + public function testBuild() + { + $thirdPartyAttributeExtension = (new ThirdPartyAttributeExtensionBuilder()) + ->withExpiryDate($this->someDate) + ->withDefinition(self::SOME_DEFINITION) + ->withDefinition(self::SOME_OTHER_DEFINITION) + ->build(); + + $expectedJson = $this->createExpectedJson( + $this->someDate->format(\DateTime::RFC3339_EXTENDED), + [ + self::SOME_DEFINITION, + self::SOME_OTHER_DEFINITION, + ] + ); + + $this->assertJsonStringEqualsJsonString( + $expectedJson, + json_encode($thirdPartyAttributeExtension) + ); + } + + /** + * @covers ::withDefinitions + */ + public function testWithDefinitionsOverwritesExistingDefinitions() + { + $thirdPartyAttributeExtension = (new ThirdPartyAttributeExtensionBuilder()) + ->withExpiryDate($this->someDate) + ->withDefinition('initial definition') + ->withDefinitions([ + self::SOME_DEFINITION, + self::SOME_OTHER_DEFINITION, + ]) + ->build(); + + $this->assertJsonStringEqualsJsonString( + $this->createExpectedJson( + $this->someDate->format(\DateTime::RFC3339_EXTENDED), + [ + self::SOME_DEFINITION, + self::SOME_OTHER_DEFINITION, + ] + ), + json_encode($thirdPartyAttributeExtension) + ); + } + + /** + * @covers ::withExpiryDate + * + * @dataProvider expiryDateDataProvider + */ + public function testWithExpiryDateFormat($inputDate, $outputDate) + { + $thirdPartyAttributeExtension = (new ThirdPartyAttributeExtensionBuilder()) + ->withExpiryDate(new \DateTime($inputDate)) + ->build(); + + $this->assertJsonStringEqualsJsonString( + $this->createExpectedJson($outputDate, []), + json_encode($thirdPartyAttributeExtension) + ); + } + + /** + * Provides test expiry dates. + */ + public function expiryDateDataProvider(): array + { + return [ + ['2020-01-02T01:02:03.123456Z', '2020-01-02T01:02:03.123+00:00'], + ['2020-01-01T01:02:03.123+04:00', '2019-12-31T21:02:03.123+00:00'], + ['2020-01-02T01:02:03.123-02:00', '2020-01-02T03:02:03.123+00:00'] + ]; + } + + /** + * Create expected third party extension JSON. + * + * @param string $expiryDate + * @param string[] $definitions + * + * @return string + */ + private function createExpectedJson(string $expiryDate, array $definitions): string + { + return json_encode([ + 'type' => self::THIRD_PARTY_ATTRIBUTE_TYPE, + 'content' => [ + 'expiry_date' => $expiryDate, + 'definitions' => array_map( + function ($definition) { + return [ 'name' => $definition ]; + }, + $definitions + ), + ], + ]); + } +} diff --git a/tests/Identity/Extension/TransactionalFlowExtensionBuilderTest.php b/tests/Identity/Extension/TransactionalFlowExtensionBuilderTest.php new file mode 100644 index 00000000..6ad50610 --- /dev/null +++ b/tests/Identity/Extension/TransactionalFlowExtensionBuilderTest.php @@ -0,0 +1,36 @@ + 'content']; + + $constraints = (new TransactionalFlowExtensionBuilder()) + ->withContent($someContent) + ->build(); + + $expectedJson = json_encode([ + 'type' => self::TYPE_TRANSACTIONAL_FLOW, + 'content' => $someContent, + ]); + + $this->assertEquals($expectedJson, json_encode($constraints)); + } +} diff --git a/tests/Identity/Policy/PolicyBuilderTest.php b/tests/Identity/Policy/PolicyBuilderTest.php new file mode 100644 index 00000000..d223bd79 --- /dev/null +++ b/tests/Identity/Policy/PolicyBuilderTest.php @@ -0,0 +1,644 @@ +withFamilyName() + ->withGivenNames() + ->withFullName() + ->withDateOfBirth() + ->withGender() + ->withPostalAddress() + ->withStructuredPostalAddress() + ->withNationality() + ->withPhoneNumber() + ->withSelfie() + ->withEmail() + ->withDocumentDetails() + ->withDocumentImages() + ->build(); + + $expectedWantedAttributeData = [ + 'wanted' => [ + ['name' => 'family_name', 'optional' => false], + ['name' => 'given_names', 'optional' => false], + ['name' => 'full_name', 'optional' => false], + ['name' => 'date_of_birth', 'optional' => false], + ['name' => 'gender', 'optional' => false], + ['name' => 'postal_address', 'optional' => false], + ['name' => 'structured_postal_address', 'optional' => false], + ['name' => 'nationality', 'optional' => false], + ['name' => 'phone_number', 'optional' => false], + ['name' => 'selfie', 'optional' => false], + ['name' => 'email_address', 'optional' => false], + ['name' => 'document_details', 'optional' => false], + ['name' => 'document_images', 'optional' => false], + ], + 'wanted_auth_types' => [], + 'wanted_remember_me' => false, + 'wanted_remember_me_optional' => false, + 'identity_profile_requirements' => null, + ]; + + $this->assertEquals(json_encode($expectedWantedAttributeData), json_encode($policy)); + } + + /** + * @covers ::withWantedAttributeByName + */ + public function testWithWantedAttributeByNameWithConstraints() + { + $someAttributeName = 'some_attribute_name'; + $sourceConstraint = (new SourceConstraintBuilder()) + ->withWantedAnchor(new WantedAnchor('SOME')) + ->build(); + + $constraints = [ + $sourceConstraint, + ]; + + $policy = (new PolicyBuilder()) + ->withWantedAttributeByName($someAttributeName, $constraints, true) + ->build(); + + $expectedWantedAttributeData = [ + 'wanted' => [ + [ + 'name' => $someAttributeName, + 'optional' => false, + "constraints" => [ + [ + "type" => "SOURCE", + "preferred_sources" => [ + "anchors" => [ + [ + "name" => "SOME", + "sub_type" => "", + ] + ], + "soft_preference" => false, + ], + ], + ], + "accept_self_asserted" => true, + ], + ], + 'wanted_auth_types' => [], + 'wanted_remember_me' => false, + 'wanted_remember_me_optional' => false, + 'identity_profile_requirements' => null, + ]; + + $this->assertJsonStringEqualsJsonString( + json_encode($expectedWantedAttributeData), + json_encode($policy) + ); + } + + /** + * @covers ::withWantedAttribute + * @covers ::withFamilyName + */ + public function testWithDuplicateAttribute() + { + $policy = (new PolicyBuilder()) + ->withFamilyName() + ->withFamilyName() + ->build(); + + $expectedWantedAttributeData = [ + 'wanted' => [ + ['name' => 'family_name', 'optional' => false], + ], + 'wanted_auth_types' => [], + 'wanted_remember_me' => false, + 'wanted_remember_me_optional' => false, + 'identity_profile_requirements' => null, + ]; + + $this->assertEquals(json_encode($expectedWantedAttributeData), json_encode($policy)); + } + + /** + * @covers ::withWantedAttribute + * @covers ::withFamilyName + */ + public function testWithDuplicateAttributeDifferentConstraints() + { + $sourceConstraint = (new SourceConstraintBuilder()) + ->withWantedAnchor(new WantedAnchor('SOME')) + ->build(); + + $sourceConstraint2 = (new SourceConstraintBuilder()) + ->withWantedAnchor(new WantedAnchor('SOME_2')) + ->build(); + + + $policy = (new PolicyBuilder()) + ->withFamilyName() + ->withFamilyName([$sourceConstraint]) + ->withFamilyName([$sourceConstraint2]) + ->build(); + + $jsonData = $policy->jsonSerialize(); + + $this->assertCount(3, $jsonData->wanted); + foreach ($jsonData->wanted as $wantedAttribute) { + $this->assertEquals('family_name', $wantedAttribute->getName()); + } + } + + /** + * @covers ::build + * @covers ::withWantedAttributeByName + */ + public function testWithWantedAttributeByName() + { + $policy = (new PolicyBuilder()) + ->withWantedAttributeByName('family_name') + ->withWantedAttributeByName('given_names') + ->build(); + + $expectedWantedAttributeData = [ + 'wanted' => [ + ['name' => 'family_name', 'optional' => false], + ['name' => 'given_names', 'optional' => false], + ], + 'wanted_auth_types' => [], + 'wanted_remember_me' => false, + 'wanted_remember_me_optional' => false, + 'identity_profile_requirements' => null, + ]; + + $this->assertEquals(json_encode($expectedWantedAttributeData), json_encode($policy)); + } + + /** + * @covers ::build + * @covers ::withWantedAttribute + */ + public function testWithAttributeObjects() + { + $wantedFamilyName = (new WantedAttributeBuilder()) + ->withName('family_name') + ->build(); + + $wantedGivenNames = (new WantedAttributeBuilder()) + ->withName('given_names') + ->build(); + + $policy = (new PolicyBuilder()) + ->withWantedAttribute($wantedFamilyName) + ->withWantedAttribute($wantedGivenNames) + ->build(); + + $expectedWantedAttributeData = [ + 'wanted' => [ + ['name' => 'family_name', 'optional' => false], + ['name' => 'given_names', 'optional' => false], + ], + 'wanted_auth_types' => [], + 'wanted_remember_me' => false, + 'wanted_remember_me_optional' => false, + 'identity_profile_requirements' => null, + ]; + + $this->assertEquals(json_encode($expectedWantedAttributeData), json_encode($policy)); + } + + /** + * @covers ::withDateOfBirth + * @covers ::withAgeOver + * @covers ::withAgeUnder + * @covers ::withAgeDerivedAttribute + */ + public function testWithAgeDerivedAttributes() + { + $policy = (new PolicyBuilder()) + ->withDateOfBirth() + ->withAgeOver(18) + ->withAgeUnder(30) + ->withAgeUnder(40) + ->build(); + + $expectedWantedAttributeData = [ + 'wanted' => [ + ['name' => 'date_of_birth', 'optional' => false], + ['name' => 'date_of_birth', 'optional' => false, 'derivation' => 'age_over:18'], + ['name' => 'date_of_birth', 'optional' => false, 'derivation' => 'age_under:30'], + ['name' => 'date_of_birth', 'optional' => false, 'derivation' => 'age_under:40'], + ], + 'wanted_auth_types' => [], + 'wanted_remember_me' => false, + 'wanted_remember_me_optional' => false, + 'identity_profile_requirements' => null, + ]; + + $this->assertEquals(json_encode($expectedWantedAttributeData), json_encode($policy)); + } + + /** + * @covers ::withAgeDerivedAttribute + */ + public function testWithAgeDerivedAttributesWithConstraints() + { + $sourceConstraint = (new SourceConstraintBuilder()) + ->withWantedAnchor(new WantedAnchor('SOME')) + ->build(); + + + $policy = (new PolicyBuilder()) + ->withAgeDerivedAttribute(UserProfile::AGE_OVER . '18', [$sourceConstraint]) + ->build(); + + $expectedWantedAttributeData = [ + 'wanted' => [ + [ + 'name' => 'date_of_birth', + 'optional' => false, + 'derivation' => 'age_over:18', + "constraints" => [ + [ + "type" => "SOURCE", + "preferred_sources" => [ + "anchors" => [ + [ + "name" => "SOME", + "sub_type" => "", + ] + ], + "soft_preference" => false, + ], + ], + ], + ], + ], + 'wanted_auth_types' => [], + 'wanted_remember_me' => false, + 'wanted_remember_me_optional' => false, + 'identity_profile_requirements' => null, + ]; + + $this->assertJsonStringEqualsJsonString( + json_encode($expectedWantedAttributeData), + json_encode($policy) + ); + } + + + /** + * @covers ::withAgeUnder + * @covers ::withAgeDerivedAttribute + * @covers ::withWantedAttribute + */ + public function testWithDuplicateAgeDerivedAttributes() + { + $policy = (new PolicyBuilder()) + ->withAgeUnder(30) + ->withAgeUnder(30) + ->build(); + + $expectedWantedAttributeData = [ + 'wanted' => [ + ['name' => 'date_of_birth', 'optional' => false, 'derivation' => 'age_under:30'], + ], + 'wanted_auth_types' => [], + 'wanted_remember_me' => false, + 'wanted_remember_me_optional' => false, + 'identity_profile_requirements' => null, + ]; + + $this->assertEquals(json_encode($expectedWantedAttributeData), json_encode($policy)); + } + + /** + * @covers ::withSelfieAuthentication + * @covers ::withPinAuthentication + * @covers ::withWantedAuthType + */ + public function testWithAuthTypes() + { + $policy = (new PolicyBuilder()) + ->withSelfieAuthentication() + ->withPinAuthentication() + ->withWantedAuthType(99) + ->build(); + + $expectedWantedAttributeData = [ + 'wanted' => [], + 'wanted_auth_types' => [self::SELFIE_AUTH_TYPE, self::PIN_AUTH_TYPE, 99], + 'wanted_remember_me' => false, + 'wanted_remember_me_optional' => false, + 'identity_profile_requirements' => null, + ]; + + $this->assertEquals(json_encode($expectedWantedAttributeData), json_encode($policy)); + } + + /** + * @covers ::withSelfieAuthentication + * @covers ::withPinAuthentication + * @covers ::withWantedAuthType + */ + public function testWithAuthTypesTrue() + { + $policy = (new PolicyBuilder()) + ->withSelfieAuthentication() + ->withPinAuthentication() + ->withWantedAuthType(99) + ->build(); + + $expectedWantedAttributeData = [ + 'wanted' => [], + 'wanted_auth_types' => [self::SELFIE_AUTH_TYPE, self::PIN_AUTH_TYPE, 99], + 'wanted_remember_me' => false, + 'wanted_remember_me_optional' => false, + 'identity_profile_requirements' => null + ]; + + $this->assertEquals(json_encode($expectedWantedAttributeData), json_encode($policy)); + } + + /** + * @covers ::withSelfieAuthentication + * @covers ::withPinAuthentication + * @covers ::withWantedAuthType + */ + public function testWithAuthTypesFalse() + { + $policy = (new PolicyBuilder()) + ->withSelfieAuthentication(false) + ->withPinAuthentication(false) + ->withWantedAuthType(99, false) + ->build(); + + $expectedWantedAttributeData = [ + 'wanted' => [], + 'wanted_auth_types' => [], + 'wanted_remember_me' => false, + 'wanted_remember_me_optional' => false, + 'identity_profile_requirements' => null, + ]; + + $this->assertEquals(json_encode($expectedWantedAttributeData), json_encode($policy)); + } + + /** + * @covers ::withSelfieAuthentication + * @covers ::withPinAuthentication + */ + public function testWithAuthEnabledThenDisabled() + { + $policy = (new PolicyBuilder()) + ->withSelfieAuthentication() + ->withSelfieAuthentication(false) + ->withPinAuthentication() + ->withPinAuthentication(false) + ->build(); + + $expectedWantedAttributeData = [ + 'wanted' => [], + 'wanted_auth_types' => [], + 'wanted_remember_me' => false, + 'wanted_remember_me_optional' => false, + 'identity_profile_requirements' => null, + ]; + + $this->assertEquals(json_encode($expectedWantedAttributeData), json_encode($policy)); + } + + /** + * @covers ::withSelfieAuthentication + */ + public function testWithSameAuthTypeAddedOnlyOnce() + { + $policy = (new PolicyBuilder()) + ->withSelfieAuthentication() + ->withSelfieAuthentication() + ->withSelfieAuthentication() + ->build(); + + $expectedWantedAttributeData = [ + 'wanted' => [], + 'wanted_auth_types' => [self::SELFIE_AUTH_TYPE], + 'wanted_remember_me' => false, + 'wanted_remember_me_optional' => false, + 'identity_profile_requirements' => null, + ]; + + $this->assertEquals(json_encode($expectedWantedAttributeData), json_encode($policy)); + } + + /** + * @covers ::withSelfieAuthentication + */ + public function testWithOnlyTwoAuthTypes() + { + $policy = (new PolicyBuilder()) + ->withSelfieAuthentication() + ->withPinAuthentication() + ->build(); + + $expectedWantedAttributeData = [ + 'wanted' => [], + 'wanted_auth_types' => [self::SELFIE_AUTH_TYPE, self::PIN_AUTH_TYPE], + 'wanted_remember_me' => false, + 'wanted_remember_me_optional' => false, + 'identity_profile_requirements' => null, + ]; + + $this->assertEquals(json_encode($expectedWantedAttributeData), json_encode($policy)); + } + + /** + * @covers ::withSelfieAuthentication + */ + public function testWithNoSelfieAuthAfterRemoval() + { + $policy = (new PolicyBuilder()) + ->withSelfieAuthentication() + ->withSelfieAuthentication(false) + ->build(); + + $expectedWantedAttributeData = [ + 'wanted' => [], + 'wanted_auth_types' => [], + 'wanted_remember_me' => false, + 'wanted_remember_me_optional' => false, + 'identity_profile_requirements' => null, + ]; + + $this->assertEquals(json_encode($expectedWantedAttributeData), json_encode($policy)); + } + + /** + * @covers ::withSelfieAuthentication + */ + public function testWithNoPinAuthAfterRemoval() + { + $policy = (new PolicyBuilder()) + ->withPinAuthentication() + ->withPinAuthentication(false) + ->build(); + + $expectedWantedAttributeData = [ + 'wanted' => [], + 'wanted_auth_types' => [], + 'wanted_remember_me' => false, + 'wanted_remember_me_optional' => false, + 'identity_profile_requirements' => null, + ]; + + $this->assertEquals(json_encode($expectedWantedAttributeData), json_encode($policy)); + } + + + /** + * @covers ::withWantedRememberMe + */ + public function testWithRememberMe() + { + $policy = (new PolicyBuilder()) + ->withWantedRememberMe(true) + ->build(); + + $expectedWantedAttributeData = [ + 'wanted' => [], + 'wanted_auth_types' => [], + 'wanted_remember_me' => true, + 'wanted_remember_me_optional' => false, + 'identity_profile_requirements' => null, + ]; + + $this->assertEquals(json_encode($expectedWantedAttributeData), json_encode($policy)); + } + + /** + * @covers ::withWantedRememberMe + */ + public function testWithoutRememberMe() + { + $policy = (new PolicyBuilder()) + ->withWantedRememberMe(false) + ->build(); + + $expectedWantedAttributeData = [ + 'wanted' => [], + 'wanted_auth_types' => [], + 'wanted_remember_me' => false, + 'wanted_remember_me_optional' => false, + 'identity_profile_requirements' => null + ]; + + $this->assertEquals(json_encode($expectedWantedAttributeData), json_encode($policy)); + } + + /** + * @covers ::withWantedRememberMeOptional + */ + public function testWithRememberMeOptional() + { + $policy = (new PolicyBuilder()) + ->withWantedRememberMeOptional(true) + ->build(); + + $expectedWantedAttributeData = [ + 'wanted' => [], + 'wanted_auth_types' => [], + 'wanted_remember_me' => false, + 'wanted_remember_me_optional' => true, + 'identity_profile_requirements' => null, + ]; + + $this->assertEquals(json_encode($expectedWantedAttributeData), json_encode($policy)); + } + + /** + * @covers ::withWantedRememberMeOptional + */ + public function testWithoutRememberMeOptional() + { + $policy = (new PolicyBuilder()) + ->withWantedRememberMeOptional(false) + ->build(); + + $expectedWantedAttributeData = [ + 'wanted' => [], + 'wanted_auth_types' => [], + 'wanted_remember_me' => false, + 'wanted_remember_me_optional' => false, + 'identity_profile_requirements' => null + ]; + + $this->assertEquals(json_encode($expectedWantedAttributeData), json_encode($policy)); + } + + /** + * @covers ::withIdentityProfileRequirements + * @covers \Yoti\Identity\Policy\Policy::__construct + * @covers \Yoti\Identity\Policy\Policy::getIdentityProfileRequirements + * @covers \Yoti\Identity\Policy\Policy::jsonSerialize + */ + public function testWithIdentityProfileRequirements() + { + $identityProfileSample = (object)[ + 'trust_framework' => 'UK_TFIDA', + 'scheme' => [ + 'type' => 'DBS', + 'objective' => 'STANDARD' + ] + ]; + + $expectedWantedAttributeData = [ + 'wanted' => [], + 'wanted_auth_types' => [], + 'wanted_remember_me' => false, + 'wanted_remember_me_optional' => false, + 'identity_profile_requirements' => $identityProfileSample + ]; + + $policy = (new PolicyBuilder()) + ->withIdentityProfileRequirements($identityProfileSample) + ->build(); + + $this->assertEquals(json_encode($expectedWantedAttributeData), json_encode($policy)); + $this->assertEquals($identityProfileSample, $policy->getIdentityProfileRequirements()); + } +} diff --git a/tests/Identity/Policy/WantedAnchorBuilderTest.php b/tests/Identity/Policy/WantedAnchorBuilderTest.php new file mode 100644 index 00000000..2d0479e0 --- /dev/null +++ b/tests/Identity/Policy/WantedAnchorBuilderTest.php @@ -0,0 +1,39 @@ +withValue($someName) + ->withSubType($someSubType) + ->build(); + + $expectedJsonData = [ + 'name' => $someName, + 'sub_type' => $someSubType, + ]; + + $this->assertEquals(json_encode($expectedJsonData), json_encode($wantedAnchor)); + } +} diff --git a/tests/Identity/Policy/WantedAttributeBuilderTest.php b/tests/Identity/Policy/WantedAttributeBuilderTest.php new file mode 100644 index 00000000..7cd8a8f1 --- /dev/null +++ b/tests/Identity/Policy/WantedAttributeBuilderTest.php @@ -0,0 +1,162 @@ +withWantedAnchor(new WantedAnchor('SOME')) + ->build(); + + $wantedAttribute = (new WantedAttributeBuilder()) + ->withName($someName) + ->withDerivation($someDerivation) + ->withOptional(true) + ->withConstraint($sourceConstraint) + ->withAcceptSelfAsserted(false) + ->build(); + + $expectedJsonData = [ + 'name' => $someName, + 'optional' => true, + 'derivation' => $someDerivation, + 'constraints' => [$sourceConstraint], + 'accept_self_asserted' => false, + ]; + + $this->assertEquals(json_encode($expectedJsonData), json_encode($wantedAttribute)); + $this->assertTrue($wantedAttribute->getOptional()); + $this->assertContains($sourceConstraint, $wantedAttribute->getConstraints()); + $this->assertFalse($wantedAttribute->getAcceptSelfAsserted()); + } + + /** + * @covers ::build + * @covers ::withName + */ + public function testEmptyName() + { + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('name cannot be empty'); + + (new WantedAttributeBuilder()) + ->withName('') + ->build(); + } + + /** + * @covers ::withAcceptSelfAsserted + * @covers \Yoti\ShareUrl\Policy\WantedAttribute::__construct + * @covers \Yoti\ShareUrl\Policy\WantedAttribute::jsonSerialize + * @covers \Yoti\ShareUrl\Policy\WantedAttribute::getAcceptSelfAsserted + */ + public function testAcceptSelfAsserted() + { + $someName = 'some name'; + + $expectedJsonData = [ + 'name' => $someName, + 'optional' => false, + 'accept_self_asserted' => true, + ]; + + $wantedAttributeDefault = (new WantedAttributeBuilder()) + ->withName($someName) + ->withAcceptSelfAsserted(true) + ->build(); + + $this->assertEquals(json_encode($expectedJsonData), json_encode($wantedAttributeDefault)); + + $wantedAttribute = (new WantedAttributeBuilder()) + ->withName($someName) + ->withAcceptSelfAsserted(true) + ->build(); + + $this->assertEquals(json_encode($expectedJsonData), json_encode($wantedAttribute)); + } + + /** + * @covers ::withAcceptSelfAsserted + * @covers \Yoti\ShareUrl\Policy\WantedAttribute::__construct + * @covers \Yoti\ShareUrl\Policy\WantedAttribute::jsonSerialize + * @covers \Yoti\ShareUrl\Policy\WantedAttribute::getAcceptSelfAsserted + */ + public function testWithoutAcceptSelfAsserted() + { + $someName = 'some name'; + + $expectedJsonData = [ + 'name' => $someName, + 'optional' => false, + 'accept_self_asserted' => false, + ]; + + $wantedAttribute = (new WantedAttributeBuilder()) + ->withName($someName) + ->withAcceptSelfAsserted(false) + ->build(); + + $this->assertEquals(json_encode($expectedJsonData), json_encode($wantedAttribute)); + } + + /** + * @covers ::withAcceptSelfAsserted + * @covers ::withConstraints + * @covers \Yoti\ShareUrl\Policy\WantedAttribute::__construct + * @covers \Yoti\ShareUrl\Policy\WantedAttribute::jsonSerialize + * @covers \Yoti\ShareUrl\Policy\WantedAttribute::getAcceptSelfAsserted + */ + public function testWithMultipleConstraints() + { + $sourceConstraint = (new SourceConstraintBuilder()) + ->withWantedAnchor(new WantedAnchor('SOME')) + ->build(); + + $sourceConstraint2 = (new SourceConstraintBuilder()) + ->withWantedAnchor(new WantedAnchor('SOME_2')) + ->build(); + + + $constraints = [ + $sourceConstraint, + $sourceConstraint2 + ]; + + $wantedAttribute = (new WantedAttributeBuilder()) + ->withName('someName') + ->withAcceptSelfAsserted(false) + ->withConstraints($constraints) + ->build(); + + $this->assertEquals($constraints, $wantedAttribute->getConstraints()); + } +} diff --git a/tests/Identity/ShareSessionCreatedQrCodeTest.php b/tests/Identity/ShareSessionCreatedQrCodeTest.php new file mode 100644 index 00000000..c0fc50ba --- /dev/null +++ b/tests/Identity/ShareSessionCreatedQrCodeTest.php @@ -0,0 +1,42 @@ + self::SOME_ID, + 'uri' => self::SOME_URI, + 'failed' => 'failed' + ]); + + $expected = [ + 'id' => self::SOME_ID, + 'uri' => self::SOME_URI, + ]; + + $this->assertInstanceOf(ShareSessionCreatedQrCode::class, $qrCode); + + $this->assertEquals(self::SOME_ID, $qrCode->getId()); + $this->assertEquals(self::SOME_URI, $qrCode->getUri()); + + $this->assertEquals(json_encode($expected), json_encode($qrCode)); + } +} diff --git a/tests/Identity/ShareSessionCreatedTest.php b/tests/Identity/ShareSessionCreatedTest.php new file mode 100644 index 00000000..380be268 --- /dev/null +++ b/tests/Identity/ShareSessionCreatedTest.php @@ -0,0 +1,45 @@ + self::SOME_ID, + 'status' => self::SOME_STATUS, + 'expiry' => self::SOME_EXPIRY, + 'failed' => 'SQL injection' + ]); + + $expected = [ + 'id' => self::SOME_ID, + 'status' => self::SOME_STATUS, + 'expiry' => self::SOME_EXPIRY, + ]; + + $this->assertInstanceOf(ShareSessionCreated::class, $shareSession); + $this->assertEquals(self::SOME_ID, $shareSession->getId()); + $this->assertEquals(self::SOME_STATUS, $shareSession->getStatus()); + $this->assertEquals(self::SOME_EXPIRY, $shareSession->getExpiry()); + $this->assertEquals(json_encode($expected), json_encode($shareSession)); + } +} diff --git a/tests/Identity/ShareSessionFetchedQrCodeTest.php b/tests/Identity/ShareSessionFetchedQrCodeTest.php new file mode 100644 index 00000000..3be47c69 --- /dev/null +++ b/tests/Identity/ShareSessionFetchedQrCodeTest.php @@ -0,0 +1,76 @@ + 'some', 'content' => 'content'], + ['type' => 'some2', 'content' => 'content2'], + ]; + + $shareSession = [ + 'id' => 'some', + 'status' => 'status', + 'expiry' => 'expiry', + ]; + + $qrCode = new ShareSessionFetchedQrCode([ + 'id' => self::SOME_ID, + 'expiry' => self::SOME_EXPIRY, + 'policy' => self::SOME_POLICY, + 'extensions' => $extensions, + 'session' => $shareSession, + 'redirectUri' => self::SOME_REDIRECT_URI, + ]); + + $expected = [ + 'id' => self::SOME_ID, + 'expiry' => self::SOME_EXPIRY, + 'policy' => self::SOME_POLICY, + 'extensions' => $extensions, + 'session' => $shareSession, + 'redirectUri' => self::SOME_REDIRECT_URI, + ]; + + $this->assertInstanceOf(ShareSessionFetchedQrCode::class, $qrCode); + + $this->assertEquals(self::SOME_ID, $qrCode->getId()); + $this->assertEquals(self::SOME_EXPIRY, $qrCode->getExpiry()); + $this->assertEquals(self::SOME_POLICY, $qrCode->getPolicy()); + $this->assertEquals(self::SOME_REDIRECT_URI, $qrCode->getRedirectUri()); + + $this->assertInstanceOf(ShareSessionCreated::class, $qrCode->getSession()); + + $this->assertContainsOnlyInstancesOf(Extension::class, $qrCode->getExtensions()); + + $this->assertEquals(self::SOME_REDIRECT_URI, $qrCode->getRedirectUri()); + + $this->assertEquals(json_encode($expected), json_encode($qrCode)); + } +} diff --git a/tests/Identity/ShareSessionFetchedTest.php b/tests/Identity/ShareSessionFetchedTest.php new file mode 100644 index 00000000..cc38224d --- /dev/null +++ b/tests/Identity/ShareSessionFetchedTest.php @@ -0,0 +1,66 @@ + self::SOME_ID, + 'status' => self::SOME_STATUS, + 'expiry' => self::SOME_EXPIRY, + 'created' => self::SOME_CREATED, + 'updated' => self::SOME_UPDATED, + 'failed' => 'SQL injection', + 'qrCode' => ['id' => self::SOME_QRCODE_ID], + 'receipt' => ['id' => self::SOME_RECEIPT_ID], + ]); + + $expected = [ + 'id' => self::SOME_ID, + 'status' => self::SOME_STATUS, + 'expiry' => self::SOME_EXPIRY, + 'created' => self::SOME_CREATED, + 'updated' => self::SOME_UPDATED, + 'qrCodeId' => self::SOME_QRCODE_ID, + 'receiptId' => self::SOME_RECEIPT_ID, + ]; + + $this->assertInstanceOf(ShareSessionFetched::class, $shareSession); + $this->assertEquals(self::SOME_ID, $shareSession->getId()); + $this->assertEquals(self::SOME_STATUS, $shareSession->getStatus()); + $this->assertEquals(self::SOME_EXPIRY, $shareSession->getExpiry()); + $this->assertEquals(self::SOME_CREATED, $shareSession->getCreated()); + $this->assertEquals(self::SOME_UPDATED, $shareSession->getUpdated()); + $this->assertEquals(self::SOME_QRCODE_ID, $shareSession->getQrCodeId()); + $this->assertEquals(self::SOME_RECEIPT_ID, $shareSession->getReceiptId()); + $this->assertEquals(json_encode($expected), json_encode($shareSession)); + } +} diff --git a/tests/Identity/ShareSessionNotificationBuilderTest.php b/tests/Identity/ShareSessionNotificationBuilderTest.php new file mode 100644 index 00000000..ffee1e5e --- /dev/null +++ b/tests/Identity/ShareSessionNotificationBuilderTest.php @@ -0,0 +1,80 @@ + 'auth', 'header_3' => 'auth_3']; + + /** + * @covers ::withUrl + * @covers ::withMethod + * @covers ::withHeader + * @covers ::withVerifyTls + * @covers ::build + * @covers \Yoti\Identity\ShareSessionNotification::getUrl + * @covers \Yoti\Identity\ShareSessionNotification::getHeaders + * @covers \Yoti\Identity\ShareSessionNotification::getMethod + * @covers \Yoti\Identity\ShareSessionNotification::getUrl + * @covers \Yoti\Identity\ShareSessionNotification::__construct + */ + public function testShouldBuildCorrectly() + { + $shareNotification = (new ShareSessionNotificationBuilder()) + ->withMethod() + ->withUrl(self::URL) + ->withHeader(self::HEADER_KEY, self::HEADER_VALUE) + ->withVerifyTls() + ->build(); + + $this->assertInstanceOf(ShareSessionNotification::class, $shareNotification); + + $this->assertEquals(self::URL, $shareNotification->getUrl()); + $this->assertEquals([self::HEADER_KEY => self::HEADER_VALUE], $shareNotification->getHeaders()); + $this->assertEquals('POST', $shareNotification->getMethod()); + } + + /** + * @covers ::withUrl + * @covers ::withMethod + * @covers ::withHeaders + * @covers ::withVerifyTls + * @covers ::build + * @covers \Yoti\Identity\ShareSessionNotification::getHeaders + * @covers \Yoti\Identity\ShareSessionNotification::isVerifyTls + * @covers \Yoti\Identity\ShareSessionNotification::jsonSerialize + * @covers \Yoti\Identity\ShareSessionNotification::__construct + */ + public function testShouldBuildCorrectlyWithMultipleHeaders() + { + $shareNotification = (new ShareSessionNotificationBuilder()) + ->withMethod() + ->withUrl(self::URL) + ->withHeaders(self::HEADERS) + ->withVerifyTls(false) + ->build(); + + $expected = [ + 'url' => self::URL, + 'method' => 'POST', + 'verifyTls' => false, + 'headers' => self::HEADERS, + ]; + + $this->assertEquals(self::HEADERS, $shareNotification->getHeaders()); + $this->assertFalse($shareNotification->isVerifyTls()); + $this->assertEquals(json_encode($expected), json_encode($shareNotification)); + } +} diff --git a/tests/Identity/ShareSessionRequestBuilderTest.php b/tests/Identity/ShareSessionRequestBuilderTest.php new file mode 100644 index 00000000..4be3a1ef --- /dev/null +++ b/tests/Identity/ShareSessionRequestBuilderTest.php @@ -0,0 +1,100 @@ +extensionMock = $this->createMock(Extension::class); + $this->policyMock = $this->createMock(Policy::class); + } + + /** + * @covers ::withRedirectUri + * @covers ::withPolicy + * @covers ::withExtension + * @covers ::withNotification + * @covers ::withSubject + * @covers ::build + * @covers \Yoti\Identity\ShareSessionRequest::getPolicy + * @covers \Yoti\Identity\ShareSessionRequest::getNotification + * @covers \Yoti\Identity\ShareSessionRequest::getExtensions + * @covers \Yoti\Identity\ShareSessionRequest::getSubject + * @covers \Yoti\Identity\ShareSessionRequest::__construct + */ + public function testShouldBuildCorrectly() + { + $subject = [ + 'key' => (object)['some' => 'good'] + ]; + + $shareNotification = (new ShareSessionNotificationBuilder()) + ->withMethod() + ->withUrl('some') + ->withHeader('some', 'some') + ->withVerifyTls() + ->build(); + + $shareRequest = (new ShareSessionRequestBuilder()) + ->withSubject($subject) + ->withNotification($shareNotification) + ->withPolicy($this->policyMock) + ->withRedirectUri(self::URI) + ->withExtension($this->extensionMock) + ->build(); + + $this->assertInstanceOf(ShareSessionRequest::class, $shareRequest); + + $this->assertEquals($subject, $shareRequest->getSubject()); + $this->assertEquals([$this->extensionMock], $shareRequest->getExtensions()); + $this->assertEquals($this->policyMock, $shareRequest->getPolicy()); + $this->assertEquals($shareNotification, $shareRequest->getNotification()); + $this->assertEquals(self::URI, $shareRequest->getRedirectUri()); + } + + /** + * @covers ::withRedirectUri + * @covers ::withPolicy + * @covers ::withExtensions + * @covers ::withNotification + * @covers ::withSubject + * @covers ::build + * @covers \Yoti\Identity\ShareSessionRequest::getExtensions + * @covers \Yoti\Identity\ShareSessionRequest::__construct + * @covers \Yoti\Identity\ShareSessionRequest::jsonSerialize + */ + public function testShouldBuildCorrectlyWithMultipleExtensions() + { + $shareRequest = (new ShareSessionRequestBuilder()) + ->withPolicy($this->policyMock) + ->withRedirectUri(self::URI) + ->withExtensions([$this->extensionMock]) + ->build(); + + + $expected = [ + 'policy' => $this->policyMock, + 'redirectUri' => self::URI, + 'extensions' => [$this->extensionMock], + ]; + + $this->assertEquals([$this->extensionMock], $shareRequest->getExtensions()); + $this->assertEquals(json_encode($expected), json_encode($shareRequest)); + } +}