Version Description
Download this release
Release Info
Developer | miled |
Plugin | WordPress Social Login |
Version | 2.3.1 |
Comparing to | |
See all releases |
Code changes from version 2.2.3 to 2.3.1
- .travis.yml +21 -0
- LICENSE +21 -21
- assets/img/32x32/icondock/info.txt +9 -9
- assets/img/setup/facebook/1.png +0 -0
- assets/img/setup/facebook/2.png +0 -0
- assets/img/setup/facebook/3.png +0 -0
- assets/img/setup/google/1.png +0 -0
- assets/img/setup/google/2.png +0 -0
- assets/img/setup/google/3.png +0 -0
- assets/img/setup/twitter/1.png +0 -0
- assets/img/setup/twitter/2.png +0 -0
- assets/img/setup/twitter/3.png +0 -0
- assets/img/setup/wordpress/1.png +0 -0
- assets/img/setup/wordpress/2.png +0 -0
- assets/img/setup/wordpress/3.png +0 -0
- assets/index.html +30 -30
- assets/js/widget.js +74 -74
- banner-772x250.png +0 -0
- bin/install-wp-tests.sh +78 -0
- hybridauth/Hybrid/Auth.php +380 -380
- hybridauth/Hybrid/Endpoint.php +200 -200
- hybridauth/Hybrid/Error.php +87 -87
- hybridauth/Hybrid/Exception.php +16 -16
- hybridauth/Hybrid/Provider_Adapter.php +313 -313
- hybridauth/Hybrid/Provider_Model.php +245 -245
- hybridauth/Hybrid/Provider_Model_OAuth1.php +180 -180
- hybridauth/Hybrid/Provider_Model_OAuth2.php +184 -184
- hybridauth/Hybrid/Provider_Model_OpenID.php +181 -181
- hybridauth/Hybrid/Providers/AOL.php +16 -16
- hybridauth/Hybrid/Providers/Disqus.php +59 -59
- hybridauth/Hybrid/Providers/Dribbble.php +51 -51
- hybridauth/Hybrid/Providers/Facebook.php +306 -381
- hybridauth/Hybrid/Providers/Foursquare.php +56 -56
- hybridauth/Hybrid/Providers/GitHub.php +72 -72
- hybridauth/Hybrid/Providers/Goodreads.php +115 -115
- hybridauth/Hybrid/Providers/Google.php +242 -242
- hybridauth/Hybrid/Providers/Instagram.php +49 -48
- hybridauth/Hybrid/Providers/LastFM.php +111 -111
- hybridauth/Hybrid/Providers/Latch.php +30 -30
- hybridauth/Hybrid/Providers/LinkedIn.php +269 -269
- hybridauth/Hybrid/Providers/Live.php +108 -108
- hybridauth/Hybrid/Providers/Mailru.php +63 -63
- hybridauth/Hybrid/Providers/Mixi.php +6 -6
- hybridauth/Hybrid/Providers/Odnoklassniki.php +176 -176
- hybridauth/Hybrid/Providers/OpenID.php +15 -15
- hybridauth/Hybrid/Providers/PixelPin.php +49 -49
- hybridauth/Hybrid/Providers/Reddit.php +201 -201
- hybridauth/Hybrid/Providers/Skyrock.php +198 -198
- hybridauth/Hybrid/Providers/Stackoverflow.php +4 -4
- hybridauth/Hybrid/Providers/Steam.php +122 -122
- hybridauth/Hybrid/Providers/Tumblr.php +79 -79
- hybridauth/Hybrid/Providers/TwitchTV.php +73 -73
- hybridauth/Hybrid/Providers/Twitter.php +275 -275
- hybridauth/Hybrid/Providers/Vkontakte.php +220 -151
- hybridauth/Hybrid/Providers/WordPress.php +85 -85
- hybridauth/Hybrid/Providers/Yahoo.php +32 -32
- hybridauth/Hybrid/Providers/Yandex.php +61 -61
- hybridauth/Hybrid/Providers/px500.php +96 -96
- hybridauth/Hybrid/Storage.php +137 -137
- hybridauth/Hybrid/User.php +40 -40
- hybridauth/Hybrid/User_Activity.php +54 -54
- hybridauth/Hybrid/User_Contact.php +58 -58
- hybridauth/Hybrid/User_Profile.php +150 -150
- hybridauth/Hybrid/index.html +9 -9
- hybridauth/Hybrid/resources/index.html +9 -9
- hybridauth/Hybrid/resources/openid_policy.html +9 -9
- hybridauth/Hybrid/resources/openid_realm.html +31 -31
- hybridauth/Hybrid/resources/openid_xrds.xml +11 -11
- hybridauth/Hybrid/thirdparty/Facebook/Authentication/AccessToken.php +160 -0
- hybridauth/Hybrid/thirdparty/Facebook/Authentication/AccessTokenMetadata.php +390 -0
- hybridauth/Hybrid/thirdparty/Facebook/Authentication/OAuth2Client.php +292 -0
- hybridauth/Hybrid/thirdparty/Facebook/Exceptions/FacebookAuthenticationException.php +33 -0
- hybridauth/Hybrid/thirdparty/Facebook/Exceptions/FacebookAuthorizationException.php +33 -0
- hybridauth/Hybrid/thirdparty/Facebook/Exceptions/FacebookClientException.php +33 -0
- hybridauth/Hybrid/thirdparty/Facebook/Exceptions/FacebookOtherException.php +33 -0
- hybridauth/Hybrid/thirdparty/Facebook/Exceptions/FacebookResponseException.php +214 -0
- hybridauth/Hybrid/thirdparty/Facebook/Exceptions/FacebookResumableUploadException.php +33 -0
- hybridauth/Hybrid/thirdparty/Facebook/Exceptions/FacebookSDKException.php +33 -0
- hybridauth/Hybrid/thirdparty/Facebook/Exceptions/FacebookServerException.php +33 -0
- hybridauth/Hybrid/thirdparty/Facebook/Exceptions/FacebookThrottleException.php +33 -0
- hybridauth/Hybrid/thirdparty/Facebook/FacebookApp.php +110 -0
- hybridauth/Hybrid/thirdparty/Facebook/FacebookBatchRequest.php +301 -0
- hybridauth/Hybrid/thirdparty/Facebook/FacebookBatchResponse.php +174 -0
- hybridauth/Hybrid/thirdparty/Facebook/FacebookClient.php +250 -0
- hybridauth/Hybrid/thirdparty/Facebook/FacebookRequest.php +534 -0
- hybridauth/Hybrid/thirdparty/Facebook/FacebookResponse.php +410 -0
- hybridauth/Hybrid/thirdparty/Facebook/FileUpload/FacebookFile.php +169 -0
- hybridauth/Hybrid/thirdparty/Facebook/FileUpload/FacebookResumableUploader.php +167 -0
- hybridauth/Hybrid/thirdparty/Facebook/FileUpload/FacebookTransferChunk.php +133 -0
- hybridauth/Hybrid/thirdparty/Facebook/FileUpload/FacebookVideo.php +33 -0
- hybridauth/Hybrid/thirdparty/Facebook/FileUpload/Mimetypes.php +988 -0
- hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/Birthday.php +85 -0
- hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/Collection.php +242 -0
- hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphAchievement.php +112 -0
- hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphAlbum.php +183 -0
- hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphApplication.php +43 -0
- hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphCoverPhoto.php +72 -0
- hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphEdge.php +252 -0
- hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphEvent.php +242 -0
- hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphGroup.php +170 -0
- hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphList.php +36 -0
- hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphLocation.php +102 -0
- hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphNode.php +197 -0
- hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphNodeFactory.php +392 -0
- hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphObject.php +36 -0
- hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphObjectFactory.php +88 -0
- hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphPage.php +147 -0
- hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphPicture.php +72 -0
- hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphSessionInfo.php +102 -0
- hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphUser.php +172 -0
- hybridauth/Hybrid/thirdparty/Facebook/Helpers/FacebookCanvasHelper.php +52 -0
- hybridauth/Hybrid/thirdparty/Facebook/Helpers/FacebookJavaScriptHelper.php +42 -0
- hybridauth/Hybrid/thirdparty/Facebook/Helpers/FacebookPageTabHelper.php +95 -0
- hybridauth/Hybrid/thirdparty/Facebook/Helpers/FacebookRedirectLoginHelper.php +333 -0
- hybridauth/Hybrid/thirdparty/Facebook/Helpers/FacebookSignedRequestFromInputHelper.php +166 -0
- hybridauth/Hybrid/thirdparty/Facebook/Http/GraphRawResponse.php +137 -0
- hybridauth/Hybrid/thirdparty/Facebook/Http/RequestBodyInterface.php +39 -0
- hybridauth/Hybrid/thirdparty/Facebook/Http/RequestBodyMultipart.php +170 -0
- hybridauth/Hybrid/thirdparty/Facebook/Http/RequestBodyUrlEncoded.php +55 -0
- hybridauth/Hybrid/thirdparty/Facebook/HttpClients/FacebookCurl.php +129 -0
- hybridauth/Hybrid/thirdparty/Facebook/HttpClients/FacebookCurlHttpClient.php +163 -0
- hybridauth/Hybrid/thirdparty/Facebook/HttpClients/FacebookGuzzleHttpClient.php +97 -0
- hybridauth/Hybrid/thirdparty/Facebook/HttpClients/FacebookHttpClientInterface.php +47 -0
- hybridauth/Hybrid/thirdparty/Facebook/HttpClients/FacebookStream.php +80 -0
- hybridauth/Hybrid/thirdparty/Facebook/HttpClients/FacebookStreamHttpClient.php +94 -0
- hybridauth/Hybrid/thirdparty/Facebook/HttpClients/HttpClientsFactory.php +99 -0
- hybridauth/Hybrid/thirdparty/Facebook/HttpClients/certs/DigiCertHighAssuranceEVRootCA.pem +23 -0
- hybridauth/Hybrid/thirdparty/Facebook/PersistentData/FacebookMemoryPersistentDataHandler.php +53 -0
- hybridauth/Hybrid/thirdparty/Facebook/PersistentData/FacebookSessionPersistentDataHandler.php +76 -0
- hybridauth/Hybrid/thirdparty/Facebook/PersistentData/PersistentDataFactory.php +65 -0
- hybridauth/Hybrid/thirdparty/Facebook/PersistentData/PersistentDataInterface.php +49 -0
- hybridauth/Hybrid/thirdparty/Facebook/PseudoRandomString/McryptPseudoRandomStringGenerator.php +68 -0
- hybridauth/Hybrid/thirdparty/Facebook/PseudoRandomString/OpenSslPseudoRandomStringGenerator.php +67 -0
- hybridauth/Hybrid/thirdparty/Facebook/PseudoRandomString/PseudoRandomStringGeneratorFactory.php +101 -0
- hybridauth/Hybrid/thirdparty/Facebook/PseudoRandomString/PseudoRandomStringGeneratorInterface.php +45 -0
- hybridauth/Hybrid/thirdparty/Facebook/PseudoRandomString/PseudoRandomStringGeneratorTrait.php +58 -0
- hybridauth/Hybrid/thirdparty/Facebook/PseudoRandomString/RandomBytesPseudoRandomStringGenerator.php +59 -0
- hybridauth/Hybrid/thirdparty/Facebook/PseudoRandomString/UrandomPseudoRandomStringGenerator.php +89 -0
- hybridauth/Hybrid/thirdparty/Facebook/SignedRequest.php +326 -0
- hybridauth/Hybrid/thirdparty/Facebook/Url/FacebookUrlDetectionHandler.php +182 -0
- hybridauth/Hybrid/thirdparty/Facebook/Url/FacebookUrlManipulator.php +167 -0
- hybridauth/Hybrid/thirdparty/Facebook/Url/UrlDetectionInterface.php +39 -0
- hybridauth/Hybrid/thirdparty/Facebook/autoload.php +81 -0
- hybridauth/Hybrid/thirdparty/Facebook/base_facebook.php +0 -1574
- hybridauth/Hybrid/thirdparty/Facebook/facebook.php +602 -216
- hybridauth/Hybrid/thirdparty/Facebook/fb_ca_chain_bundle.crt +0 -3570
.travis.yml
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
language: php
|
2 |
+
|
3 |
+
php:
|
4 |
+
- 5.2
|
5 |
+
- 5.3
|
6 |
+
- 5.4
|
7 |
+
|
8 |
+
env:
|
9 |
+
- WP_VERSION=latest WP_MULTISITE=0
|
10 |
+
- WP_VERSION=latest WP_MULTISITE=1
|
11 |
+
- WP_VERSION=4.0 WP_MULTISITE=0
|
12 |
+
- WP_VERSION=4.0 WP_MULTISITE=1
|
13 |
+
- WP_VERSION=3.9 WP_MULTISITE=0
|
14 |
+
- WP_VERSION=3.9 WP_MULTISITE=1
|
15 |
+
- WP_VERSION=3.8 WP_MULTISITE=0
|
16 |
+
- WP_VERSION=3.8 WP_MULTISITE=1
|
17 |
+
|
18 |
+
before_script:
|
19 |
+
- bash bin/install-wp-tests.sh wordpress_test root '' localhost $WP_VERSION
|
20 |
+
|
21 |
+
script: phpunit
|
LICENSE
CHANGED
@@ -1,22 +1,22 @@
|
|
1 |
-
The MIT License (MIT)
|
2 |
-
|
3 |
-
Copyright (C) 2011-2014 Mohamed Mrassi and contributors.
|
4 |
-
|
5 |
-
Permission is hereby granted, free of charge, to any person obtaining
|
6 |
-
a copy of this software and associated documentation files (the
|
7 |
-
"Software"), to deal in the Software without restriction, including
|
8 |
-
without limitation the rights to use, copy, modify, merge, publish,
|
9 |
-
distribute, sublicense, and/or sell copies of the Software, and to
|
10 |
-
permit persons to whom the Software is furnished to do so, subject to
|
11 |
-
the following conditions:
|
12 |
-
|
13 |
-
The above copyright notice and this permission notice shall be
|
14 |
-
included in all copies or substantial portions of the Software.
|
15 |
-
|
16 |
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17 |
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18 |
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19 |
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20 |
-
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21 |
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22 |
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
1 |
+
The MIT License (MIT)
|
2 |
+
|
3 |
+
Copyright (C) 2011-2014 Mohamed Mrassi and contributors.
|
4 |
+
|
5 |
+
Permission is hereby granted, free of charge, to any person obtaining
|
6 |
+
a copy of this software and associated documentation files (the
|
7 |
+
"Software"), to deal in the Software without restriction, including
|
8 |
+
without limitation the rights to use, copy, modify, merge, publish,
|
9 |
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10 |
+
permit persons to whom the Software is furnished to do so, subject to
|
11 |
+
the following conditions:
|
12 |
+
|
13 |
+
The above copyright notice and this permission notice shall be
|
14 |
+
included in all copies or substantial portions of the Software.
|
15 |
+
|
16 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17 |
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18 |
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19 |
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20 |
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21 |
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22 |
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
assets/img/32x32/icondock/info.txt
CHANGED
@@ -1,10 +1,10 @@
|
|
1 |
-
Vector Social Media Icons
|
2 |
-
by IconDock.com
|
3 |
-
|
4 |
-
URL: http://icondock.com/free/vector-social-media-icons
|
5 |
-
|
6 |
-
Note: the company logos in the icons are copyright of their respective owners.
|
7 |
-
|
8 |
-
From http://icondock.com/free/vector-social-media-icons
|
9 |
-
"Free to use for whatever purposes. If you use these icons, an optional link to
|
10 |
http://icondock.com would be appreciated. Thank you."
|
1 |
+
Vector Social Media Icons
|
2 |
+
by IconDock.com
|
3 |
+
|
4 |
+
URL: http://icondock.com/free/vector-social-media-icons
|
5 |
+
|
6 |
+
Note: the company logos in the icons are copyright of their respective owners.
|
7 |
+
|
8 |
+
From http://icondock.com/free/vector-social-media-icons
|
9 |
+
"Free to use for whatever purposes. If you use these icons, an optional link to
|
10 |
http://icondock.com would be appreciated. Thank you."
|
assets/img/setup/facebook/1.png
ADDED
Binary file
|
assets/img/setup/facebook/2.png
ADDED
Binary file
|
assets/img/setup/facebook/3.png
ADDED
Binary file
|
assets/img/setup/google/1.png
ADDED
Binary file
|
assets/img/setup/google/2.png
ADDED
Binary file
|
assets/img/setup/google/3.png
ADDED
Binary file
|
assets/img/setup/twitter/1.png
ADDED
Binary file
|
assets/img/setup/twitter/2.png
ADDED
Binary file
|
assets/img/setup/twitter/3.png
ADDED
Binary file
|
assets/img/setup/wordpress/1.png
ADDED
Binary file
|
assets/img/setup/wordpress/2.png
ADDED
Binary file
|
assets/img/setup/wordpress/3.png
ADDED
Binary file
|
assets/index.html
CHANGED
@@ -1,31 +1,31 @@
|
|
1 |
-
<html>
|
2 |
-
<head>
|
3 |
-
<meta name="robots" content="noindex, nofollow">
|
4 |
-
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
5 |
-
<title>WordPress Social Login</title>
|
6 |
-
<style type="text/css">
|
7 |
-
* {
|
8 |
-
margin: 0;
|
9 |
-
padding: 0;
|
10 |
-
}
|
11 |
-
body {
|
12 |
-
background: #333;
|
13 |
-
}
|
14 |
-
h1 {
|
15 |
-
color: white;
|
16 |
-
font: 45px 'Open Sans';
|
17 |
-
padding: 30px;
|
18 |
-
}
|
19 |
-
p {
|
20 |
-
color: white;
|
21 |
-
font: 15px 'Open Sans';
|
22 |
-
padding: 0 30px;
|
23 |
-
}
|
24 |
-
</style>
|
25 |
-
</head>
|
26 |
-
<body>
|
27 |
-
<h1>WordPress Social Login</h1>
|
28 |
-
|
29 |
-
<p>403.</p>
|
30 |
-
</body>
|
31 |
</html>
|
1 |
+
<html>
|
2 |
+
<head>
|
3 |
+
<meta name="robots" content="noindex, nofollow">
|
4 |
+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
5 |
+
<title>WordPress Social Login</title>
|
6 |
+
<style type="text/css">
|
7 |
+
* {
|
8 |
+
margin: 0;
|
9 |
+
padding: 0;
|
10 |
+
}
|
11 |
+
body {
|
12 |
+
background: #333;
|
13 |
+
}
|
14 |
+
h1 {
|
15 |
+
color: white;
|
16 |
+
font: 45px 'Open Sans';
|
17 |
+
padding: 30px;
|
18 |
+
}
|
19 |
+
p {
|
20 |
+
color: white;
|
21 |
+
font: 15px 'Open Sans';
|
22 |
+
padding: 0 30px;
|
23 |
+
}
|
24 |
+
</style>
|
25 |
+
</head>
|
26 |
+
<body>
|
27 |
+
<h1>WordPress Social Login</h1>
|
28 |
+
|
29 |
+
<p>403.</p>
|
30 |
+
</body>
|
31 |
</html>
|
assets/js/widget.js
CHANGED
@@ -1,74 +1,74 @@
|
|
1 |
-
/*!
|
2 |
-
* WordPress Social Login
|
3 |
-
*
|
4 |
-
* http://miled.github.io/wordpress-social-login/ | https://github.com/miled/wordpress-social-login
|
5 |
-
* (c) 2011-2014 Mohamed Mrassi and contributors | http://wordpress.org/plugins/wordpress-social-login/
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Manage authentications via a popup
|
10 |
-
*
|
11 |
-
* Based on http://wordpress.org/extend/plugins/social-connect/
|
12 |
-
*/
|
13 |
-
|
14 |
-
/**
|
15 |
-
* bind on click event to idps icons
|
16 |
-
*/
|
17 |
-
(function($){
|
18 |
-
$(function(){
|
19 |
-
$(document).on( 'click', 'a.wp-social-login-provider', function(){
|
20 |
-
popupurl = $( '#wsl_popup_base_url' ).val();
|
21 |
-
|
22 |
-
provider = $(this).attr("data-provider");
|
23 |
-
|
24 |
-
var width = 1000;
|
25 |
-
var height = 600;
|
26 |
-
var top = ( screen.height / 2 ) - ( height / 2 ) - 50;
|
27 |
-
var left = ( screen.width / 2 ) - ( width / 2 );
|
28 |
-
|
29 |
-
window.open( popupurl + 'provider=' + provider, 'hybridauth_social_sing_on', 'location=1,status=0,scrollbars=0,height=' + height + ',width=' + width + ',top=' + top + ',left=' + left);
|
30 |
-
});
|
31 |
-
});
|
32 |
-
})(jQuery);
|
33 |
-
|
34 |
-
/**
|
35 |
-
* generate login wp form
|
36 |
-
*/
|
37 |
-
window.wsl_wordpress_social_login = function( config ){
|
38 |
-
jQuery( '#loginform' ).unbind( 'submit.simplemodal-login' );
|
39 |
-
|
40 |
-
var form_id = '#loginform';
|
41 |
-
|
42 |
-
if( ! jQuery( '#loginform' ).length )
|
43 |
-
{
|
44 |
-
if( jQuery( '#registerform' ).length )
|
45 |
-
{
|
46 |
-
form_id = '#registerform';
|
47 |
-
}
|
48 |
-
|
49 |
-
else {
|
50 |
-
var login_uri = jQuery( '#wsl_login_form_uri' ).val();
|
51 |
-
|
52 |
-
jQuery('body').append( '<form id="loginform" method="post" action="' + login_uri + '"></form>' );
|
53 |
-
|
54 |
-
jQuery('#loginform').append( '<input type="hidden" id="redirect_to" name="redirect_to" value="' + window.location.href + '">' );
|
55 |
-
}
|
56 |
-
}
|
57 |
-
|
58 |
-
jQuery.each( config, function( key, value ){
|
59 |
-
jQuery( '#' + key ).remove();
|
60 |
-
|
61 |
-
jQuery( form_id ).append( '<input type="hidden" id="' + key + '" name="' + key + '" value="' + value + '">' );
|
62 |
-
});
|
63 |
-
|
64 |
-
if( jQuery( '#simplemodal-login-form' ).length )
|
65 |
-
{
|
66 |
-
var current_url = window.location.href;
|
67 |
-
|
68 |
-
jQuery( '#redirect_to' ).remove();
|
69 |
-
|
70 |
-
jQuery( form_id ).append( '<input type="hidden" id="redirect_to" name="redirect_to" value="' + current_url + '">' );
|
71 |
-
}
|
72 |
-
|
73 |
-
jQuery( form_id ).submit();
|
74 |
-
}
|
1 |
+
/*!
|
2 |
+
* WordPress Social Login
|
3 |
+
*
|
4 |
+
* http://miled.github.io/wordpress-social-login/ | https://github.com/miled/wordpress-social-login
|
5 |
+
* (c) 2011-2014 Mohamed Mrassi and contributors | http://wordpress.org/plugins/wordpress-social-login/
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Manage authentications via a popup
|
10 |
+
*
|
11 |
+
* Based on http://wordpress.org/extend/plugins/social-connect/
|
12 |
+
*/
|
13 |
+
|
14 |
+
/**
|
15 |
+
* bind on click event to idps icons
|
16 |
+
*/
|
17 |
+
(function($){
|
18 |
+
$(function(){
|
19 |
+
$(document).on( 'click', 'a.wp-social-login-provider', function(){
|
20 |
+
popupurl = $( '#wsl_popup_base_url' ).val();
|
21 |
+
|
22 |
+
provider = $(this).attr("data-provider");
|
23 |
+
|
24 |
+
var width = 1000;
|
25 |
+
var height = 600;
|
26 |
+
var top = ( screen.height / 2 ) - ( height / 2 ) - 50;
|
27 |
+
var left = ( screen.width / 2 ) - ( width / 2 );
|
28 |
+
|
29 |
+
window.open( popupurl + 'provider=' + provider, 'hybridauth_social_sing_on', 'location=1,status=0,scrollbars=0,height=' + height + ',width=' + width + ',top=' + top + ',left=' + left);
|
30 |
+
});
|
31 |
+
});
|
32 |
+
})(jQuery);
|
33 |
+
|
34 |
+
/**
|
35 |
+
* generate login wp form
|
36 |
+
*/
|
37 |
+
window.wsl_wordpress_social_login = function( config ){
|
38 |
+
jQuery( '#loginform' ).unbind( 'submit.simplemodal-login' );
|
39 |
+
|
40 |
+
var form_id = '#loginform';
|
41 |
+
|
42 |
+
if( ! jQuery( '#loginform' ).length )
|
43 |
+
{
|
44 |
+
if( jQuery( '#registerform' ).length )
|
45 |
+
{
|
46 |
+
form_id = '#registerform';
|
47 |
+
}
|
48 |
+
|
49 |
+
else {
|
50 |
+
var login_uri = jQuery( '#wsl_login_form_uri' ).val();
|
51 |
+
|
52 |
+
jQuery('body').append( '<form id="loginform" method="post" action="' + login_uri + '"></form>' );
|
53 |
+
|
54 |
+
jQuery('#loginform').append( '<input type="hidden" id="redirect_to" name="redirect_to" value="' + window.location.href + '">' );
|
55 |
+
}
|
56 |
+
}
|
57 |
+
|
58 |
+
jQuery.each( config, function( key, value ){
|
59 |
+
jQuery( '#' + key ).remove();
|
60 |
+
|
61 |
+
jQuery( form_id ).append( '<input type="hidden" id="' + key + '" name="' + key + '" value="' + value + '">' );
|
62 |
+
});
|
63 |
+
|
64 |
+
if( jQuery( '#simplemodal-login-form' ).length )
|
65 |
+
{
|
66 |
+
var current_url = window.location.href;
|
67 |
+
|
68 |
+
jQuery( '#redirect_to' ).remove();
|
69 |
+
|
70 |
+
jQuery( form_id ).append( '<input type="hidden" id="redirect_to" name="redirect_to" value="' + current_url + '">' );
|
71 |
+
}
|
72 |
+
|
73 |
+
jQuery( form_id ).submit();
|
74 |
+
}
|
banner-772x250.png
ADDED
Binary file
|
bin/install-wp-tests.sh
ADDED
@@ -0,0 +1,78 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/usr/bin/env bash
|
2 |
+
|
3 |
+
if [ $# -lt 3 ]; then
|
4 |
+
echo "usage: $0 <db-name> <db-user> <db-pass> [db-host] [wp-version]"
|
5 |
+
exit 1
|
6 |
+
fi
|
7 |
+
|
8 |
+
DB_NAME=$1
|
9 |
+
DB_USER=$2
|
10 |
+
DB_PASS=$3
|
11 |
+
DB_HOST=${4-localhost}
|
12 |
+
WP_VERSION=${5-master}
|
13 |
+
|
14 |
+
WP_TESTS_DIR=${WP_TESTS_DIR-/tmp/wordpress-tests-lib}
|
15 |
+
WP_CORE_DIR=/tmp/wordpress/
|
16 |
+
|
17 |
+
set -ex
|
18 |
+
|
19 |
+
install_wp() {
|
20 |
+
mkdir -p $WP_CORE_DIR
|
21 |
+
|
22 |
+
if [ $WP_VERSION == 'latest' ]; then
|
23 |
+
local ARCHIVE_NAME='latest'
|
24 |
+
else
|
25 |
+
local ARCHIVE_NAME="wordpress-$WP_VERSION"
|
26 |
+
fi
|
27 |
+
|
28 |
+
wget -nv -O /tmp/wordpress.tar.gz https://wordpress.org/${ARCHIVE_NAME}.tar.gz
|
29 |
+
tar --strip-components=1 -zxmf /tmp/wordpress.tar.gz -C $WP_CORE_DIR
|
30 |
+
|
31 |
+
wget -nv -O $WP_CORE_DIR/wp-content/db.php https://raw.github.com/markoheijnen/wp-mysqli/master/db.php
|
32 |
+
}
|
33 |
+
|
34 |
+
install_test_suite() {
|
35 |
+
# portable in-place argument for both GNU sed and Mac OSX sed
|
36 |
+
if [[ $(uname -s) == 'Darwin' ]]; then
|
37 |
+
local ioption='-i ""'
|
38 |
+
else
|
39 |
+
local ioption='-i'
|
40 |
+
fi
|
41 |
+
|
42 |
+
# set up testing suite
|
43 |
+
mkdir -p $WP_TESTS_DIR
|
44 |
+
cd $WP_TESTS_DIR
|
45 |
+
svn co --quiet https://develop.svn.wordpress.org/trunk/tests/phpunit/includes/
|
46 |
+
|
47 |
+
wget -nv -O wp-tests-config.php http://develop.svn.wordpress.org/trunk/wp-tests-config-sample.php
|
48 |
+
sed $ioption "s:dirname( __FILE__ ) . '/src/':'$WP_CORE_DIR':" wp-tests-config.php
|
49 |
+
sed $ioption "s/youremptytestdbnamehere/$DB_NAME/" wp-tests-config.php
|
50 |
+
sed $ioption "s/yourusernamehere/$DB_USER/" wp-tests-config.php
|
51 |
+
sed $ioption "s/yourpasswordhere/$DB_PASS/" wp-tests-config.php
|
52 |
+
sed $ioption "s|localhost|${DB_HOST}|" wp-tests-config.php
|
53 |
+
}
|
54 |
+
|
55 |
+
install_db() {
|
56 |
+
# parse DB_HOST for port or socket references
|
57 |
+
local PARTS=(${DB_HOST//\:/ })
|
58 |
+
local DB_HOSTNAME=${PARTS[0]};
|
59 |
+
local DB_SOCK_OR_PORT=${PARTS[1]};
|
60 |
+
local EXTRA=""
|
61 |
+
|
62 |
+
if ! [ -z $DB_HOSTNAME ] ; then
|
63 |
+
if [[ "$DB_SOCK_OR_PORT" =~ ^[0-9]+$ ]] ; then
|
64 |
+
EXTRA=" --host=$DB_HOSTNAME --port=$DB_SOCK_OR_PORT --protocol=tcp"
|
65 |
+
elif ! [ -z $DB_SOCK_OR_PORT ] ; then
|
66 |
+
EXTRA=" --socket=$DB_SOCK_OR_PORT"
|
67 |
+
elif ! [ -z $DB_HOSTNAME ] ; then
|
68 |
+
EXTRA=" --host=$DB_HOSTNAME --protocol=tcp"
|
69 |
+
fi
|
70 |
+
fi
|
71 |
+
|
72 |
+
# create database
|
73 |
+
mysqladmin create $DB_NAME --user="$DB_USER" --password="$DB_PASS"$EXTRA
|
74 |
+
}
|
75 |
+
|
76 |
+
install_wp
|
77 |
+
install_test_suite
|
78 |
+
install_db
|
hybridauth/Hybrid/Auth.php
CHANGED
@@ -1,380 +1,380 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2014, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Hybrid_Auth class
|
10 |
-
*
|
11 |
-
* Hybrid_Auth class provide a simple way to authenticate users via OpenID and OAuth.
|
12 |
-
*
|
13 |
-
* Generally, Hybrid_Auth is the only class you should instantiate and use throughout your application.
|
14 |
-
*/
|
15 |
-
class Hybrid_Auth
|
16 |
-
{
|
17 |
-
public static $version = "2.4.1-wsl-fork";
|
18 |
-
|
19 |
-
public static $config = array();
|
20 |
-
|
21 |
-
public static $store = NULL;
|
22 |
-
|
23 |
-
public static $error = NULL;
|
24 |
-
|
25 |
-
// --------------------------------------------------------------------
|
26 |
-
|
27 |
-
/**
|
28 |
-
* Try to start a new session of none then initialize Hybrid_Auth
|
29 |
-
*
|
30 |
-
* Hybrid_Auth constructor will require either a valid config array or
|
31 |
-
* a path for a configuration file as parameter. To know more please
|
32 |
-
* refer to the Configuration section:
|
33 |
-
* http://hybridauth.sourceforge.net/userguide/Configuration.html
|
34 |
-
*/
|
35 |
-
function __construct( $config )
|
36 |
-
{
|
37 |
-
Hybrid_Auth::initialize( $config );
|
38 |
-
}
|
39 |
-
|
40 |
-
// --------------------------------------------------------------------
|
41 |
-
|
42 |
-
/**
|
43 |
-
* Try to initialize Hybrid_Auth with given $config hash or file
|
44 |
-
*/
|
45 |
-
public static function initialize( $config )
|
46 |
-
{
|
47 |
-
if( ! is_array( $config ) && ! file_exists( $config ) ){
|
48 |
-
throw new Exception( "Hybriauth config does not exist on the given path.", 1 );
|
49 |
-
}
|
50 |
-
|
51 |
-
if( ! is_array( $config ) ){
|
52 |
-
$config = include $config;
|
53 |
-
}
|
54 |
-
|
55 |
-
// build some need'd paths
|
56 |
-
$path_base = realpath( dirname( __FILE__ ) ) . "/";
|
57 |
-
|
58 |
-
# load hybridauth required files
|
59 |
-
require_once $path_base . "Error.php";
|
60 |
-
require_once $path_base . "Exception.php";
|
61 |
-
|
62 |
-
require_once $path_base . "Provider_Adapter.php";
|
63 |
-
|
64 |
-
require_once $path_base . "Provider_Model.php";
|
65 |
-
require_once $path_base . "Provider_Model_OpenID.php";
|
66 |
-
require_once $path_base . "Provider_Model_OAuth1.php";
|
67 |
-
require_once $path_base . "Provider_Model_OAuth2.php";
|
68 |
-
|
69 |
-
require_once $path_base . "User.php";
|
70 |
-
require_once $path_base . "User_Profile.php";
|
71 |
-
require_once $path_base . "User_Contact.php";
|
72 |
-
require_once $path_base . "User_Activity.php";
|
73 |
-
|
74 |
-
require_once $path_base . "Storage.php";
|
75 |
-
|
76 |
-
// hash given config
|
77 |
-
Hybrid_Auth::$config = $config;
|
78 |
-
|
79 |
-
// instance of errors mng
|
80 |
-
Hybrid_Auth::$error = new Hybrid_Error();
|
81 |
-
|
82 |
-
// start session storage mng
|
83 |
-
Hybrid_Auth::$store = new Hybrid_Storage();
|
84 |
-
|
85 |
-
if( Hybrid_Error::hasError() ){
|
86 |
-
$m = Hybrid_Error::getErrorMessage();
|
87 |
-
$c = Hybrid_Error::getErrorCode();
|
88 |
-
|
89 |
-
Hybrid_Error::clearError();
|
90 |
-
|
91 |
-
throw new Exception( $m, $c );
|
92 |
-
}
|
93 |
-
|
94 |
-
// Endof initialize
|
95 |
-
}
|
96 |
-
|
97 |
-
// --------------------------------------------------------------------
|
98 |
-
|
99 |
-
/**
|
100 |
-
* Hybrid storage system accessors
|
101 |
-
*
|
102 |
-
* Users sessions are stored using HybridAuth storage system ( HybridAuth 2.0 handle PHP Session only) and can be accessed directly by
|
103 |
-
* Hybrid_Auth::storage()->get($key) to retrieves the data for the given key, or calling
|
104 |
-
* Hybrid_Auth::storage()->set($key, $value) to store the key => $value set.
|
105 |
-
*/
|
106 |
-
public static function storage()
|
107 |
-
{
|
108 |
-
return Hybrid_Auth::$store;
|
109 |
-
}
|
110 |
-
|
111 |
-
// --------------------------------------------------------------------
|
112 |
-
|
113 |
-
/**
|
114 |
-
* Get hybridauth session data.
|
115 |
-
*/
|
116 |
-
function getSessionData()
|
117 |
-
{
|
118 |
-
return Hybrid_Auth::storage()->getSessionData();
|
119 |
-
}
|
120 |
-
|
121 |
-
// --------------------------------------------------------------------
|
122 |
-
|
123 |
-
/**
|
124 |
-
* restore hybridauth session data.
|
125 |
-
*/
|
126 |
-
function restoreSessionData( $sessiondata = NULL )
|
127 |
-
{
|
128 |
-
Hybrid_Auth::storage()->restoreSessionData( $sessiondata );
|
129 |
-
}
|
130 |
-
|
131 |
-
// --------------------------------------------------------------------
|
132 |
-
|
133 |
-
/**
|
134 |
-
* Try to authenticate the user with a given provider.
|
135 |
-
*
|
136 |
-
* If the user is already connected we just return and instance of provider adapter,
|
137 |
-
* ELSE, try to authenticate and authorize the user with the provider.
|
138 |
-
*
|
139 |
-
* $params is generally an array with required info in order for this provider and HybridAuth to work,
|
140 |
-
* like :
|
141 |
-
* hauth_return_to: URL to call back after authentication is done
|
142 |
-
* openid_identifier: The OpenID identity provider identifier
|
143 |
-
* google_service: can be "Users" for Google user accounts service or "Apps" for Google hosted Apps
|
144 |
-
*/
|
145 |
-
public static function authenticate( $providerId, $params = NULL )
|
146 |
-
{
|
147 |
-
// if user not connected to $providerId then try setup a new adapter and start the login process for this provider
|
148 |
-
if( ! Hybrid_Auth::storage()->get( "hauth_session.$providerId.is_logged_in" ) ){
|
149 |
-
$provider_adapter = Hybrid_Auth::setup( $providerId, $params );
|
150 |
-
|
151 |
-
$provider_adapter->login();
|
152 |
-
}
|
153 |
-
|
154 |
-
// else, then return the adapter instance for the given provider
|
155 |
-
else{
|
156 |
-
return Hybrid_Auth::getAdapter( $providerId );
|
157 |
-
}
|
158 |
-
}
|
159 |
-
|
160 |
-
// --------------------------------------------------------------------
|
161 |
-
|
162 |
-
/**
|
163 |
-
* Return the adapter instance for an authenticated provider
|
164 |
-
*/
|
165 |
-
public static function getAdapter( $providerId = NULL )
|
166 |
-
{
|
167 |
-
if( ! Hybrid_Auth::$store ) {
|
168 |
-
require_once realpath( dirname( __FILE__ ) ) . "/Storage.php";
|
169 |
-
|
170 |
-
Hybrid_Auth::$store = new Hybrid_Storage();
|
171 |
-
}
|
172 |
-
|
173 |
-
if( ! Hybrid_Auth::$config ) {
|
174 |
-
Hybrid_Auth::initialize( Hybrid_Auth::storage()->config( "CONFIG" ) );
|
175 |
-
}
|
176 |
-
|
177 |
-
return Hybrid_Auth::setup( $providerId );
|
178 |
-
}
|
179 |
-
|
180 |
-
// --------------------------------------------------------------------
|
181 |
-
|
182 |
-
/**
|
183 |
-
* Return the latest api error
|
184 |
-
*/
|
185 |
-
public static function getLatestApiError()
|
186 |
-
{
|
187 |
-
return Hybrid_Error::getErrorMessage();
|
188 |
-
}
|
189 |
-
|
190 |
-
// --------------------------------------------------------------------
|
191 |
-
|
192 |
-
/**
|
193 |
-
* Setup an adapter for a given provider
|
194 |
-
*/
|
195 |
-
public static function setup( $providerId, $params = NULL )
|
196 |
-
{
|
197 |
-
if( ! $params ){
|
198 |
-
$params = Hybrid_Auth::storage()->get( "hauth_session.$providerId.id_provider_params" );
|
199 |
-
}
|
200 |
-
|
201 |
-
if( ! $params ){
|
202 |
-
$params = ARRAY();
|
203 |
-
}
|
204 |
-
|
205 |
-
if( is_array($params) && ! isset( $params["hauth_return_to"] ) ){
|
206 |
-
$params["hauth_return_to"] = Hybrid_Auth::getCurrentUrl();
|
207 |
-
}
|
208 |
-
|
209 |
-
# instantiate a new IDProvider Adapter
|
210 |
-
$provider = new Hybrid_Provider_Adapter();
|
211 |
-
|
212 |
-
$provider->factory( $providerId, $params );
|
213 |
-
|
214 |
-
return $provider;
|
215 |
-
}
|
216 |
-
|
217 |
-
// --------------------------------------------------------------------
|
218 |
-
|
219 |
-
/**
|
220 |
-
* Check if the current user is connected to a given provider
|
221 |
-
*/
|
222 |
-
public static function isConnectedWith( $providerId )
|
223 |
-
{
|
224 |
-
return (bool) Hybrid_Auth::storage()->get( "hauth_session.{$providerId}.is_logged_in" );
|
225 |
-
}
|
226 |
-
|
227 |
-
// --------------------------------------------------------------------
|
228 |
-
|
229 |
-
/**
|
230 |
-
* Return array listing all authenticated providers
|
231 |
-
*/
|
232 |
-
public static function getConnectedProviders()
|
233 |
-
{
|
234 |
-
$idps = array();
|
235 |
-
|
236 |
-
foreach( Hybrid_Auth::$config["providers"] as $idpid => $params ){
|
237 |
-
if( Hybrid_Auth::isConnectedWith( $idpid ) ){
|
238 |
-
$idps[] = $idpid;
|
239 |
-
}
|
240 |
-
}
|
241 |
-
|
242 |
-
return $idps;
|
243 |
-
}
|
244 |
-
|
245 |
-
// --------------------------------------------------------------------
|
246 |
-
|
247 |
-
/**
|
248 |
-
* Return array listing all enabled providers as well as a flag if you are connected.
|
249 |
-
*/
|
250 |
-
public static function getProviders()
|
251 |
-
{
|
252 |
-
$idps = array();
|
253 |
-
|
254 |
-
foreach( Hybrid_Auth::$config["providers"] as $idpid => $params ){
|
255 |
-
if($params['enabled']) {
|
256 |
-
$idps[$idpid] = array( 'connected' => false );
|
257 |
-
|
258 |
-
if( Hybrid_Auth::isConnectedWith( $idpid ) ){
|
259 |
-
$idps[$idpid]['connected'] = true;
|
260 |
-
}
|
261 |
-
}
|
262 |
-
}
|
263 |
-
|
264 |
-
return $idps;
|
265 |
-
}
|
266 |
-
|
267 |
-
// --------------------------------------------------------------------
|
268 |
-
|
269 |
-
/**
|
270 |
-
* A generic function to logout all connected provider at once
|
271 |
-
*/
|
272 |
-
public static function logoutAllProviders()
|
273 |
-
{
|
274 |
-
$idps = Hybrid_Auth::getConnectedProviders();
|
275 |
-
|
276 |
-
foreach( $idps as $idp ){
|
277 |
-
$adapter = Hybrid_Auth::getAdapter( $idp );
|
278 |
-
|
279 |
-
$adapter->logout();
|
280 |
-
}
|
281 |
-
}
|
282 |
-
|
283 |
-
// --------------------------------------------------------------------
|
284 |
-
|
285 |
-
/**
|
286 |
-
* Utility function, redirect to a given URL with php header or using javascript location.href
|
287 |
-
*/
|
288 |
-
public static function redirect( $url, $mode = "PHP" )
|
289 |
-
{
|
290 |
-
if( $mode == "PHP" ){
|
291 |
-
header( "Location: $url" ) ;
|
292 |
-
}
|
293 |
-
elseif( $mode == "JS" ){
|
294 |
-
echo '<html>';
|
295 |
-
echo '<head>';
|
296 |
-
echo '<script type="text/javascript">';
|
297 |
-
echo 'function redirect(){ window.top.location.href="' . $url . '"; }';
|
298 |
-
echo '</script>';
|
299 |
-
echo '</head>';
|
300 |
-
echo '<body onload="redirect()">';
|
301 |
-
echo 'Redirecting, please wait...';
|
302 |
-
echo '</body>';
|
303 |
-
echo '</html>';
|
304 |
-
}
|
305 |
-
|
306 |
-
die();
|
307 |
-
}
|
308 |
-
|
309 |
-
// --------------------------------------------------------------------
|
310 |
-
|
311 |
-
/**
|
312 |
-
* Utility function, return the current url. TRUE to get $_SERVER['REQUEST_URI'], FALSE for $_SERVER['PHP_SELF']
|
313 |
-
*/
|
314 |
-
public static function getCurrentUrl( $request_uri = true )
|
315 |
-
{
|
316 |
-
$wsl_is_https_on = false;
|
317 |
-
|
318 |
-
if( ! empty ( $_SERVER ['SERVER_PORT'] ) )
|
319 |
-
{
|
320 |
-
if(trim ( $_SERVER ['SERVER_PORT'] ) == '443')
|
321 |
-
{
|
322 |
-
$wsl_is_https_on = true;
|
323 |
-
}
|
324 |
-
}
|
325 |
-
|
326 |
-
if ( ! empty ( $_SERVER ['HTTP_X_FORWARDED_PROTO'] ) )
|
327 |
-
{
|
328 |
-
if(strtolower (trim ($_SERVER ['HTTP_X_FORWARDED_PROTO'])) == 'https')
|
329 |
-
{
|
330 |
-
$wsl_is_https_on = true;
|
331 |
-
}
|
332 |
-
}
|
333 |
-
|
334 |
-
if( ! empty ( $_SERVER ['HTTPS'] ) )
|
335 |
-
{
|
336 |
-
if ( strtolower( trim($_SERVER ['HTTPS'] ) ) == 'on' OR trim ($_SERVER ['HTTPS']) == '1')
|
337 |
-
{
|
338 |
-
$wsl_is_https_on = true;
|
339 |
-
}
|
340 |
-
}
|
341 |
-
|
342 |
-
//Extract parts
|
343 |
-
$request_uri = (isset ($_SERVER ['REQUEST_URI']) ? $_SERVER ['REQUEST_URI'] : $_SERVER ['PHP_SELF']);
|
344 |
-
$request_protocol = ( $wsl_is_https_on ? 'https' : 'http');
|
345 |
-
$request_host = (isset ($_SERVER ['HTTP_X_FORWARDED_HOST']) ? $_SERVER ['HTTP_X_FORWARDED_HOST'] : (isset ($_SERVER ['HTTP_HOST']) ? $_SERVER ['HTTP_HOST'] : $_SERVER ['SERVER_NAME']));
|
346 |
-
|
347 |
-
//Port of this request
|
348 |
-
$request_port = '';
|
349 |
-
|
350 |
-
//We are using a proxy
|
351 |
-
if( isset( $_SERVER ['HTTP_X_FORWARDED_PORT'] ) )
|
352 |
-
{
|
353 |
-
// SERVER_PORT is usually wrong on proxies, don't use it!
|
354 |
-
$request_port = intval($_SERVER ['HTTP_X_FORWARDED_PORT']);
|
355 |
-
}
|
356 |
-
//Does not seem like a proxy
|
357 |
-
elseif( isset( $_SERVER ['SERVER_PORT'] ) )
|
358 |
-
{
|
359 |
-
$request_port = intval($_SERVER ['SERVER_PORT']);
|
360 |
-
}
|
361 |
-
|
362 |
-
//Remove standard ports
|
363 |
-
$request_port = (!in_array($request_port, array (80, 443)) ? $request_port : '');
|
364 |
-
|
365 |
-
//Build url
|
366 |
-
$current_url = $request_protocol . '://' . $request_host . ( ! empty ($request_port) ? (':'.$request_port) : '');
|
367 |
-
|
368 |
-
if( $request_uri )
|
369 |
-
{
|
370 |
-
$current_url .= $request_uri;
|
371 |
-
}
|
372 |
-
else
|
373 |
-
{
|
374 |
-
$current_url .= $_SERVER ['PHP_SELF'];
|
375 |
-
}
|
376 |
-
|
377 |
-
//Done
|
378 |
-
return $current_url;
|
379 |
-
}
|
380 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2014, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Hybrid_Auth class
|
10 |
+
*
|
11 |
+
* Hybrid_Auth class provide a simple way to authenticate users via OpenID and OAuth.
|
12 |
+
*
|
13 |
+
* Generally, Hybrid_Auth is the only class you should instantiate and use throughout your application.
|
14 |
+
*/
|
15 |
+
class Hybrid_Auth
|
16 |
+
{
|
17 |
+
public static $version = "2.4.1-wsl-fork";
|
18 |
+
|
19 |
+
public static $config = array();
|
20 |
+
|
21 |
+
public static $store = NULL;
|
22 |
+
|
23 |
+
public static $error = NULL;
|
24 |
+
|
25 |
+
// --------------------------------------------------------------------
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Try to start a new session of none then initialize Hybrid_Auth
|
29 |
+
*
|
30 |
+
* Hybrid_Auth constructor will require either a valid config array or
|
31 |
+
* a path for a configuration file as parameter. To know more please
|
32 |
+
* refer to the Configuration section:
|
33 |
+
* http://hybridauth.sourceforge.net/userguide/Configuration.html
|
34 |
+
*/
|
35 |
+
function __construct( $config )
|
36 |
+
{
|
37 |
+
Hybrid_Auth::initialize( $config );
|
38 |
+
}
|
39 |
+
|
40 |
+
// --------------------------------------------------------------------
|
41 |
+
|
42 |
+
/**
|
43 |
+
* Try to initialize Hybrid_Auth with given $config hash or file
|
44 |
+
*/
|
45 |
+
public static function initialize( $config )
|
46 |
+
{
|
47 |
+
if( ! is_array( $config ) && ! file_exists( $config ) ){
|
48 |
+
throw new Exception( "Hybriauth config does not exist on the given path.", 1 );
|
49 |
+
}
|
50 |
+
|
51 |
+
if( ! is_array( $config ) ){
|
52 |
+
$config = include $config;
|
53 |
+
}
|
54 |
+
|
55 |
+
// build some need'd paths
|
56 |
+
$path_base = realpath( dirname( __FILE__ ) ) . "/";
|
57 |
+
|
58 |
+
# load hybridauth required files
|
59 |
+
require_once $path_base . "Error.php";
|
60 |
+
require_once $path_base . "Exception.php";
|
61 |
+
|
62 |
+
require_once $path_base . "Provider_Adapter.php";
|
63 |
+
|
64 |
+
require_once $path_base . "Provider_Model.php";
|
65 |
+
require_once $path_base . "Provider_Model_OpenID.php";
|
66 |
+
require_once $path_base . "Provider_Model_OAuth1.php";
|
67 |
+
require_once $path_base . "Provider_Model_OAuth2.php";
|
68 |
+
|
69 |
+
require_once $path_base . "User.php";
|
70 |
+
require_once $path_base . "User_Profile.php";
|
71 |
+
require_once $path_base . "User_Contact.php";
|
72 |
+
require_once $path_base . "User_Activity.php";
|
73 |
+
|
74 |
+
require_once $path_base . "Storage.php";
|
75 |
+
|
76 |
+
// hash given config
|
77 |
+
Hybrid_Auth::$config = $config;
|
78 |
+
|
79 |
+
// instance of errors mng
|
80 |
+
Hybrid_Auth::$error = new Hybrid_Error();
|
81 |
+
|
82 |
+
// start session storage mng
|
83 |
+
Hybrid_Auth::$store = new Hybrid_Storage();
|
84 |
+
|
85 |
+
if( Hybrid_Error::hasError() ){
|
86 |
+
$m = Hybrid_Error::getErrorMessage();
|
87 |
+
$c = Hybrid_Error::getErrorCode();
|
88 |
+
|
89 |
+
Hybrid_Error::clearError();
|
90 |
+
|
91 |
+
throw new Exception( $m, $c );
|
92 |
+
}
|
93 |
+
|
94 |
+
// Endof initialize
|
95 |
+
}
|
96 |
+
|
97 |
+
// --------------------------------------------------------------------
|
98 |
+
|
99 |
+
/**
|
100 |
+
* Hybrid storage system accessors
|
101 |
+
*
|
102 |
+
* Users sessions are stored using HybridAuth storage system ( HybridAuth 2.0 handle PHP Session only) and can be accessed directly by
|
103 |
+
* Hybrid_Auth::storage()->get($key) to retrieves the data for the given key, or calling
|
104 |
+
* Hybrid_Auth::storage()->set($key, $value) to store the key => $value set.
|
105 |
+
*/
|
106 |
+
public static function storage()
|
107 |
+
{
|
108 |
+
return Hybrid_Auth::$store;
|
109 |
+
}
|
110 |
+
|
111 |
+
// --------------------------------------------------------------------
|
112 |
+
|
113 |
+
/**
|
114 |
+
* Get hybridauth session data.
|
115 |
+
*/
|
116 |
+
function getSessionData()
|
117 |
+
{
|
118 |
+
return Hybrid_Auth::storage()->getSessionData();
|
119 |
+
}
|
120 |
+
|
121 |
+
// --------------------------------------------------------------------
|
122 |
+
|
123 |
+
/**
|
124 |
+
* restore hybridauth session data.
|
125 |
+
*/
|
126 |
+
function restoreSessionData( $sessiondata = NULL )
|
127 |
+
{
|
128 |
+
Hybrid_Auth::storage()->restoreSessionData( $sessiondata );
|
129 |
+
}
|
130 |
+
|
131 |
+
// --------------------------------------------------------------------
|
132 |
+
|
133 |
+
/**
|
134 |
+
* Try to authenticate the user with a given provider.
|
135 |
+
*
|
136 |
+
* If the user is already connected we just return and instance of provider adapter,
|
137 |
+
* ELSE, try to authenticate and authorize the user with the provider.
|
138 |
+
*
|
139 |
+
* $params is generally an array with required info in order for this provider and HybridAuth to work,
|
140 |
+
* like :
|
141 |
+
* hauth_return_to: URL to call back after authentication is done
|
142 |
+
* openid_identifier: The OpenID identity provider identifier
|
143 |
+
* google_service: can be "Users" for Google user accounts service or "Apps" for Google hosted Apps
|
144 |
+
*/
|
145 |
+
public static function authenticate( $providerId, $params = NULL )
|
146 |
+
{
|
147 |
+
// if user not connected to $providerId then try setup a new adapter and start the login process for this provider
|
148 |
+
if( ! Hybrid_Auth::storage()->get( "hauth_session.$providerId.is_logged_in" ) ){
|
149 |
+
$provider_adapter = Hybrid_Auth::setup( $providerId, $params );
|
150 |
+
|
151 |
+
$provider_adapter->login();
|
152 |
+
}
|
153 |
+
|
154 |
+
// else, then return the adapter instance for the given provider
|
155 |
+
else{
|
156 |
+
return Hybrid_Auth::getAdapter( $providerId );
|
157 |
+
}
|
158 |
+
}
|
159 |
+
|
160 |
+
// --------------------------------------------------------------------
|
161 |
+
|
162 |
+
/**
|
163 |
+
* Return the adapter instance for an authenticated provider
|
164 |
+
*/
|
165 |
+
public static function getAdapter( $providerId = NULL )
|
166 |
+
{
|
167 |
+
if( ! Hybrid_Auth::$store ) {
|
168 |
+
require_once realpath( dirname( __FILE__ ) ) . "/Storage.php";
|
169 |
+
|
170 |
+
Hybrid_Auth::$store = new Hybrid_Storage();
|
171 |
+
}
|
172 |
+
|
173 |
+
if( ! Hybrid_Auth::$config ) {
|
174 |
+
Hybrid_Auth::initialize( Hybrid_Auth::storage()->config( "CONFIG" ) );
|
175 |
+
}
|
176 |
+
|
177 |
+
return Hybrid_Auth::setup( $providerId );
|
178 |
+
}
|
179 |
+
|
180 |
+
// --------------------------------------------------------------------
|
181 |
+
|
182 |
+
/**
|
183 |
+
* Return the latest api error
|
184 |
+
*/
|
185 |
+
public static function getLatestApiError()
|
186 |
+
{
|
187 |
+
return Hybrid_Error::getErrorMessage();
|
188 |
+
}
|
189 |
+
|
190 |
+
// --------------------------------------------------------------------
|
191 |
+
|
192 |
+
/**
|
193 |
+
* Setup an adapter for a given provider
|
194 |
+
*/
|
195 |
+
public static function setup( $providerId, $params = NULL )
|
196 |
+
{
|
197 |
+
if( ! $params ){
|
198 |
+
$params = Hybrid_Auth::storage()->get( "hauth_session.$providerId.id_provider_params" );
|
199 |
+
}
|
200 |
+
|
201 |
+
if( ! $params ){
|
202 |
+
$params = ARRAY();
|
203 |
+
}
|
204 |
+
|
205 |
+
if( is_array($params) && ! isset( $params["hauth_return_to"] ) ){
|
206 |
+
$params["hauth_return_to"] = Hybrid_Auth::getCurrentUrl();
|
207 |
+
}
|
208 |
+
|
209 |
+
# instantiate a new IDProvider Adapter
|
210 |
+
$provider = new Hybrid_Provider_Adapter();
|
211 |
+
|
212 |
+
$provider->factory( $providerId, $params );
|
213 |
+
|
214 |
+
return $provider;
|
215 |
+
}
|
216 |
+
|
217 |
+
// --------------------------------------------------------------------
|
218 |
+
|
219 |
+
/**
|
220 |
+
* Check if the current user is connected to a given provider
|
221 |
+
*/
|
222 |
+
public static function isConnectedWith( $providerId )
|
223 |
+
{
|
224 |
+
return (bool) Hybrid_Auth::storage()->get( "hauth_session.{$providerId}.is_logged_in" );
|
225 |
+
}
|
226 |
+
|
227 |
+
// --------------------------------------------------------------------
|
228 |
+
|
229 |
+
/**
|
230 |
+
* Return array listing all authenticated providers
|
231 |
+
*/
|
232 |
+
public static function getConnectedProviders()
|
233 |
+
{
|
234 |
+
$idps = array();
|
235 |
+
|
236 |
+
foreach( Hybrid_Auth::$config["providers"] as $idpid => $params ){
|
237 |
+
if( Hybrid_Auth::isConnectedWith( $idpid ) ){
|
238 |
+
$idps[] = $idpid;
|
239 |
+
}
|
240 |
+
}
|
241 |
+
|
242 |
+
return $idps;
|
243 |
+
}
|
244 |
+
|
245 |
+
// --------------------------------------------------------------------
|
246 |
+
|
247 |
+
/**
|
248 |
+
* Return array listing all enabled providers as well as a flag if you are connected.
|
249 |
+
*/
|
250 |
+
public static function getProviders()
|
251 |
+
{
|
252 |
+
$idps = array();
|
253 |
+
|
254 |
+
foreach( Hybrid_Auth::$config["providers"] as $idpid => $params ){
|
255 |
+
if($params['enabled']) {
|
256 |
+
$idps[$idpid] = array( 'connected' => false );
|
257 |
+
|
258 |
+
if( Hybrid_Auth::isConnectedWith( $idpid ) ){
|
259 |
+
$idps[$idpid]['connected'] = true;
|
260 |
+
}
|
261 |
+
}
|
262 |
+
}
|
263 |
+
|
264 |
+
return $idps;
|
265 |
+
}
|
266 |
+
|
267 |
+
// --------------------------------------------------------------------
|
268 |
+
|
269 |
+
/**
|
270 |
+
* A generic function to logout all connected provider at once
|
271 |
+
*/
|
272 |
+
public static function logoutAllProviders()
|
273 |
+
{
|
274 |
+
$idps = Hybrid_Auth::getConnectedProviders();
|
275 |
+
|
276 |
+
foreach( $idps as $idp ){
|
277 |
+
$adapter = Hybrid_Auth::getAdapter( $idp );
|
278 |
+
|
279 |
+
$adapter->logout();
|
280 |
+
}
|
281 |
+
}
|
282 |
+
|
283 |
+
// --------------------------------------------------------------------
|
284 |
+
|
285 |
+
/**
|
286 |
+
* Utility function, redirect to a given URL with php header or using javascript location.href
|
287 |
+
*/
|
288 |
+
public static function redirect( $url, $mode = "PHP" )
|
289 |
+
{
|
290 |
+
if( $mode == "PHP" ){
|
291 |
+
header( "Location: $url" ) ;
|
292 |
+
}
|
293 |
+
elseif( $mode == "JS" ){
|
294 |
+
echo '<html>';
|
295 |
+
echo '<head>';
|
296 |
+
echo '<script type="text/javascript">';
|
297 |
+
echo 'function redirect(){ window.top.location.href="' . $url . '"; }';
|
298 |
+
echo '</script>';
|
299 |
+
echo '</head>';
|
300 |
+
echo '<body onload="redirect()">';
|
301 |
+
echo 'Redirecting, please wait...';
|
302 |
+
echo '</body>';
|
303 |
+
echo '</html>';
|
304 |
+
}
|
305 |
+
|
306 |
+
die();
|
307 |
+
}
|
308 |
+
|
309 |
+
// --------------------------------------------------------------------
|
310 |
+
|
311 |
+
/**
|
312 |
+
* Utility function, return the current url. TRUE to get $_SERVER['REQUEST_URI'], FALSE for $_SERVER['PHP_SELF']
|
313 |
+
*/
|
314 |
+
public static function getCurrentUrl( $request_uri = true )
|
315 |
+
{
|
316 |
+
$wsl_is_https_on = false;
|
317 |
+
|
318 |
+
if( ! empty ( $_SERVER ['SERVER_PORT'] ) )
|
319 |
+
{
|
320 |
+
if(trim ( $_SERVER ['SERVER_PORT'] ) == '443')
|
321 |
+
{
|
322 |
+
$wsl_is_https_on = true;
|
323 |
+
}
|
324 |
+
}
|
325 |
+
|
326 |
+
if ( ! empty ( $_SERVER ['HTTP_X_FORWARDED_PROTO'] ) )
|
327 |
+
{
|
328 |
+
if(strtolower (trim ($_SERVER ['HTTP_X_FORWARDED_PROTO'])) == 'https')
|
329 |
+
{
|
330 |
+
$wsl_is_https_on = true;
|
331 |
+
}
|
332 |
+
}
|
333 |
+
|
334 |
+
if( ! empty ( $_SERVER ['HTTPS'] ) )
|
335 |
+
{
|
336 |
+
if ( strtolower( trim($_SERVER ['HTTPS'] ) ) == 'on' OR trim ($_SERVER ['HTTPS']) == '1')
|
337 |
+
{
|
338 |
+
$wsl_is_https_on = true;
|
339 |
+
}
|
340 |
+
}
|
341 |
+
|
342 |
+
//Extract parts
|
343 |
+
$request_uri = (isset ($_SERVER ['REQUEST_URI']) ? $_SERVER ['REQUEST_URI'] : $_SERVER ['PHP_SELF']);
|
344 |
+
$request_protocol = ( $wsl_is_https_on ? 'https' : 'http');
|
345 |
+
$request_host = (isset ($_SERVER ['HTTP_X_FORWARDED_HOST']) ? $_SERVER ['HTTP_X_FORWARDED_HOST'] : (isset ($_SERVER ['HTTP_HOST']) ? $_SERVER ['HTTP_HOST'] : $_SERVER ['SERVER_NAME']));
|
346 |
+
|
347 |
+
//Port of this request
|
348 |
+
$request_port = '';
|
349 |
+
|
350 |
+
//We are using a proxy
|
351 |
+
if( isset( $_SERVER ['HTTP_X_FORWARDED_PORT'] ) )
|
352 |
+
{
|
353 |
+
// SERVER_PORT is usually wrong on proxies, don't use it!
|
354 |
+
$request_port = intval($_SERVER ['HTTP_X_FORWARDED_PORT']);
|
355 |
+
}
|
356 |
+
//Does not seem like a proxy
|
357 |
+
elseif( isset( $_SERVER ['SERVER_PORT'] ) )
|
358 |
+
{
|
359 |
+
$request_port = intval($_SERVER ['SERVER_PORT']);
|
360 |
+
}
|
361 |
+
|
362 |
+
//Remove standard ports
|
363 |
+
$request_port = (!in_array($request_port, array (80, 443)) ? $request_port : '');
|
364 |
+
|
365 |
+
//Build url
|
366 |
+
$current_url = $request_protocol . '://' . $request_host . ( ! empty ($request_port) ? (':'.$request_port) : '');
|
367 |
+
|
368 |
+
if( $request_uri )
|
369 |
+
{
|
370 |
+
$current_url .= $request_uri;
|
371 |
+
}
|
372 |
+
else
|
373 |
+
{
|
374 |
+
$current_url .= $_SERVER ['PHP_SELF'];
|
375 |
+
}
|
376 |
+
|
377 |
+
//Done
|
378 |
+
return $current_url;
|
379 |
+
}
|
380 |
+
}
|
hybridauth/Hybrid/Endpoint.php
CHANGED
@@ -1,200 +1,200 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2014, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Hybrid_Endpoint class
|
10 |
-
*
|
11 |
-
* Hybrid_Endpoint class provides a simple way to handle the OpenID and OAuth endpoint.
|
12 |
-
*/
|
13 |
-
class Hybrid_Endpoint
|
14 |
-
{
|
15 |
-
public static $request = NULL;
|
16 |
-
public static $initDone = FALSE;
|
17 |
-
|
18 |
-
/**
|
19 |
-
* Process the current request
|
20 |
-
*
|
21 |
-
* $request - The current request parameters. Leave as NULL to default to use $_REQUEST.
|
22 |
-
*/
|
23 |
-
public static function process( $request = NULL )
|
24 |
-
{
|
25 |
-
// Setup request variable
|
26 |
-
Hybrid_Endpoint::$request = $request;
|
27 |
-
|
28 |
-
if ( is_null(Hybrid_Endpoint::$request) ){
|
29 |
-
// Fix a strange behavior when some provider call back ha endpoint
|
30 |
-
// with /index.php?hauth.done={provider}?{args}...
|
31 |
-
// >here we need to recreate the $_REQUEST
|
32 |
-
if ( strrpos( $_SERVER["QUERY_STRING"], '?' ) ) {
|
33 |
-
$_SERVER["QUERY_STRING"] = str_replace( "?", "&", $_SERVER["QUERY_STRING"] );
|
34 |
-
|
35 |
-
parse_str( $_SERVER["QUERY_STRING"], $_REQUEST );
|
36 |
-
}
|
37 |
-
|
38 |
-
Hybrid_Endpoint::$request = $_REQUEST;
|
39 |
-
}
|
40 |
-
|
41 |
-
// If openid_policy requested, we return our policy document
|
42 |
-
if ( isset( Hybrid_Endpoint::$request["get"] ) && Hybrid_Endpoint::$request["get"] == "openid_policy" ) {
|
43 |
-
Hybrid_Endpoint::processOpenidPolicy();
|
44 |
-
}
|
45 |
-
|
46 |
-
// If openid_xrds requested, we return our XRDS document
|
47 |
-
if ( isset( Hybrid_Endpoint::$request["get"] ) && Hybrid_Endpoint::$request["get"] == "openid_xrds" ) {
|
48 |
-
Hybrid_Endpoint::processOpenidXRDS();
|
49 |
-
}
|
50 |
-
|
51 |
-
// If we get a hauth.start
|
52 |
-
if ( isset( Hybrid_Endpoint::$request["hauth_start"] ) && Hybrid_Endpoint::$request["hauth_start"] ) {
|
53 |
-
Hybrid_Endpoint::processAuthStart();
|
54 |
-
}
|
55 |
-
// Else if hauth.done
|
56 |
-
elseif ( isset( Hybrid_Endpoint::$request["hauth_done"] ) && Hybrid_Endpoint::$request["hauth_done"] ) {
|
57 |
-
Hybrid_Endpoint::processAuthDone();
|
58 |
-
}
|
59 |
-
// Else we advertise our XRDS document, something supposed to be done from the Realm URL page
|
60 |
-
else {
|
61 |
-
Hybrid_Endpoint::processOpenidRealm();
|
62 |
-
}
|
63 |
-
}
|
64 |
-
|
65 |
-
/**
|
66 |
-
* Process OpenID policy request
|
67 |
-
*/
|
68 |
-
public static function processOpenidPolicy()
|
69 |
-
{
|
70 |
-
$output = file_get_contents( dirname(__FILE__) . "/resources/openid_policy.html" );
|
71 |
-
print $output;
|
72 |
-
die();
|
73 |
-
}
|
74 |
-
|
75 |
-
/**
|
76 |
-
* Process OpenID XRDS request
|
77 |
-
*/
|
78 |
-
public static function processOpenidXRDS()
|
79 |
-
{
|
80 |
-
header("Content-Type: application/xrds+xml");
|
81 |
-
|
82 |
-
$output = str_replace
|
83 |
-
(
|
84 |
-
"{RETURN_TO_URL}",
|
85 |
-
str_replace(
|
86 |
-
array("<", ">", "\"", "'", "&"), array("<", ">", """, "'", "&"),
|
87 |
-
Hybrid_Auth::getCurrentUrl( false )
|
88 |
-
),
|
89 |
-
file_get_contents( dirname(__FILE__) . "/resources/openid_xrds.xml" )
|
90 |
-
);
|
91 |
-
print $output;
|
92 |
-
die();
|
93 |
-
}
|
94 |
-
|
95 |
-
/**
|
96 |
-
* Process OpenID realm request
|
97 |
-
*/
|
98 |
-
public static function processOpenidRealm()
|
99 |
-
{
|
100 |
-
$output = str_replace
|
101 |
-
(
|
102 |
-
"{X_XRDS_LOCATION}",
|
103 |
-
htmlentities( Hybrid_Auth::getCurrentUrl( false ), ENT_QUOTES, 'UTF-8' ) . "?get=openid_xrds&v=" . Hybrid_Auth::$version,
|
104 |
-
file_get_contents( dirname(__FILE__) . "/resources/openid_realm.html" )
|
105 |
-
);
|
106 |
-
print $output;
|
107 |
-
die();
|
108 |
-
}
|
109 |
-
|
110 |
-
/**
|
111 |
-
* define:endpoint step 3.
|
112 |
-
*/
|
113 |
-
public static function processAuthStart()
|
114 |
-
{
|
115 |
-
Hybrid_Endpoint::authInit();
|
116 |
-
|
117 |
-
$provider_id = trim( strip_tags( Hybrid_Endpoint::$request["hauth_start"] ) );
|
118 |
-
|
119 |
-
# check if page accessed directly
|
120 |
-
if( ! Hybrid_Auth::storage()->get( "hauth_session.$provider_id.hauth_endpoint" ) ) {
|
121 |
-
throw new Hybrid_Exception( "You cannot access this page directly." );
|
122 |
-
}
|
123 |
-
|
124 |
-
# define:hybrid.endpoint.php step 2.
|
125 |
-
$hauth = Hybrid_Auth::setup( $provider_id );
|
126 |
-
|
127 |
-
# if REQUESTed hauth_idprovider is wrong, session not created, etc.
|
128 |
-
if( ! $hauth ) {
|
129 |
-
throw new Hybrid_Exception( "Invalid parameter! Please return to the login page and try again." );
|
130 |
-
}
|
131 |
-
|
132 |
-
try {
|
133 |
-
$hauth->adapter->loginBegin();
|
134 |
-
}
|
135 |
-
catch ( Exception $e ) {
|
136 |
-
Hybrid_Error::setError( $e->getMessage(), $e->getCode() );
|
137 |
-
|
138 |
-
$hauth->returnToCallbackUrl();
|
139 |
-
}
|
140 |
-
|
141 |
-
die();
|
142 |
-
}
|
143 |
-
|
144 |
-
/**
|
145 |
-
* define:endpoint step 3.1 and 3.2
|
146 |
-
*/
|
147 |
-
public static function processAuthDone()
|
148 |
-
{
|
149 |
-
Hybrid_Endpoint::authInit();
|
150 |
-
|
151 |
-
$provider_id = trim( strip_tags( Hybrid_Endpoint::$request["hauth_done"] ) );
|
152 |
-
|
153 |
-
# check if page accessed directly
|
154 |
-
if( ! Hybrid_Auth::storage()->get( "hauth_session.$provider_id.hauth_endpoint" ) ) {
|
155 |
-
throw new Hybrid_Exception( "You cannot access this page directly." );
|
156 |
-
}
|
157 |
-
|
158 |
-
$hauth = Hybrid_Auth::setup( $provider_id );
|
159 |
-
|
160 |
-
if( ! $hauth ) {
|
161 |
-
$hauth->adapter->setUserUnconnected();
|
162 |
-
|
163 |
-
throw new Hybrid_Exception( "Invalid parameter! Please return to the login page and try again." );
|
164 |
-
}
|
165 |
-
|
166 |
-
try {
|
167 |
-
$hauth->adapter->loginFinish();
|
168 |
-
}
|
169 |
-
catch( Exception $e ){
|
170 |
-
Hybrid_Error::setError( $e->getMessage(), $e->getCode() );
|
171 |
-
|
172 |
-
$hauth->adapter->setUserUnconnected();
|
173 |
-
}
|
174 |
-
|
175 |
-
$hauth->returnToCallbackUrl();
|
176 |
-
die();
|
177 |
-
}
|
178 |
-
|
179 |
-
public static function authInit()
|
180 |
-
{
|
181 |
-
if ( ! Hybrid_Endpoint::$initDone) {
|
182 |
-
Hybrid_Endpoint::$initDone = TRUE;
|
183 |
-
|
184 |
-
# Init Hybrid_Auth
|
185 |
-
try {
|
186 |
-
$storage = new Hybrid_Storage();
|
187 |
-
|
188 |
-
// Check if Hybrid_Auth session already exist
|
189 |
-
if ( ! $storage->config( "CONFIG" ) ){
|
190 |
-
throw new Hybrid_Exception( "You cannot access this page directly." );
|
191 |
-
}
|
192 |
-
|
193 |
-
Hybrid_Auth::initialize( $storage->config( "CONFIG" ) );
|
194 |
-
}
|
195 |
-
catch ( Exception $e ){
|
196 |
-
throw new Hybrid_Exception( "Oophs. Error!" );
|
197 |
-
}
|
198 |
-
}
|
199 |
-
}
|
200 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2014, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Hybrid_Endpoint class
|
10 |
+
*
|
11 |
+
* Hybrid_Endpoint class provides a simple way to handle the OpenID and OAuth endpoint.
|
12 |
+
*/
|
13 |
+
class Hybrid_Endpoint
|
14 |
+
{
|
15 |
+
public static $request = NULL;
|
16 |
+
public static $initDone = FALSE;
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Process the current request
|
20 |
+
*
|
21 |
+
* $request - The current request parameters. Leave as NULL to default to use $_REQUEST.
|
22 |
+
*/
|
23 |
+
public static function process( $request = NULL )
|
24 |
+
{
|
25 |
+
// Setup request variable
|
26 |
+
Hybrid_Endpoint::$request = $request;
|
27 |
+
|
28 |
+
if ( is_null(Hybrid_Endpoint::$request) ){
|
29 |
+
// Fix a strange behavior when some provider call back ha endpoint
|
30 |
+
// with /index.php?hauth.done={provider}?{args}...
|
31 |
+
// >here we need to recreate the $_REQUEST
|
32 |
+
if ( strrpos( $_SERVER["QUERY_STRING"], '?' ) ) {
|
33 |
+
$_SERVER["QUERY_STRING"] = str_replace( "?", "&", $_SERVER["QUERY_STRING"] );
|
34 |
+
|
35 |
+
parse_str( $_SERVER["QUERY_STRING"], $_REQUEST );
|
36 |
+
}
|
37 |
+
|
38 |
+
Hybrid_Endpoint::$request = $_REQUEST;
|
39 |
+
}
|
40 |
+
|
41 |
+
// If openid_policy requested, we return our policy document
|
42 |
+
if ( isset( Hybrid_Endpoint::$request["get"] ) && Hybrid_Endpoint::$request["get"] == "openid_policy" ) {
|
43 |
+
Hybrid_Endpoint::processOpenidPolicy();
|
44 |
+
}
|
45 |
+
|
46 |
+
// If openid_xrds requested, we return our XRDS document
|
47 |
+
if ( isset( Hybrid_Endpoint::$request["get"] ) && Hybrid_Endpoint::$request["get"] == "openid_xrds" ) {
|
48 |
+
Hybrid_Endpoint::processOpenidXRDS();
|
49 |
+
}
|
50 |
+
|
51 |
+
// If we get a hauth.start
|
52 |
+
if ( isset( Hybrid_Endpoint::$request["hauth_start"] ) && Hybrid_Endpoint::$request["hauth_start"] ) {
|
53 |
+
Hybrid_Endpoint::processAuthStart();
|
54 |
+
}
|
55 |
+
// Else if hauth.done
|
56 |
+
elseif ( isset( Hybrid_Endpoint::$request["hauth_done"] ) && Hybrid_Endpoint::$request["hauth_done"] ) {
|
57 |
+
Hybrid_Endpoint::processAuthDone();
|
58 |
+
}
|
59 |
+
// Else we advertise our XRDS document, something supposed to be done from the Realm URL page
|
60 |
+
else {
|
61 |
+
Hybrid_Endpoint::processOpenidRealm();
|
62 |
+
}
|
63 |
+
}
|
64 |
+
|
65 |
+
/**
|
66 |
+
* Process OpenID policy request
|
67 |
+
*/
|
68 |
+
public static function processOpenidPolicy()
|
69 |
+
{
|
70 |
+
$output = file_get_contents( dirname(__FILE__) . "/resources/openid_policy.html" );
|
71 |
+
print $output;
|
72 |
+
die();
|
73 |
+
}
|
74 |
+
|
75 |
+
/**
|
76 |
+
* Process OpenID XRDS request
|
77 |
+
*/
|
78 |
+
public static function processOpenidXRDS()
|
79 |
+
{
|
80 |
+
header("Content-Type: application/xrds+xml");
|
81 |
+
|
82 |
+
$output = str_replace
|
83 |
+
(
|
84 |
+
"{RETURN_TO_URL}",
|
85 |
+
str_replace(
|
86 |
+
array("<", ">", "\"", "'", "&"), array("<", ">", """, "'", "&"),
|
87 |
+
Hybrid_Auth::getCurrentUrl( false )
|
88 |
+
),
|
89 |
+
file_get_contents( dirname(__FILE__) . "/resources/openid_xrds.xml" )
|
90 |
+
);
|
91 |
+
print $output;
|
92 |
+
die();
|
93 |
+
}
|
94 |
+
|
95 |
+
/**
|
96 |
+
* Process OpenID realm request
|
97 |
+
*/
|
98 |
+
public static function processOpenidRealm()
|
99 |
+
{
|
100 |
+
$output = str_replace
|
101 |
+
(
|
102 |
+
"{X_XRDS_LOCATION}",
|
103 |
+
htmlentities( Hybrid_Auth::getCurrentUrl( false ), ENT_QUOTES, 'UTF-8' ) . "?get=openid_xrds&v=" . Hybrid_Auth::$version,
|
104 |
+
file_get_contents( dirname(__FILE__) . "/resources/openid_realm.html" )
|
105 |
+
);
|
106 |
+
print $output;
|
107 |
+
die();
|
108 |
+
}
|
109 |
+
|
110 |
+
/**
|
111 |
+
* define:endpoint step 3.
|
112 |
+
*/
|
113 |
+
public static function processAuthStart()
|
114 |
+
{
|
115 |
+
Hybrid_Endpoint::authInit();
|
116 |
+
|
117 |
+
$provider_id = trim( strip_tags( Hybrid_Endpoint::$request["hauth_start"] ) );
|
118 |
+
|
119 |
+
# check if page accessed directly
|
120 |
+
if( ! Hybrid_Auth::storage()->get( "hauth_session.$provider_id.hauth_endpoint" ) ) {
|
121 |
+
throw new Hybrid_Exception( "You cannot access this page directly." );
|
122 |
+
}
|
123 |
+
|
124 |
+
# define:hybrid.endpoint.php step 2.
|
125 |
+
$hauth = Hybrid_Auth::setup( $provider_id );
|
126 |
+
|
127 |
+
# if REQUESTed hauth_idprovider is wrong, session not created, etc.
|
128 |
+
if( ! $hauth ) {
|
129 |
+
throw new Hybrid_Exception( "Invalid parameter! Please return to the login page and try again." );
|
130 |
+
}
|
131 |
+
|
132 |
+
try {
|
133 |
+
$hauth->adapter->loginBegin();
|
134 |
+
}
|
135 |
+
catch ( Exception $e ) {
|
136 |
+
Hybrid_Error::setError( $e->getMessage(), $e->getCode() );
|
137 |
+
|
138 |
+
$hauth->returnToCallbackUrl();
|
139 |
+
}
|
140 |
+
|
141 |
+
die();
|
142 |
+
}
|
143 |
+
|
144 |
+
/**
|
145 |
+
* define:endpoint step 3.1 and 3.2
|
146 |
+
*/
|
147 |
+
public static function processAuthDone()
|
148 |
+
{
|
149 |
+
Hybrid_Endpoint::authInit();
|
150 |
+
|
151 |
+
$provider_id = trim( strip_tags( Hybrid_Endpoint::$request["hauth_done"] ) );
|
152 |
+
|
153 |
+
# check if page accessed directly
|
154 |
+
if( ! Hybrid_Auth::storage()->get( "hauth_session.$provider_id.hauth_endpoint" ) ) {
|
155 |
+
throw new Hybrid_Exception( "You cannot access this page directly." );
|
156 |
+
}
|
157 |
+
|
158 |
+
$hauth = Hybrid_Auth::setup( $provider_id );
|
159 |
+
|
160 |
+
if( ! $hauth ) {
|
161 |
+
$hauth->adapter->setUserUnconnected();
|
162 |
+
|
163 |
+
throw new Hybrid_Exception( "Invalid parameter! Please return to the login page and try again." );
|
164 |
+
}
|
165 |
+
|
166 |
+
try {
|
167 |
+
$hauth->adapter->loginFinish();
|
168 |
+
}
|
169 |
+
catch( Exception $e ){
|
170 |
+
Hybrid_Error::setError( $e->getMessage(), $e->getCode() );
|
171 |
+
|
172 |
+
$hauth->adapter->setUserUnconnected();
|
173 |
+
}
|
174 |
+
|
175 |
+
$hauth->returnToCallbackUrl();
|
176 |
+
die();
|
177 |
+
}
|
178 |
+
|
179 |
+
public static function authInit()
|
180 |
+
{
|
181 |
+
if ( ! Hybrid_Endpoint::$initDone) {
|
182 |
+
Hybrid_Endpoint::$initDone = TRUE;
|
183 |
+
|
184 |
+
# Init Hybrid_Auth
|
185 |
+
try {
|
186 |
+
$storage = new Hybrid_Storage();
|
187 |
+
|
188 |
+
// Check if Hybrid_Auth session already exist
|
189 |
+
if ( ! $storage->config( "CONFIG" ) ){
|
190 |
+
throw new Hybrid_Exception( "You cannot access this page directly." );
|
191 |
+
}
|
192 |
+
|
193 |
+
Hybrid_Auth::initialize( $storage->config( "CONFIG" ) );
|
194 |
+
}
|
195 |
+
catch ( Exception $e ){
|
196 |
+
throw new Hybrid_Exception( "Oophs. Error!" );
|
197 |
+
}
|
198 |
+
}
|
199 |
+
}
|
200 |
+
}
|
hybridauth/Hybrid/Error.php
CHANGED
@@ -1,87 +1,87 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2014, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Errors manager
|
10 |
-
*
|
11 |
-
* HybridAuth errors are stored in Hybrid::storage() and not displayed directly to the end user
|
12 |
-
*/
|
13 |
-
class Hybrid_Error
|
14 |
-
{
|
15 |
-
/**
|
16 |
-
* Store error in session
|
17 |
-
*
|
18 |
-
* @param String $message
|
19 |
-
* @param Number $code
|
20 |
-
*/
|
21 |
-
public static function setError( $message, $code = NULL )
|
22 |
-
{
|
23 |
-
Hybrid_Auth::storage()->set( "hauth_session.error.status" , 1 );
|
24 |
-
Hybrid_Auth::storage()->set( "hauth_session.error.message" , $message );
|
25 |
-
Hybrid_Auth::storage()->set( "hauth_session.error.code" , $code );
|
26 |
-
}
|
27 |
-
|
28 |
-
/**
|
29 |
-
* Clear the last error
|
30 |
-
*/
|
31 |
-
public static function clearError()
|
32 |
-
{
|
33 |
-
Hybrid_Auth::storage()->delete( "hauth_session.error.status" );
|
34 |
-
Hybrid_Auth::storage()->delete( "hauth_session.error.message" );
|
35 |
-
Hybrid_Auth::storage()->delete( "hauth_session.error.code" );
|
36 |
-
}
|
37 |
-
|
38 |
-
/**
|
39 |
-
* Checks to see if there is a an error.
|
40 |
-
*
|
41 |
-
* @return boolean True if there is an error.
|
42 |
-
*/
|
43 |
-
public static function hasError()
|
44 |
-
{
|
45 |
-
return (bool) Hybrid_Auth::storage()->get( "hauth_session.error.status" );
|
46 |
-
}
|
47 |
-
|
48 |
-
/**
|
49 |
-
* return error message
|
50 |
-
*/
|
51 |
-
public static function getErrorMessage()
|
52 |
-
{
|
53 |
-
return Hybrid_Auth::storage()->get( "hauth_session.error.message" );
|
54 |
-
}
|
55 |
-
|
56 |
-
/**
|
57 |
-
* return error code
|
58 |
-
*/
|
59 |
-
public static function getErrorCode()
|
60 |
-
{
|
61 |
-
return Hybrid_Auth::storage()->get( "hauth_session.error.code" );
|
62 |
-
}
|
63 |
-
|
64 |
-
/**
|
65 |
-
* set api error
|
66 |
-
*/
|
67 |
-
public static function setApiError( $error )
|
68 |
-
{
|
69 |
-
return Hybrid_Auth::storage()->set( "hauth_session.error.apierror", $error );
|
70 |
-
}
|
71 |
-
|
72 |
-
/**
|
73 |
-
* set api error
|
74 |
-
*/
|
75 |
-
public static function deleteApiError()
|
76 |
-
{
|
77 |
-
return Hybrid_Auth::storage()->delete( "hauth_session.error.apierror" );
|
78 |
-
}
|
79 |
-
|
80 |
-
/**
|
81 |
-
* return api error
|
82 |
-
*/
|
83 |
-
public static function getApiError()
|
84 |
-
{
|
85 |
-
return Hybrid_Auth::storage() ? Hybrid_Auth::storage()->get( "hauth_session.error.apierror" ) : '';
|
86 |
-
}
|
87 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2014, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Errors manager
|
10 |
+
*
|
11 |
+
* HybridAuth errors are stored in Hybrid::storage() and not displayed directly to the end user
|
12 |
+
*/
|
13 |
+
class Hybrid_Error
|
14 |
+
{
|
15 |
+
/**
|
16 |
+
* Store error in session
|
17 |
+
*
|
18 |
+
* @param String $message
|
19 |
+
* @param Number $code
|
20 |
+
*/
|
21 |
+
public static function setError( $message, $code = NULL )
|
22 |
+
{
|
23 |
+
Hybrid_Auth::storage()->set( "hauth_session.error.status" , 1 );
|
24 |
+
Hybrid_Auth::storage()->set( "hauth_session.error.message" , $message );
|
25 |
+
Hybrid_Auth::storage()->set( "hauth_session.error.code" , $code );
|
26 |
+
}
|
27 |
+
|
28 |
+
/**
|
29 |
+
* Clear the last error
|
30 |
+
*/
|
31 |
+
public static function clearError()
|
32 |
+
{
|
33 |
+
Hybrid_Auth::storage()->delete( "hauth_session.error.status" );
|
34 |
+
Hybrid_Auth::storage()->delete( "hauth_session.error.message" );
|
35 |
+
Hybrid_Auth::storage()->delete( "hauth_session.error.code" );
|
36 |
+
}
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Checks to see if there is a an error.
|
40 |
+
*
|
41 |
+
* @return boolean True if there is an error.
|
42 |
+
*/
|
43 |
+
public static function hasError()
|
44 |
+
{
|
45 |
+
return (bool) Hybrid_Auth::storage()->get( "hauth_session.error.status" );
|
46 |
+
}
|
47 |
+
|
48 |
+
/**
|
49 |
+
* return error message
|
50 |
+
*/
|
51 |
+
public static function getErrorMessage()
|
52 |
+
{
|
53 |
+
return Hybrid_Auth::storage()->get( "hauth_session.error.message" );
|
54 |
+
}
|
55 |
+
|
56 |
+
/**
|
57 |
+
* return error code
|
58 |
+
*/
|
59 |
+
public static function getErrorCode()
|
60 |
+
{
|
61 |
+
return Hybrid_Auth::storage()->get( "hauth_session.error.code" );
|
62 |
+
}
|
63 |
+
|
64 |
+
/**
|
65 |
+
* set api error
|
66 |
+
*/
|
67 |
+
public static function setApiError( $error )
|
68 |
+
{
|
69 |
+
return Hybrid_Auth::storage()->set( "hauth_session.error.apierror", $error );
|
70 |
+
}
|
71 |
+
|
72 |
+
/**
|
73 |
+
* set api error
|
74 |
+
*/
|
75 |
+
public static function deleteApiError()
|
76 |
+
{
|
77 |
+
return Hybrid_Auth::storage()->delete( "hauth_session.error.apierror" );
|
78 |
+
}
|
79 |
+
|
80 |
+
/**
|
81 |
+
* return api error
|
82 |
+
*/
|
83 |
+
public static function getApiError()
|
84 |
+
{
|
85 |
+
return Hybrid_Auth::storage() ? Hybrid_Auth::storage()->get( "hauth_session.error.apierror" ) : '';
|
86 |
+
}
|
87 |
+
}
|
hybridauth/Hybrid/Exception.php
CHANGED
@@ -1,16 +1,16 @@
|
|
1 |
-
<?php
|
2 |
-
/*!
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Exception implementation
|
10 |
-
*
|
11 |
-
* The base Exception is extended to allow applications to handle exceptions from hybrid auth
|
12 |
-
* separately from general exceptions.
|
13 |
-
*/
|
14 |
-
class Hybrid_Exception extends Exception
|
15 |
-
{
|
16 |
-
}
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Exception implementation
|
10 |
+
*
|
11 |
+
* The base Exception is extended to allow applications to handle exceptions from hybrid auth
|
12 |
+
* separately from general exceptions.
|
13 |
+
*/
|
14 |
+
class Hybrid_Exception extends Exception
|
15 |
+
{
|
16 |
+
}
|
hybridauth/Hybrid/Provider_Adapter.php
CHANGED
@@ -1,313 +1,313 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2014, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Hybrid_Provider_Adapter is the basic class which Hybrid_Auth will use
|
10 |
-
* to connect users to a given provider.
|
11 |
-
*
|
12 |
-
* Basically Hybrid_Provider_Adapter will create a bridge from your php
|
13 |
-
* application to the provider api.
|
14 |
-
*
|
15 |
-
* Hybrid_Auth will automatically load Hybrid_Provider_Adapter and create
|
16 |
-
* an instance of it for each authenticated provider.
|
17 |
-
*/
|
18 |
-
class Hybrid_Provider_Adapter
|
19 |
-
{
|
20 |
-
/**
|
21 |
-
* Provider ID (or unique name)
|
22 |
-
* @var Numeric/String
|
23 |
-
*/
|
24 |
-
public $id = NULL ;
|
25 |
-
|
26 |
-
/**
|
27 |
-
* Provider adapter specific config
|
28 |
-
* @var Array
|
29 |
-
*/
|
30 |
-
public $config = NULL ;
|
31 |
-
|
32 |
-
/**
|
33 |
-
* Provider adapter extra parameters
|
34 |
-
* @var array
|
35 |
-
*/
|
36 |
-
public $params = array() ;
|
37 |
-
|
38 |
-
/**
|
39 |
-
* Provider adapter wrapper path
|
40 |
-
* @var String
|
41 |
-
*/
|
42 |
-
public $wrapper = NULL ;
|
43 |
-
|
44 |
-
/**
|
45 |
-
* Provider adapter instance
|
46 |
-
* @var object
|
47 |
-
*/
|
48 |
-
public $adapter = NULL ;
|
49 |
-
|
50 |
-
// --------------------------------------------------------------------
|
51 |
-
|
52 |
-
/**
|
53 |
-
* create a new adapter switch IDp name or ID
|
54 |
-
*
|
55 |
-
* @param string $id The id or name of the IDp
|
56 |
-
* @param array $params (optional) required parameters by the adapter
|
57 |
-
*/
|
58 |
-
function factory( $id, $params = array() )
|
59 |
-
{
|
60 |
-
# init the adapter config and params
|
61 |
-
$this->id = $id;
|
62 |
-
$this->params = $params;
|
63 |
-
$this->id = $this->getProviderCiId( $this->id );
|
64 |
-
$this->config = $this->getConfigById( $this->id );
|
65 |
-
|
66 |
-
# check the IDp id
|
67 |
-
if( ! $this->id ){
|
68 |
-
throw new Exception( "No provider ID specified.", 2 );
|
69 |
-
}
|
70 |
-
|
71 |
-
# check the IDp config
|
72 |
-
if( ! $this->config ){
|
73 |
-
throw new Exception( "Unknown Provider ID, check your configuration file.", 3 );
|
74 |
-
}
|
75 |
-
|
76 |
-
# check the IDp adapter is enabled
|
77 |
-
if( ! $this->config["enabled"] ){
|
78 |
-
throw new Exception( "The provider '{$this->id}' is not enabled.", 3 );
|
79 |
-
}
|
80 |
-
|
81 |
-
# include the adapter wrapper
|
82 |
-
if( isset( $this->config["wrapper"] ) && is_array( $this->config["wrapper"] ) ){
|
83 |
-
if (isset( $this->config["wrapper"]["path"] )) {
|
84 |
-
require_once $this->config["wrapper"]["path"];
|
85 |
-
}
|
86 |
-
|
87 |
-
if( ! class_exists( $this->config["wrapper"]["class"] ) ){
|
88 |
-
throw new Exception( "Unable to load the adapter class.", 3 );
|
89 |
-
}
|
90 |
-
|
91 |
-
$this->wrapper = $this->config["wrapper"]["class"];
|
92 |
-
}
|
93 |
-
else{
|
94 |
-
$path_providers = realpath( dirname( __FILE__ ) ) . "/Providers/";
|
95 |
-
|
96 |
-
require_once $path_providers . $this->id . ".php" ;
|
97 |
-
|
98 |
-
$this->wrapper = "Hybrid_Providers_" . $this->id;
|
99 |
-
}
|
100 |
-
|
101 |
-
# create the adapter instance, and pass the current params and config
|
102 |
-
$this->adapter = new $this->wrapper( $this->id, $this->config, $this->params );
|
103 |
-
|
104 |
-
return $this;
|
105 |
-
}
|
106 |
-
|
107 |
-
// --------------------------------------------------------------------
|
108 |
-
|
109 |
-
/**
|
110 |
-
* Hybrid_Provider_Adapter::login(), prepare the user session and the authentication request
|
111 |
-
* for index.php
|
112 |
-
*/
|
113 |
-
function login()
|
114 |
-
{
|
115 |
-
if( ! $this->adapter ){
|
116 |
-
throw new Exception( "Hybrid_Provider_Adapter::login() should not directly used." );
|
117 |
-
}
|
118 |
-
|
119 |
-
// clear all unneeded params
|
120 |
-
foreach( Hybrid_Auth::$config["providers"] as $idpid => $params ){
|
121 |
-
Hybrid_Auth::storage()->delete( "hauth_session.{$idpid}.hauth_return_to" );
|
122 |
-
Hybrid_Auth::storage()->delete( "hauth_session.{$idpid}.hauth_endpoint" );
|
123 |
-
Hybrid_Auth::storage()->delete( "hauth_session.{$idpid}.id_provider_params" );
|
124 |
-
}
|
125 |
-
|
126 |
-
// make a fresh start
|
127 |
-
$this->logout();
|
128 |
-
|
129 |
-
# get hybridauth base url
|
130 |
-
if (empty(Hybrid_Auth::$config["base_url"])) {
|
131 |
-
$HYBRID_AUTH_URL_BASE = Hybrid_Auth::getCurrentUrl( true ) ;
|
132 |
-
} else {
|
133 |
-
$HYBRID_AUTH_URL_BASE = Hybrid_Auth::$config["base_url"];
|
134 |
-
}
|
135 |
-
|
136 |
-
// make sure params is array
|
137 |
-
if( !is_array( $this->params ) ){
|
138 |
-
$this->params = array();
|
139 |
-
}
|
140 |
-
|
141 |
-
# we make use of session_id() as storage hash to identify the current user
|
142 |
-
# using session_regenerate_id() will be a problem, but ..
|
143 |
-
$this->params["hauth_token"] = session_id();
|
144 |
-
|
145 |
-
# set request timestamp
|
146 |
-
$this->params["hauth_time"] = time();
|
147 |
-
|
148 |
-
# for default HybridAuth endpoint url hauth_login_start_url
|
149 |
-
# auth.start required the IDp ID
|
150 |
-
# auth.time optional login request timestamp
|
151 |
-
$this->params["login_start"] = $HYBRID_AUTH_URL_BASE . ( strpos( $HYBRID_AUTH_URL_BASE, '?' ) ? '&' : '?' ) . "hauth.start={$this->id}&hauth.time={$this->params["hauth_time"]}";
|
152 |
-
|
153 |
-
# for default HybridAuth endpoint url hauth_login_done_url
|
154 |
-
# auth.done required the IDp ID
|
155 |
-
$this->params["login_done"] = $HYBRID_AUTH_URL_BASE . ( strpos( $HYBRID_AUTH_URL_BASE, '?' ) ? '&' : '?' ) . "hauth.done={$this->id}";
|
156 |
-
|
157 |
-
if( isset( $this->config["endpoint"] ) ){
|
158 |
-
$this->params["login_start"] = $this->config["endpoint"] . ( strpos( $HYBRID_AUTH_URL_BASE, '?' ) ? '&' : '?' ) . "hauth.start={$this->id}&hauth.time={$this->params["hauth_time"]}";
|
159 |
-
$this->params["login_done"] = $this->config["endpoint"];
|
160 |
-
}
|
161 |
-
|
162 |
-
if( isset( $this->params["hauth_return_to"] ) ){
|
163 |
-
Hybrid_Auth::storage()->set( "hauth_session.{$this->id}.hauth_return_to", $this->params["hauth_return_to"] );
|
164 |
-
}
|
165 |
-
|
166 |
-
if( isset( $this->params["login_done"] ) ){
|
167 |
-
Hybrid_Auth::storage()->set( "hauth_session.{$this->id}.hauth_endpoint" , $this->params["login_done"] );
|
168 |
-
}
|
169 |
-
|
170 |
-
Hybrid_Auth::storage()->set( "hauth_session.{$this->id}.id_provider_params" , $this->params );
|
171 |
-
|
172 |
-
// store config to be used by the end point
|
173 |
-
Hybrid_Auth::storage()->config( "CONFIG", Hybrid_Auth::$config );
|
174 |
-
|
175 |
-
Hybrid_Auth::redirect( $this->params["login_start"] );
|
176 |
-
}
|
177 |
-
|
178 |
-
// --------------------------------------------------------------------
|
179 |
-
|
180 |
-
/**
|
181 |
-
* let hybridauth forget all about the user for the current provider
|
182 |
-
*/
|
183 |
-
function logout()
|
184 |
-
{
|
185 |
-
$this->adapter->logout();
|
186 |
-
}
|
187 |
-
|
188 |
-
// --------------------------------------------------------------------
|
189 |
-
|
190 |
-
/**
|
191 |
-
* return true if the user is connected to the current provider
|
192 |
-
*/
|
193 |
-
public function isUserConnected()
|
194 |
-
{
|
195 |
-
return $this->adapter->isUserConnected();
|
196 |
-
}
|
197 |
-
|
198 |
-
// --------------------------------------------------------------------
|
199 |
-
|
200 |
-
/**
|
201 |
-
* handle :
|
202 |
-
* getUserProfile()
|
203 |
-
* getUserContacts()
|
204 |
-
* getUserActivity()
|
205 |
-
* setUserStatus()
|
206 |
-
*/
|
207 |
-
public function __call( $name, $arguments )
|
208 |
-
{
|
209 |
-
if ( ! $this->isUserConnected() ){
|
210 |
-
throw new Exception( "User not connected to the provider {$this->id}.", 7 );
|
211 |
-
}
|
212 |
-
|
213 |
-
if ( ! method_exists( $this->adapter, $name ) ){
|
214 |
-
throw new Exception( "Call to undefined function Hybrid_Providers_{$this->id}::$name()." );
|
215 |
-
}
|
216 |
-
|
217 |
-
$counter = count( $arguments );
|
218 |
-
if( $counter == 1 ){
|
219 |
-
return $this->adapter->$name( $arguments[0] );
|
220 |
-
}
|
221 |
-
elseif( $counter == 2 ){
|
222 |
-
return $this->adapter->$name( $arguments[0], $arguments[1] );
|
223 |
-
}
|
224 |
-
else{
|
225 |
-
return $this->adapter->$name();
|
226 |
-
}
|
227 |
-
}
|
228 |
-
|
229 |
-
// --------------------------------------------------------------------
|
230 |
-
|
231 |
-
/**
|
232 |
-
* If the user is connected, then return the access_token and access_token_secret
|
233 |
-
* if the provider api use oauth
|
234 |
-
*/
|
235 |
-
public function getAccessToken()
|
236 |
-
{
|
237 |
-
if( ! $this->adapter->isUserConnected() ){
|
238 |
-
throw new Exception( "User not connected to the provider.", 7 );
|
239 |
-
}
|
240 |
-
|
241 |
-
return
|
242 |
-
ARRAY(
|
243 |
-
"access_token" => $this->adapter->token( "access_token" ) , // OAuth access token
|
244 |
-
"access_token_secret" => $this->adapter->token( "access_token_secret" ), // OAuth access token secret
|
245 |
-
"refresh_token" => $this->adapter->token( "refresh_token" ) , // OAuth refresh token
|
246 |
-
"expires_in" => $this->adapter->token( "expires_in" ) , // OPTIONAL. The duration in seconds of the access token lifetime
|
247 |
-
"expires_at" => $this->adapter->token( "expires_at" ) , // OPTIONAL. Timestamp when the access_token expire. if not provided by the social api, then it should be calculated: expires_at = now + expires_in
|
248 |
-
);
|
249 |
-
}
|
250 |
-
|
251 |
-
// --------------------------------------------------------------------
|
252 |
-
|
253 |
-
/**
|
254 |
-
* Naive getter of the current connected IDp API client
|
255 |
-
*/
|
256 |
-
function api()
|
257 |
-
{
|
258 |
-
if( ! $this->adapter->isUserConnected() ){
|
259 |
-
throw new Exception( "User not connected to the provider.", 7 );
|
260 |
-
}
|
261 |
-
|
262 |
-
return $this->adapter->api;
|
263 |
-
}
|
264 |
-
|
265 |
-
// --------------------------------------------------------------------
|
266 |
-
|
267 |
-
/**
|
268 |
-
* redirect the user to hauth_return_to (the callback url)
|
269 |
-
*/
|
270 |
-
function returnToCallbackUrl()
|
271 |
-
{
|
272 |
-
// get the stored callback url
|
273 |
-
$callback_url = Hybrid_Auth::storage()->get( "hauth_session.{$this->id}.hauth_return_to" );
|
274 |
-
|
275 |
-
// remove some unneeded stored data
|
276 |
-
Hybrid_Auth::storage()->delete( "hauth_session.{$this->id}.hauth_return_to" );
|
277 |
-
Hybrid_Auth::storage()->delete( "hauth_session.{$this->id}.hauth_endpoint" );
|
278 |
-
Hybrid_Auth::storage()->delete( "hauth_session.{$this->id}.id_provider_params" );
|
279 |
-
|
280 |
-
// back to home
|
281 |
-
Hybrid_Auth::redirect( $callback_url );
|
282 |
-
}
|
283 |
-
|
284 |
-
// --------------------------------------------------------------------
|
285 |
-
|
286 |
-
/**
|
287 |
-
* return the provider config by id
|
288 |
-
*/
|
289 |
-
function getConfigById( $id )
|
290 |
-
{
|
291 |
-
if( isset( Hybrid_Auth::$config["providers"][$id] ) ){
|
292 |
-
return Hybrid_Auth::$config["providers"][$id];
|
293 |
-
}
|
294 |
-
|
295 |
-
return NULL;
|
296 |
-
}
|
297 |
-
|
298 |
-
// --------------------------------------------------------------------
|
299 |
-
|
300 |
-
/**
|
301 |
-
* return the provider config by id; insensitive
|
302 |
-
*/
|
303 |
-
function getProviderCiId( $id )
|
304 |
-
{
|
305 |
-
foreach( Hybrid_Auth::$config["providers"] as $idpid => $params ){
|
306 |
-
if( strtolower( $idpid ) == strtolower( $id ) ){
|
307 |
-
return $idpid;
|
308 |
-
}
|
309 |
-
}
|
310 |
-
|
311 |
-
return NULL;
|
312 |
-
}
|
313 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2014, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Hybrid_Provider_Adapter is the basic class which Hybrid_Auth will use
|
10 |
+
* to connect users to a given provider.
|
11 |
+
*
|
12 |
+
* Basically Hybrid_Provider_Adapter will create a bridge from your php
|
13 |
+
* application to the provider api.
|
14 |
+
*
|
15 |
+
* Hybrid_Auth will automatically load Hybrid_Provider_Adapter and create
|
16 |
+
* an instance of it for each authenticated provider.
|
17 |
+
*/
|
18 |
+
class Hybrid_Provider_Adapter
|
19 |
+
{
|
20 |
+
/**
|
21 |
+
* Provider ID (or unique name)
|
22 |
+
* @var Numeric/String
|
23 |
+
*/
|
24 |
+
public $id = NULL ;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Provider adapter specific config
|
28 |
+
* @var Array
|
29 |
+
*/
|
30 |
+
public $config = NULL ;
|
31 |
+
|
32 |
+
/**
|
33 |
+
* Provider adapter extra parameters
|
34 |
+
* @var array
|
35 |
+
*/
|
36 |
+
public $params = array() ;
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Provider adapter wrapper path
|
40 |
+
* @var String
|
41 |
+
*/
|
42 |
+
public $wrapper = NULL ;
|
43 |
+
|
44 |
+
/**
|
45 |
+
* Provider adapter instance
|
46 |
+
* @var object
|
47 |
+
*/
|
48 |
+
public $adapter = NULL ;
|
49 |
+
|
50 |
+
// --------------------------------------------------------------------
|
51 |
+
|
52 |
+
/**
|
53 |
+
* create a new adapter switch IDp name or ID
|
54 |
+
*
|
55 |
+
* @param string $id The id or name of the IDp
|
56 |
+
* @param array $params (optional) required parameters by the adapter
|
57 |
+
*/
|
58 |
+
function factory( $id, $params = array() )
|
59 |
+
{
|
60 |
+
# init the adapter config and params
|
61 |
+
$this->id = $id;
|
62 |
+
$this->params = $params;
|
63 |
+
$this->id = $this->getProviderCiId( $this->id );
|
64 |
+
$this->config = $this->getConfigById( $this->id );
|
65 |
+
|
66 |
+
# check the IDp id
|
67 |
+
if( ! $this->id ){
|
68 |
+
throw new Exception( "No provider ID specified.", 2 );
|
69 |
+
}
|
70 |
+
|
71 |
+
# check the IDp config
|
72 |
+
if( ! $this->config ){
|
73 |
+
throw new Exception( "Unknown Provider ID, check your configuration file.", 3 );
|
74 |
+
}
|
75 |
+
|
76 |
+
# check the IDp adapter is enabled
|
77 |
+
if( ! $this->config["enabled"] ){
|
78 |
+
throw new Exception( "The provider '{$this->id}' is not enabled.", 3 );
|
79 |
+
}
|
80 |
+
|
81 |
+
# include the adapter wrapper
|
82 |
+
if( isset( $this->config["wrapper"] ) && is_array( $this->config["wrapper"] ) ){
|
83 |
+
if (isset( $this->config["wrapper"]["path"] )) {
|
84 |
+
require_once $this->config["wrapper"]["path"];
|
85 |
+
}
|
86 |
+
|
87 |
+
if( ! class_exists( $this->config["wrapper"]["class"] ) ){
|
88 |
+
throw new Exception( "Unable to load the adapter class.", 3 );
|
89 |
+
}
|
90 |
+
|
91 |
+
$this->wrapper = $this->config["wrapper"]["class"];
|
92 |
+
}
|
93 |
+
else{
|
94 |
+
$path_providers = realpath( dirname( __FILE__ ) ) . "/Providers/";
|
95 |
+
|
96 |
+
require_once $path_providers . $this->id . ".php" ;
|
97 |
+
|
98 |
+
$this->wrapper = "Hybrid_Providers_" . $this->id;
|
99 |
+
}
|
100 |
+
|
101 |
+
# create the adapter instance, and pass the current params and config
|
102 |
+
$this->adapter = new $this->wrapper( $this->id, $this->config, $this->params );
|
103 |
+
|
104 |
+
return $this;
|
105 |
+
}
|
106 |
+
|
107 |
+
// --------------------------------------------------------------------
|
108 |
+
|
109 |
+
/**
|
110 |
+
* Hybrid_Provider_Adapter::login(), prepare the user session and the authentication request
|
111 |
+
* for index.php
|
112 |
+
*/
|
113 |
+
function login()
|
114 |
+
{
|
115 |
+
if( ! $this->adapter ){
|
116 |
+
throw new Exception( "Hybrid_Provider_Adapter::login() should not directly used." );
|
117 |
+
}
|
118 |
+
|
119 |
+
// clear all unneeded params
|
120 |
+
foreach( Hybrid_Auth::$config["providers"] as $idpid => $params ){
|
121 |
+
Hybrid_Auth::storage()->delete( "hauth_session.{$idpid}.hauth_return_to" );
|
122 |
+
Hybrid_Auth::storage()->delete( "hauth_session.{$idpid}.hauth_endpoint" );
|
123 |
+
Hybrid_Auth::storage()->delete( "hauth_session.{$idpid}.id_provider_params" );
|
124 |
+
}
|
125 |
+
|
126 |
+
// make a fresh start
|
127 |
+
$this->logout();
|
128 |
+
|
129 |
+
# get hybridauth base url
|
130 |
+
if (empty(Hybrid_Auth::$config["base_url"])) {
|
131 |
+
$HYBRID_AUTH_URL_BASE = Hybrid_Auth::getCurrentUrl( true ) ;
|
132 |
+
} else {
|
133 |
+
$HYBRID_AUTH_URL_BASE = Hybrid_Auth::$config["base_url"];
|
134 |
+
}
|
135 |
+
|
136 |
+
// make sure params is array
|
137 |
+
if( !is_array( $this->params ) ){
|
138 |
+
$this->params = array();
|
139 |
+
}
|
140 |
+
|
141 |
+
# we make use of session_id() as storage hash to identify the current user
|
142 |
+
# using session_regenerate_id() will be a problem, but ..
|
143 |
+
$this->params["hauth_token"] = session_id();
|
144 |
+
|
145 |
+
# set request timestamp
|
146 |
+
$this->params["hauth_time"] = time();
|
147 |
+
|
148 |
+
# for default HybridAuth endpoint url hauth_login_start_url
|
149 |
+
# auth.start required the IDp ID
|
150 |
+
# auth.time optional login request timestamp
|
151 |
+
$this->params["login_start"] = $HYBRID_AUTH_URL_BASE . ( strpos( $HYBRID_AUTH_URL_BASE, '?' ) ? '&' : '?' ) . "hauth.start={$this->id}&hauth.time={$this->params["hauth_time"]}";
|
152 |
+
|
153 |
+
# for default HybridAuth endpoint url hauth_login_done_url
|
154 |
+
# auth.done required the IDp ID
|
155 |
+
$this->params["login_done"] = $HYBRID_AUTH_URL_BASE . ( strpos( $HYBRID_AUTH_URL_BASE, '?' ) ? '&' : '?' ) . "hauth.done={$this->id}";
|
156 |
+
|
157 |
+
if( isset( $this->config["endpoint"] ) ){
|
158 |
+
$this->params["login_start"] = $this->config["endpoint"] . ( strpos( $HYBRID_AUTH_URL_BASE, '?' ) ? '&' : '?' ) . "hauth.start={$this->id}&hauth.time={$this->params["hauth_time"]}";
|
159 |
+
$this->params["login_done"] = $this->config["endpoint"];
|
160 |
+
}
|
161 |
+
|
162 |
+
if( isset( $this->params["hauth_return_to"] ) ){
|
163 |
+
Hybrid_Auth::storage()->set( "hauth_session.{$this->id}.hauth_return_to", $this->params["hauth_return_to"] );
|
164 |
+
}
|
165 |
+
|
166 |
+
if( isset( $this->params["login_done"] ) ){
|
167 |
+
Hybrid_Auth::storage()->set( "hauth_session.{$this->id}.hauth_endpoint" , $this->params["login_done"] );
|
168 |
+
}
|
169 |
+
|
170 |
+
Hybrid_Auth::storage()->set( "hauth_session.{$this->id}.id_provider_params" , $this->params );
|
171 |
+
|
172 |
+
// store config to be used by the end point
|
173 |
+
Hybrid_Auth::storage()->config( "CONFIG", Hybrid_Auth::$config );
|
174 |
+
|
175 |
+
Hybrid_Auth::redirect( $this->params["login_start"] );
|
176 |
+
}
|
177 |
+
|
178 |
+
// --------------------------------------------------------------------
|
179 |
+
|
180 |
+
/**
|
181 |
+
* let hybridauth forget all about the user for the current provider
|
182 |
+
*/
|
183 |
+
function logout()
|
184 |
+
{
|
185 |
+
$this->adapter->logout();
|
186 |
+
}
|
187 |
+
|
188 |
+
// --------------------------------------------------------------------
|
189 |
+
|
190 |
+
/**
|
191 |
+
* return true if the user is connected to the current provider
|
192 |
+
*/
|
193 |
+
public function isUserConnected()
|
194 |
+
{
|
195 |
+
return $this->adapter->isUserConnected();
|
196 |
+
}
|
197 |
+
|
198 |
+
// --------------------------------------------------------------------
|
199 |
+
|
200 |
+
/**
|
201 |
+
* handle :
|
202 |
+
* getUserProfile()
|
203 |
+
* getUserContacts()
|
204 |
+
* getUserActivity()
|
205 |
+
* setUserStatus()
|
206 |
+
*/
|
207 |
+
public function __call( $name, $arguments )
|
208 |
+
{
|
209 |
+
if ( ! $this->isUserConnected() ){
|
210 |
+
throw new Exception( "User not connected to the provider {$this->id}.", 7 );
|
211 |
+
}
|
212 |
+
|
213 |
+
if ( ! method_exists( $this->adapter, $name ) ){
|
214 |
+
throw new Exception( "Call to undefined function Hybrid_Providers_{$this->id}::$name()." );
|
215 |
+
}
|
216 |
+
|
217 |
+
$counter = count( $arguments );
|
218 |
+
if( $counter == 1 ){
|
219 |
+
return $this->adapter->$name( $arguments[0] );
|
220 |
+
}
|
221 |
+
elseif( $counter == 2 ){
|
222 |
+
return $this->adapter->$name( $arguments[0], $arguments[1] );
|
223 |
+
}
|
224 |
+
else{
|
225 |
+
return $this->adapter->$name();
|
226 |
+
}
|
227 |
+
}
|
228 |
+
|
229 |
+
// --------------------------------------------------------------------
|
230 |
+
|
231 |
+
/**
|
232 |
+
* If the user is connected, then return the access_token and access_token_secret
|
233 |
+
* if the provider api use oauth
|
234 |
+
*/
|
235 |
+
public function getAccessToken()
|
236 |
+
{
|
237 |
+
if( ! $this->adapter->isUserConnected() ){
|
238 |
+
throw new Exception( "User not connected to the provider.", 7 );
|
239 |
+
}
|
240 |
+
|
241 |
+
return
|
242 |
+
ARRAY(
|
243 |
+
"access_token" => $this->adapter->token( "access_token" ) , // OAuth access token
|
244 |
+
"access_token_secret" => $this->adapter->token( "access_token_secret" ), // OAuth access token secret
|
245 |
+
"refresh_token" => $this->adapter->token( "refresh_token" ) , // OAuth refresh token
|
246 |
+
"expires_in" => $this->adapter->token( "expires_in" ) , // OPTIONAL. The duration in seconds of the access token lifetime
|
247 |
+
"expires_at" => $this->adapter->token( "expires_at" ) , // OPTIONAL. Timestamp when the access_token expire. if not provided by the social api, then it should be calculated: expires_at = now + expires_in
|
248 |
+
);
|
249 |
+
}
|
250 |
+
|
251 |
+
// --------------------------------------------------------------------
|
252 |
+
|
253 |
+
/**
|
254 |
+
* Naive getter of the current connected IDp API client
|
255 |
+
*/
|
256 |
+
function api()
|
257 |
+
{
|
258 |
+
if( ! $this->adapter->isUserConnected() ){
|
259 |
+
throw new Exception( "User not connected to the provider.", 7 );
|
260 |
+
}
|
261 |
+
|
262 |
+
return $this->adapter->api;
|
263 |
+
}
|
264 |
+
|
265 |
+
// --------------------------------------------------------------------
|
266 |
+
|
267 |
+
/**
|
268 |
+
* redirect the user to hauth_return_to (the callback url)
|
269 |
+
*/
|
270 |
+
function returnToCallbackUrl()
|
271 |
+
{
|
272 |
+
// get the stored callback url
|
273 |
+
$callback_url = Hybrid_Auth::storage()->get( "hauth_session.{$this->id}.hauth_return_to" );
|
274 |
+
|
275 |
+
// remove some unneeded stored data
|
276 |
+
Hybrid_Auth::storage()->delete( "hauth_session.{$this->id}.hauth_return_to" );
|
277 |
+
Hybrid_Auth::storage()->delete( "hauth_session.{$this->id}.hauth_endpoint" );
|
278 |
+
Hybrid_Auth::storage()->delete( "hauth_session.{$this->id}.id_provider_params" );
|
279 |
+
|
280 |
+
// back to home
|
281 |
+
Hybrid_Auth::redirect( $callback_url );
|
282 |
+
}
|
283 |
+
|
284 |
+
// --------------------------------------------------------------------
|
285 |
+
|
286 |
+
/**
|
287 |
+
* return the provider config by id
|
288 |
+
*/
|
289 |
+
function getConfigById( $id )
|
290 |
+
{
|
291 |
+
if( isset( Hybrid_Auth::$config["providers"][$id] ) ){
|
292 |
+
return Hybrid_Auth::$config["providers"][$id];
|
293 |
+
}
|
294 |
+
|
295 |
+
return NULL;
|
296 |
+
}
|
297 |
+
|
298 |
+
// --------------------------------------------------------------------
|
299 |
+
|
300 |
+
/**
|
301 |
+
* return the provider config by id; insensitive
|
302 |
+
*/
|
303 |
+
function getProviderCiId( $id )
|
304 |
+
{
|
305 |
+
foreach( Hybrid_Auth::$config["providers"] as $idpid => $params ){
|
306 |
+
if( strtolower( $idpid ) == strtolower( $id ) ){
|
307 |
+
return $idpid;
|
308 |
+
}
|
309 |
+
}
|
310 |
+
|
311 |
+
return NULL;
|
312 |
+
}
|
313 |
+
}
|
hybridauth/Hybrid/Provider_Model.php
CHANGED
@@ -1,245 +1,245 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2014, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Hybrid_Provider_Model provide a common interface for supported IDps on HybridAuth.
|
10 |
-
*
|
11 |
-
* Basically, each provider adapter has to define at least 4 methods:
|
12 |
-
* Hybrid_Providers_{provider_name}::initialize()
|
13 |
-
* Hybrid_Providers_{provider_name}::loginBegin()
|
14 |
-
* Hybrid_Providers_{provider_name}::loginFinish()
|
15 |
-
* Hybrid_Providers_{provider_name}::getUserProfile()
|
16 |
-
*
|
17 |
-
* HybridAuth also come with three others models
|
18 |
-
* Class Hybrid_Provider_Model_OpenID for providers that uses the OpenID 1 and 2 protocol.
|
19 |
-
* Class Hybrid_Provider_Model_OAuth1 for providers that uses the OAuth 1 protocol.
|
20 |
-
* Class Hybrid_Provider_Model_OAuth2 for providers that uses the OAuth 2 protocol.
|
21 |
-
*/
|
22 |
-
abstract class Hybrid_Provider_Model
|
23 |
-
{
|
24 |
-
/**
|
25 |
-
* IDp ID (or unique name)
|
26 |
-
* @var Numeric/String
|
27 |
-
*/
|
28 |
-
public $providerId = NULL;
|
29 |
-
|
30 |
-
/**
|
31 |
-
* specific provider adapter config
|
32 |
-
* @var array
|
33 |
-
*/
|
34 |
-
public $config = NULL;
|
35 |
-
|
36 |
-
/**
|
37 |
-
* provider extra parameters
|
38 |
-
* @var array
|
39 |
-
*/
|
40 |
-
public $params = NULL;
|
41 |
-
|
42 |
-
/**
|
43 |
-
* Endpoint URL for that provider
|
44 |
-
* @var String
|
45 |
-
*/
|
46 |
-
public $endpoint = NULL;
|
47 |
-
|
48 |
-
/**
|
49 |
-
* Hybrid_User obj, represents the current loggedin user
|
50 |
-
* @var object
|
51 |
-
*/
|
52 |
-
public $user = NULL;
|
53 |
-
|
54 |
-
/**
|
55 |
-
* the provider api client (optional)
|
56 |
-
* @var object
|
57 |
-
*/
|
58 |
-
public $api = NULL;
|
59 |
-
|
60 |
-
/**
|
61 |
-
* Common providers adapter constructor
|
62 |
-
* @param Numeric/String $providerId
|
63 |
-
* @param Array $config
|
64 |
-
* @param Array $params
|
65 |
-
*/
|
66 |
-
function __construct( $providerId, $config, $params = NULL )
|
67 |
-
{
|
68 |
-
# init the IDp adapter parameters, get them from the cache if possible
|
69 |
-
if( ! $params ){
|
70 |
-
$this->params = Hybrid_Auth::storage()->get( "hauth_session.$providerId.id_provider_params" );
|
71 |
-
}
|
72 |
-
else{
|
73 |
-
$this->params = $params;
|
74 |
-
}
|
75 |
-
|
76 |
-
// idp id
|
77 |
-
$this->providerId = $providerId;
|
78 |
-
|
79 |
-
// set HybridAuth endpoint for this provider
|
80 |
-
$this->endpoint = Hybrid_Auth::storage()->get( "hauth_session.$providerId.hauth_endpoint" );
|
81 |
-
|
82 |
-
// idp config
|
83 |
-
$this->config = $config;
|
84 |
-
|
85 |
-
// new user instance
|
86 |
-
$this->user = new Hybrid_User();
|
87 |
-
$this->user->providerId = $providerId;
|
88 |
-
|
89 |
-
// initialize the current provider adapter
|
90 |
-
$this->initialize();
|
91 |
-
}
|
92 |
-
|
93 |
-
// --------------------------------------------------------------------
|
94 |
-
|
95 |
-
/**
|
96 |
-
* IDp wrappers initializer
|
97 |
-
*
|
98 |
-
* The main job of wrappers initializer is to performs (depend on the IDp api client it self):
|
99 |
-
* - include some libs needed by this provider,
|
100 |
-
* - check IDp key and secret,
|
101 |
-
* - set some needed parameters (stored in $this->params) by this IDp api client
|
102 |
-
* - create and setup an instance of the IDp api client on $this->api
|
103 |
-
*/
|
104 |
-
abstract protected function initialize();
|
105 |
-
|
106 |
-
// --------------------------------------------------------------------
|
107 |
-
|
108 |
-
/**
|
109 |
-
* begin login
|
110 |
-
*/
|
111 |
-
abstract protected function loginBegin();
|
112 |
-
|
113 |
-
// --------------------------------------------------------------------
|
114 |
-
|
115 |
-
/**
|
116 |
-
* finish login
|
117 |
-
*/
|
118 |
-
abstract protected function loginFinish();
|
119 |
-
|
120 |
-
// --------------------------------------------------------------------
|
121 |
-
|
122 |
-
/**
|
123 |
-
* generic logout, just erase current provider adapter stored data to let Hybrid_Auth all forget about it
|
124 |
-
*/
|
125 |
-
function logout()
|
126 |
-
{
|
127 |
-
$this->clearTokens();
|
128 |
-
|
129 |
-
return TRUE;
|
130 |
-
}
|
131 |
-
|
132 |
-
// --------------------------------------------------------------------
|
133 |
-
|
134 |
-
/**
|
135 |
-
* grab the user profile from the IDp api client
|
136 |
-
*/
|
137 |
-
function getUserProfile()
|
138 |
-
{
|
139 |
-
throw new Exception( "Provider does not support this feature.", 8 );
|
140 |
-
}
|
141 |
-
|
142 |
-
// --------------------------------------------------------------------
|
143 |
-
|
144 |
-
/**
|
145 |
-
* load the current logged in user contacts list from the IDp api client
|
146 |
-
*/
|
147 |
-
function getUserContacts()
|
148 |
-
{
|
149 |
-
throw new Exception( "Provider does not support this feature.", 8 );
|
150 |
-
}
|
151 |
-
|
152 |
-
// --------------------------------------------------------------------
|
153 |
-
|
154 |
-
/**
|
155 |
-
* return the user activity stream
|
156 |
-
*/
|
157 |
-
function getUserActivity( $stream )
|
158 |
-
{
|
159 |
-
throw new Exception( "Provider does not support this feature.", 8 );
|
160 |
-
}
|
161 |
-
|
162 |
-
// --------------------------------------------------------------------
|
163 |
-
|
164 |
-
/**
|
165 |
-
* set user status
|
166 |
-
*/
|
167 |
-
function setUserStatus( $status )
|
168 |
-
{
|
169 |
-
throw new Exception( "Provider does not support this feature.", 8 );
|
170 |
-
}
|
171 |
-
|
172 |
-
|
173 |
-
/**
|
174 |
-
* return the user status
|
175 |
-
*/
|
176 |
-
function getUserStatus( $statusid )
|
177 |
-
{
|
178 |
-
throw new Exception( "Provider does not support this feature.", 8 );
|
179 |
-
}
|
180 |
-
|
181 |
-
// --------------------------------------------------------------------
|
182 |
-
|
183 |
-
/**
|
184 |
-
* return true if the user is connected to the current provider
|
185 |
-
*/
|
186 |
-
public function isUserConnected()
|
187 |
-
{
|
188 |
-
return (bool) Hybrid_Auth::storage()->get( "hauth_session.{$this->providerId}.is_logged_in" );
|
189 |
-
}
|
190 |
-
|
191 |
-
// --------------------------------------------------------------------
|
192 |
-
|
193 |
-
/**
|
194 |
-
* set user to connected
|
195 |
-
*/
|
196 |
-
public function setUserConnected()
|
197 |
-
{
|
198 |
-
Hybrid_Auth::storage()->set( "hauth_session.{$this->providerId}.is_logged_in", 1 );
|
199 |
-
}
|
200 |
-
|
201 |
-
// --------------------------------------------------------------------
|
202 |
-
|
203 |
-
/**
|
204 |
-
* set user to unconnected
|
205 |
-
*/
|
206 |
-
public function setUserUnconnected()
|
207 |
-
{
|
208 |
-
Hybrid_Auth::storage()->set( "hauth_session.{$this->providerId}.is_logged_in", 0 );
|
209 |
-
}
|
210 |
-
|
211 |
-
// --------------------------------------------------------------------
|
212 |
-
|
213 |
-
/**
|
214 |
-
* get or set a token
|
215 |
-
*/
|
216 |
-
public function token( $token, $value = NULL )
|
217 |
-
{
|
218 |
-
if( $value === NULL ){
|
219 |
-
return Hybrid_Auth::storage()->get( "hauth_session.{$this->providerId}.token.$token" );
|
220 |
-
}
|
221 |
-
else{
|
222 |
-
Hybrid_Auth::storage()->set( "hauth_session.{$this->providerId}.token.$token", $value );
|
223 |
-
}
|
224 |
-
}
|
225 |
-
|
226 |
-
// --------------------------------------------------------------------
|
227 |
-
|
228 |
-
/**
|
229 |
-
* delete a stored token
|
230 |
-
*/
|
231 |
-
public function deleteToken( $token )
|
232 |
-
{
|
233 |
-
Hybrid_Auth::storage()->delete( "hauth_session.{$this->providerId}.token.$token" );
|
234 |
-
}
|
235 |
-
|
236 |
-
// --------------------------------------------------------------------
|
237 |
-
|
238 |
-
/**
|
239 |
-
* clear all existent tokens for this provider
|
240 |
-
*/
|
241 |
-
public function clearTokens()
|
242 |
-
{
|
243 |
-
Hybrid_Auth::storage()->deleteMatch( "hauth_session.{$this->providerId}." );
|
244 |
-
}
|
245 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2014, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Hybrid_Provider_Model provide a common interface for supported IDps on HybridAuth.
|
10 |
+
*
|
11 |
+
* Basically, each provider adapter has to define at least 4 methods:
|
12 |
+
* Hybrid_Providers_{provider_name}::initialize()
|
13 |
+
* Hybrid_Providers_{provider_name}::loginBegin()
|
14 |
+
* Hybrid_Providers_{provider_name}::loginFinish()
|
15 |
+
* Hybrid_Providers_{provider_name}::getUserProfile()
|
16 |
+
*
|
17 |
+
* HybridAuth also come with three others models
|
18 |
+
* Class Hybrid_Provider_Model_OpenID for providers that uses the OpenID 1 and 2 protocol.
|
19 |
+
* Class Hybrid_Provider_Model_OAuth1 for providers that uses the OAuth 1 protocol.
|
20 |
+
* Class Hybrid_Provider_Model_OAuth2 for providers that uses the OAuth 2 protocol.
|
21 |
+
*/
|
22 |
+
abstract class Hybrid_Provider_Model
|
23 |
+
{
|
24 |
+
/**
|
25 |
+
* IDp ID (or unique name)
|
26 |
+
* @var Numeric/String
|
27 |
+
*/
|
28 |
+
public $providerId = NULL;
|
29 |
+
|
30 |
+
/**
|
31 |
+
* specific provider adapter config
|
32 |
+
* @var array
|
33 |
+
*/
|
34 |
+
public $config = NULL;
|
35 |
+
|
36 |
+
/**
|
37 |
+
* provider extra parameters
|
38 |
+
* @var array
|
39 |
+
*/
|
40 |
+
public $params = NULL;
|
41 |
+
|
42 |
+
/**
|
43 |
+
* Endpoint URL for that provider
|
44 |
+
* @var String
|
45 |
+
*/
|
46 |
+
public $endpoint = NULL;
|
47 |
+
|
48 |
+
/**
|
49 |
+
* Hybrid_User obj, represents the current loggedin user
|
50 |
+
* @var object
|
51 |
+
*/
|
52 |
+
public $user = NULL;
|
53 |
+
|
54 |
+
/**
|
55 |
+
* the provider api client (optional)
|
56 |
+
* @var object
|
57 |
+
*/
|
58 |
+
public $api = NULL;
|
59 |
+
|
60 |
+
/**
|
61 |
+
* Common providers adapter constructor
|
62 |
+
* @param Numeric/String $providerId
|
63 |
+
* @param Array $config
|
64 |
+
* @param Array $params
|
65 |
+
*/
|
66 |
+
function __construct( $providerId, $config, $params = NULL )
|
67 |
+
{
|
68 |
+
# init the IDp adapter parameters, get them from the cache if possible
|
69 |
+
if( ! $params ){
|
70 |
+
$this->params = Hybrid_Auth::storage()->get( "hauth_session.$providerId.id_provider_params" );
|
71 |
+
}
|
72 |
+
else{
|
73 |
+
$this->params = $params;
|
74 |
+
}
|
75 |
+
|
76 |
+
// idp id
|
77 |
+
$this->providerId = $providerId;
|
78 |
+
|
79 |
+
// set HybridAuth endpoint for this provider
|
80 |
+
$this->endpoint = Hybrid_Auth::storage()->get( "hauth_session.$providerId.hauth_endpoint" );
|
81 |
+
|
82 |
+
// idp config
|
83 |
+
$this->config = $config;
|
84 |
+
|
85 |
+
// new user instance
|
86 |
+
$this->user = new Hybrid_User();
|
87 |
+
$this->user->providerId = $providerId;
|
88 |
+
|
89 |
+
// initialize the current provider adapter
|
90 |
+
$this->initialize();
|
91 |
+
}
|
92 |
+
|
93 |
+
// --------------------------------------------------------------------
|
94 |
+
|
95 |
+
/**
|
96 |
+
* IDp wrappers initializer
|
97 |
+
*
|
98 |
+
* The main job of wrappers initializer is to performs (depend on the IDp api client it self):
|
99 |
+
* - include some libs needed by this provider,
|
100 |
+
* - check IDp key and secret,
|
101 |
+
* - set some needed parameters (stored in $this->params) by this IDp api client
|
102 |
+
* - create and setup an instance of the IDp api client on $this->api
|
103 |
+
*/
|
104 |
+
abstract protected function initialize();
|
105 |
+
|
106 |
+
// --------------------------------------------------------------------
|
107 |
+
|
108 |
+
/**
|
109 |
+
* begin login
|
110 |
+
*/
|
111 |
+
abstract protected function loginBegin();
|
112 |
+
|
113 |
+
// --------------------------------------------------------------------
|
114 |
+
|
115 |
+
/**
|
116 |
+
* finish login
|
117 |
+
*/
|
118 |
+
abstract protected function loginFinish();
|
119 |
+
|
120 |
+
// --------------------------------------------------------------------
|
121 |
+
|
122 |
+
/**
|
123 |
+
* generic logout, just erase current provider adapter stored data to let Hybrid_Auth all forget about it
|
124 |
+
*/
|
125 |
+
function logout()
|
126 |
+
{
|
127 |
+
$this->clearTokens();
|
128 |
+
|
129 |
+
return TRUE;
|
130 |
+
}
|
131 |
+
|
132 |
+
// --------------------------------------------------------------------
|
133 |
+
|
134 |
+
/**
|
135 |
+
* grab the user profile from the IDp api client
|
136 |
+
*/
|
137 |
+
function getUserProfile()
|
138 |
+
{
|
139 |
+
throw new Exception( "Provider does not support this feature.", 8 );
|
140 |
+
}
|
141 |
+
|
142 |
+
// --------------------------------------------------------------------
|
143 |
+
|
144 |
+
/**
|
145 |
+
* load the current logged in user contacts list from the IDp api client
|
146 |
+
*/
|
147 |
+
function getUserContacts()
|
148 |
+
{
|
149 |
+
throw new Exception( "Provider does not support this feature.", 8 );
|
150 |
+
}
|
151 |
+
|
152 |
+
// --------------------------------------------------------------------
|
153 |
+
|
154 |
+
/**
|
155 |
+
* return the user activity stream
|
156 |
+
*/
|
157 |
+
function getUserActivity( $stream )
|
158 |
+
{
|
159 |
+
throw new Exception( "Provider does not support this feature.", 8 );
|
160 |
+
}
|
161 |
+
|
162 |
+
// --------------------------------------------------------------------
|
163 |
+
|
164 |
+
/**
|
165 |
+
* set user status
|
166 |
+
*/
|
167 |
+
function setUserStatus( $status )
|
168 |
+
{
|
169 |
+
throw new Exception( "Provider does not support this feature.", 8 );
|
170 |
+
}
|
171 |
+
|
172 |
+
|
173 |
+
/**
|
174 |
+
* return the user status
|
175 |
+
*/
|
176 |
+
function getUserStatus( $statusid )
|
177 |
+
{
|
178 |
+
throw new Exception( "Provider does not support this feature.", 8 );
|
179 |
+
}
|
180 |
+
|
181 |
+
// --------------------------------------------------------------------
|
182 |
+
|
183 |
+
/**
|
184 |
+
* return true if the user is connected to the current provider
|
185 |
+
*/
|
186 |
+
public function isUserConnected()
|
187 |
+
{
|
188 |
+
return (bool) Hybrid_Auth::storage()->get( "hauth_session.{$this->providerId}.is_logged_in" );
|
189 |
+
}
|
190 |
+
|
191 |
+
// --------------------------------------------------------------------
|
192 |
+
|
193 |
+
/**
|
194 |
+
* set user to connected
|
195 |
+
*/
|
196 |
+
public function setUserConnected()
|
197 |
+
{
|
198 |
+
Hybrid_Auth::storage()->set( "hauth_session.{$this->providerId}.is_logged_in", 1 );
|
199 |
+
}
|
200 |
+
|
201 |
+
// --------------------------------------------------------------------
|
202 |
+
|
203 |
+
/**
|
204 |
+
* set user to unconnected
|
205 |
+
*/
|
206 |
+
public function setUserUnconnected()
|
207 |
+
{
|
208 |
+
Hybrid_Auth::storage()->set( "hauth_session.{$this->providerId}.is_logged_in", 0 );
|
209 |
+
}
|
210 |
+
|
211 |
+
// --------------------------------------------------------------------
|
212 |
+
|
213 |
+
/**
|
214 |
+
* get or set a token
|
215 |
+
*/
|
216 |
+
public function token( $token, $value = NULL )
|
217 |
+
{
|
218 |
+
if( $value === NULL ){
|
219 |
+
return Hybrid_Auth::storage()->get( "hauth_session.{$this->providerId}.token.$token" );
|
220 |
+
}
|
221 |
+
else{
|
222 |
+
Hybrid_Auth::storage()->set( "hauth_session.{$this->providerId}.token.$token", $value );
|
223 |
+
}
|
224 |
+
}
|
225 |
+
|
226 |
+
// --------------------------------------------------------------------
|
227 |
+
|
228 |
+
/**
|
229 |
+
* delete a stored token
|
230 |
+
*/
|
231 |
+
public function deleteToken( $token )
|
232 |
+
{
|
233 |
+
Hybrid_Auth::storage()->delete( "hauth_session.{$this->providerId}.token.$token" );
|
234 |
+
}
|
235 |
+
|
236 |
+
// --------------------------------------------------------------------
|
237 |
+
|
238 |
+
/**
|
239 |
+
* clear all existent tokens for this provider
|
240 |
+
*/
|
241 |
+
public function clearTokens()
|
242 |
+
{
|
243 |
+
Hybrid_Auth::storage()->deleteMatch( "hauth_session.{$this->providerId}." );
|
244 |
+
}
|
245 |
+
}
|
hybridauth/Hybrid/Provider_Model_OAuth1.php
CHANGED
@@ -1,180 +1,180 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2014, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* To implement an OAuth 1 based service provider, Hybrid_Provider_Model_OAuth1
|
10 |
-
* can be used to save the hassle of the authentication flow.
|
11 |
-
*
|
12 |
-
* Each class that inherit from Hybrid_Provider_Model_OAuth1 have to implement
|
13 |
-
* at least 2 methods:
|
14 |
-
* Hybrid_Providers_{provider_name}::initialize() to setup the provider api end-points urls
|
15 |
-
* Hybrid_Providers_{provider_name}::getUserProfile() to grab the user profile
|
16 |
-
*
|
17 |
-
* Hybrid_Provider_Model_OAuth1 use OAuth1Client v0.1 which can be found on
|
18 |
-
* Hybrid/thirdparty/OAuth/OAuth1Client.php
|
19 |
-
*/
|
20 |
-
class Hybrid_Provider_Model_OAuth1 extends Hybrid_Provider_Model
|
21 |
-
{
|
22 |
-
/**
|
23 |
-
* request_tokens as received from provider
|
24 |
-
* @var object
|
25 |
-
*/
|
26 |
-
public $request_tokens_raw = null;
|
27 |
-
|
28 |
-
/**
|
29 |
-
* access_tokens as received from provider
|
30 |
-
* @var object
|
31 |
-
*/
|
32 |
-
public $access_tokens_raw = null;
|
33 |
-
|
34 |
-
/**
|
35 |
-
* Try to get the error message from provider api
|
36 |
-
* @param Numeric $code
|
37 |
-
*/
|
38 |
-
function errorMessageByStatus( $code = null ) {
|
39 |
-
$http_status_codes = ARRAY(
|
40 |
-
200 => "OK: Success!",
|
41 |
-
304 => "Not Modified: There was no new data to return.",
|
42 |
-
400 => "Bad Request: The request was invalid.",
|
43 |
-
401 => "Unauthorized.",
|
44 |
-
403 => "Forbidden: The request is understood, but it has been refused.",
|
45 |
-
404 => "Not Found: The URI requested is invalid or the resource requested does not exists.",
|
46 |
-
406 => "Not Acceptable.",
|
47 |
-
500 => "Internal Server Error: Something is broken.",
|
48 |
-
502 => "Bad Gateway.",
|
49 |
-
503 => "Service Unavailable."
|
50 |
-
);
|
51 |
-
|
52 |
-
if( ! $code && $this->api )
|
53 |
-
$code = $this->api->http_code;
|
54 |
-
|
55 |
-
if( isset( $http_status_codes[ $code ] ) )
|
56 |
-
return $code . " " . $http_status_codes[ $code ];
|
57 |
-
}
|
58 |
-
|
59 |
-
// --------------------------------------------------------------------
|
60 |
-
|
61 |
-
/**
|
62 |
-
* adapter initializer
|
63 |
-
*/
|
64 |
-
function initialize()
|
65 |
-
{
|
66 |
-
// 1 - check application credentials
|
67 |
-
if ( ! $this->config["keys"]["key"] || ! $this->config["keys"]["secret"] ){
|
68 |
-
throw new Exception( "Your application key and secret are required in order to connect to {$this->providerId}.", 4 );
|
69 |
-
}
|
70 |
-
|
71 |
-
// 2 - include OAuth lib and client
|
72 |
-
if ( ! class_exists('OAuthConsumer') ) {
|
73 |
-
require_once realpath( dirname( __FILE__ ) ) . "/thirdparty/OAuth/OAuth.php";
|
74 |
-
}
|
75 |
-
|
76 |
-
require_once realpath( dirname( __FILE__ ) ) . "/thirdparty/OAuth/OAuth1Client.php";
|
77 |
-
|
78 |
-
// 3.1 - setup access_token if any stored
|
79 |
-
if( $this->token( "access_token" ) ){
|
80 |
-
$this->api = new OAuth1Client(
|
81 |
-
$this->config["keys"]["key"], $this->config["keys"]["secret"],
|
82 |
-
$this->token( "access_token" ), $this->token( "access_token_secret" )
|
83 |
-
);
|
84 |
-
}
|
85 |
-
|
86 |
-
// 3.2 - setup request_token if any stored, in order to exchange with an access token
|
87 |
-
elseif( $this->token( "request_token" ) ){
|
88 |
-
$this->api = new OAuth1Client(
|
89 |
-
$this->config["keys"]["key"], $this->config["keys"]["secret"],
|
90 |
-
$this->token( "request_token" ), $this->token( "request_token_secret" )
|
91 |
-
);
|
92 |
-
}
|
93 |
-
|
94 |
-
// 3.3 - instanciate OAuth client with client credentials
|
95 |
-
else{
|
96 |
-
$this->api = new OAuth1Client( $this->config["keys"]["key"], $this->config["keys"]["secret"] );
|
97 |
-
}
|
98 |
-
|
99 |
-
// Set curl proxy if exist
|
100 |
-
if( isset( Hybrid_Auth::$config["proxy"] ) ){
|
101 |
-
$this->api->curl_proxy = Hybrid_Auth::$config["proxy"];
|
102 |
-
}
|
103 |
-
}
|
104 |
-
|
105 |
-
// --------------------------------------------------------------------
|
106 |
-
|
107 |
-
/**
|
108 |
-
* begin login step
|
109 |
-
*/
|
110 |
-
function loginBegin()
|
111 |
-
{
|
112 |
-
$tokens = $this->api->requestToken( $this->endpoint );
|
113 |
-
|
114 |
-
// request tokens as received from provider
|
115 |
-
$this->request_tokens_raw = $tokens;
|
116 |
-
|
117 |
-
// check the last HTTP status code returned
|
118 |
-
if ( $this->api->http_code != 200 ){
|
119 |
-
throw new Exception( "Authentication failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ), 5 );
|
120 |
-
}
|
121 |
-
|
122 |
-
if ( ! isset( $tokens["oauth_token"] ) ){
|
123 |
-
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid oauth_token.", 5 );
|
124 |
-
}
|
125 |
-
|
126 |
-
$this->token( "request_token" , $tokens["oauth_token"] );
|
127 |
-
$this->token( "request_token_secret", $tokens["oauth_token_secret"] );
|
128 |
-
|
129 |
-
# redirect the user to the provider authentication url
|
130 |
-
Hybrid_Auth::redirect( $this->api->authorizeUrl( $tokens ) );
|
131 |
-
}
|
132 |
-
|
133 |
-
// --------------------------------------------------------------------
|
134 |
-
|
135 |
-
/**
|
136 |
-
* finish login step
|
137 |
-
*/
|
138 |
-
|
139 |
-
function loginFinish()
|
140 |
-
{
|
141 |
-
$denied = (array_key_exists('denied',$_REQUEST))?$_REQUEST['denied']:"";
|
142 |
-
$oauth_token = (array_key_exists('oauth_token',$_REQUEST))?$_REQUEST['oauth_token']:"";
|
143 |
-
$oauth_verifier = (array_key_exists('oauth_verifier',$_REQUEST))?$_REQUEST['oauth_verifier']:"";
|
144 |
-
|
145 |
-
if ( $denied ){
|
146 |
-
throw new Exception( "Authentication denied! {$this->providerId} returned denied token: " . htmlentities( $denied ), 5 );
|
147 |
-
}
|
148 |
-
|
149 |
-
if ( ! $oauth_token || ! $oauth_verifier ){
|
150 |
-
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid oauth_verifier.", 5 );
|
151 |
-
}
|
152 |
-
|
153 |
-
// request an access token
|
154 |
-
$tokens = $this->api->accessToken( $oauth_verifier );
|
155 |
-
|
156 |
-
// access tokens as received from provider
|
157 |
-
$this->access_tokens_raw = $tokens;
|
158 |
-
|
159 |
-
// check the last HTTP status code returned
|
160 |
-
if ( $this->api->http_code != 200 ){
|
161 |
-
throw new Exception( "Authentication failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ), 5 );
|
162 |
-
}
|
163 |
-
|
164 |
-
// we should have an access_token, or else, something has gone wrong
|
165 |
-
if ( ! isset( $tokens["oauth_token"] ) ){
|
166 |
-
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid oauth_token.", 5 );
|
167 |
-
}
|
168 |
-
|
169 |
-
// we no more need to store request tokens
|
170 |
-
$this->deleteToken( "request_token" );
|
171 |
-
$this->deleteToken( "request_token_secret" );
|
172 |
-
|
173 |
-
// store access_token for later user
|
174 |
-
$this->token( "access_token" , $tokens['oauth_token'] );
|
175 |
-
$this->token( "access_token_secret" , $tokens['oauth_token_secret'] );
|
176 |
-
|
177 |
-
// set user as logged in to the current provider
|
178 |
-
$this->setUserConnected();
|
179 |
-
}
|
180 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2014, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* To implement an OAuth 1 based service provider, Hybrid_Provider_Model_OAuth1
|
10 |
+
* can be used to save the hassle of the authentication flow.
|
11 |
+
*
|
12 |
+
* Each class that inherit from Hybrid_Provider_Model_OAuth1 have to implement
|
13 |
+
* at least 2 methods:
|
14 |
+
* Hybrid_Providers_{provider_name}::initialize() to setup the provider api end-points urls
|
15 |
+
* Hybrid_Providers_{provider_name}::getUserProfile() to grab the user profile
|
16 |
+
*
|
17 |
+
* Hybrid_Provider_Model_OAuth1 use OAuth1Client v0.1 which can be found on
|
18 |
+
* Hybrid/thirdparty/OAuth/OAuth1Client.php
|
19 |
+
*/
|
20 |
+
class Hybrid_Provider_Model_OAuth1 extends Hybrid_Provider_Model
|
21 |
+
{
|
22 |
+
/**
|
23 |
+
* request_tokens as received from provider
|
24 |
+
* @var object
|
25 |
+
*/
|
26 |
+
public $request_tokens_raw = null;
|
27 |
+
|
28 |
+
/**
|
29 |
+
* access_tokens as received from provider
|
30 |
+
* @var object
|
31 |
+
*/
|
32 |
+
public $access_tokens_raw = null;
|
33 |
+
|
34 |
+
/**
|
35 |
+
* Try to get the error message from provider api
|
36 |
+
* @param Numeric $code
|
37 |
+
*/
|
38 |
+
function errorMessageByStatus( $code = null ) {
|
39 |
+
$http_status_codes = ARRAY(
|
40 |
+
200 => "OK: Success!",
|
41 |
+
304 => "Not Modified: There was no new data to return.",
|
42 |
+
400 => "Bad Request: The request was invalid.",
|
43 |
+
401 => "Unauthorized.",
|
44 |
+
403 => "Forbidden: The request is understood, but it has been refused.",
|
45 |
+
404 => "Not Found: The URI requested is invalid or the resource requested does not exists.",
|
46 |
+
406 => "Not Acceptable.",
|
47 |
+
500 => "Internal Server Error: Something is broken.",
|
48 |
+
502 => "Bad Gateway.",
|
49 |
+
503 => "Service Unavailable."
|
50 |
+
);
|
51 |
+
|
52 |
+
if( ! $code && $this->api )
|
53 |
+
$code = $this->api->http_code;
|
54 |
+
|
55 |
+
if( isset( $http_status_codes[ $code ] ) )
|
56 |
+
return $code . " " . $http_status_codes[ $code ];
|
57 |
+
}
|
58 |
+
|
59 |
+
// --------------------------------------------------------------------
|
60 |
+
|
61 |
+
/**
|
62 |
+
* adapter initializer
|
63 |
+
*/
|
64 |
+
function initialize()
|
65 |
+
{
|
66 |
+
// 1 - check application credentials
|
67 |
+
if ( ! $this->config["keys"]["key"] || ! $this->config["keys"]["secret"] ){
|
68 |
+
throw new Exception( "Your application key and secret are required in order to connect to {$this->providerId}.", 4 );
|
69 |
+
}
|
70 |
+
|
71 |
+
// 2 - include OAuth lib and client
|
72 |
+
if ( ! class_exists('OAuthConsumer') ) {
|
73 |
+
require_once realpath( dirname( __FILE__ ) ) . "/thirdparty/OAuth/OAuth.php";
|
74 |
+
}
|
75 |
+
|
76 |
+
require_once realpath( dirname( __FILE__ ) ) . "/thirdparty/OAuth/OAuth1Client.php";
|
77 |
+
|
78 |
+
// 3.1 - setup access_token if any stored
|
79 |
+
if( $this->token( "access_token" ) ){
|
80 |
+
$this->api = new OAuth1Client(
|
81 |
+
$this->config["keys"]["key"], $this->config["keys"]["secret"],
|
82 |
+
$this->token( "access_token" ), $this->token( "access_token_secret" )
|
83 |
+
);
|
84 |
+
}
|
85 |
+
|
86 |
+
// 3.2 - setup request_token if any stored, in order to exchange with an access token
|
87 |
+
elseif( $this->token( "request_token" ) ){
|
88 |
+
$this->api = new OAuth1Client(
|
89 |
+
$this->config["keys"]["key"], $this->config["keys"]["secret"],
|
90 |
+
$this->token( "request_token" ), $this->token( "request_token_secret" )
|
91 |
+
);
|
92 |
+
}
|
93 |
+
|
94 |
+
// 3.3 - instanciate OAuth client with client credentials
|
95 |
+
else{
|
96 |
+
$this->api = new OAuth1Client( $this->config["keys"]["key"], $this->config["keys"]["secret"] );
|
97 |
+
}
|
98 |
+
|
99 |
+
// Set curl proxy if exist
|
100 |
+
if( isset( Hybrid_Auth::$config["proxy"] ) ){
|
101 |
+
$this->api->curl_proxy = Hybrid_Auth::$config["proxy"];
|
102 |
+
}
|
103 |
+
}
|
104 |
+
|
105 |
+
// --------------------------------------------------------------------
|
106 |
+
|
107 |
+
/**
|
108 |
+
* begin login step
|
109 |
+
*/
|
110 |
+
function loginBegin()
|
111 |
+
{
|
112 |
+
$tokens = $this->api->requestToken( $this->endpoint );
|
113 |
+
|
114 |
+
// request tokens as received from provider
|
115 |
+
$this->request_tokens_raw = $tokens;
|
116 |
+
|
117 |
+
// check the last HTTP status code returned
|
118 |
+
if ( $this->api->http_code != 200 ){
|
119 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ), 5 );
|
120 |
+
}
|
121 |
+
|
122 |
+
if ( ! isset( $tokens["oauth_token"] ) ){
|
123 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid oauth_token.", 5 );
|
124 |
+
}
|
125 |
+
|
126 |
+
$this->token( "request_token" , $tokens["oauth_token"] );
|
127 |
+
$this->token( "request_token_secret", $tokens["oauth_token_secret"] );
|
128 |
+
|
129 |
+
# redirect the user to the provider authentication url
|
130 |
+
Hybrid_Auth::redirect( $this->api->authorizeUrl( $tokens ) );
|
131 |
+
}
|
132 |
+
|
133 |
+
// --------------------------------------------------------------------
|
134 |
+
|
135 |
+
/**
|
136 |
+
* finish login step
|
137 |
+
*/
|
138 |
+
|
139 |
+
function loginFinish()
|
140 |
+
{
|
141 |
+
$denied = (array_key_exists('denied',$_REQUEST))?$_REQUEST['denied']:"";
|
142 |
+
$oauth_token = (array_key_exists('oauth_token',$_REQUEST))?$_REQUEST['oauth_token']:"";
|
143 |
+
$oauth_verifier = (array_key_exists('oauth_verifier',$_REQUEST))?$_REQUEST['oauth_verifier']:"";
|
144 |
+
|
145 |
+
if ( $denied ){
|
146 |
+
throw new Exception( "Authentication denied! {$this->providerId} returned denied token: " . htmlentities( $denied ), 5 );
|
147 |
+
}
|
148 |
+
|
149 |
+
if ( ! $oauth_token || ! $oauth_verifier ){
|
150 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid oauth_verifier.", 5 );
|
151 |
+
}
|
152 |
+
|
153 |
+
// request an access token
|
154 |
+
$tokens = $this->api->accessToken( $oauth_verifier );
|
155 |
+
|
156 |
+
// access tokens as received from provider
|
157 |
+
$this->access_tokens_raw = $tokens;
|
158 |
+
|
159 |
+
// check the last HTTP status code returned
|
160 |
+
if ( $this->api->http_code != 200 ){
|
161 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ), 5 );
|
162 |
+
}
|
163 |
+
|
164 |
+
// we should have an access_token, or else, something has gone wrong
|
165 |
+
if ( ! isset( $tokens["oauth_token"] ) ){
|
166 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid oauth_token.", 5 );
|
167 |
+
}
|
168 |
+
|
169 |
+
// we no more need to store request tokens
|
170 |
+
$this->deleteToken( "request_token" );
|
171 |
+
$this->deleteToken( "request_token_secret" );
|
172 |
+
|
173 |
+
// store access_token for later user
|
174 |
+
$this->token( "access_token" , $tokens['oauth_token'] );
|
175 |
+
$this->token( "access_token_secret" , $tokens['oauth_token_secret'] );
|
176 |
+
|
177 |
+
// set user as logged in to the current provider
|
178 |
+
$this->setUserConnected();
|
179 |
+
}
|
180 |
+
}
|
hybridauth/Hybrid/Provider_Model_OAuth2.php
CHANGED
@@ -1,184 +1,184 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2014, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* To implement an OAuth 2 based service provider, Hybrid_Provider_Model_OAuth2
|
10 |
-
* can be used to save the hassle of the authentication flow.
|
11 |
-
*
|
12 |
-
* Each class that inherit from Hybrid_Provider_Model_OAuth2 have to implement
|
13 |
-
* at least 2 methods:
|
14 |
-
* Hybrid_Providers_{provider_name}::initialize() to setup the provider api end-points urls
|
15 |
-
* Hybrid_Providers_{provider_name}::getUserProfile() to grab the user profile
|
16 |
-
*
|
17 |
-
* Hybrid_Provider_Model_OAuth2 use OAuth2Client v0.1 which can be found on
|
18 |
-
* Hybrid/thirdparty/OAuth/OAuth2Client.php
|
19 |
-
*/
|
20 |
-
class Hybrid_Provider_Model_OAuth2 extends Hybrid_Provider_Model
|
21 |
-
{
|
22 |
-
/**
|
23 |
-
* default permissions
|
24 |
-
* @var string
|
25 |
-
*/
|
26 |
-
public $scope = "";
|
27 |
-
|
28 |
-
/**
|
29 |
-
* Try to get the error message from provider api
|
30 |
-
* @param Numeric $code
|
31 |
-
*/
|
32 |
-
function errorMessageByStatus( $code = null ) {
|
33 |
-
$http_status_codes = ARRAY(
|
34 |
-
200 => "OK: Success!",
|
35 |
-
304 => "Not Modified: There was no new data to return.",
|
36 |
-
400 => "Bad Request: The request was invalid.",
|
37 |
-
401 => "Unauthorized.",
|
38 |
-
403 => "Forbidden: The request is understood, but it has been refused.",
|
39 |
-
404 => "Not Found: The URI requested is invalid or the resource requested does not exists.",
|
40 |
-
406 => "Not Acceptable.",
|
41 |
-
500 => "Internal Server Error: Something is broken.",
|
42 |
-
502 => "Bad Gateway.",
|
43 |
-
503 => "Service Unavailable."
|
44 |
-
);
|
45 |
-
|
46 |
-
if( ! $code && $this->api )
|
47 |
-
$code = $this->api->http_code;
|
48 |
-
|
49 |
-
if( isset( $http_status_codes[ $code ] ) )
|
50 |
-
return $code . " " . $http_status_codes[ $code ];
|
51 |
-
}
|
52 |
-
|
53 |
-
// --------------------------------------------------------------------
|
54 |
-
|
55 |
-
/**
|
56 |
-
* adapter initializer
|
57 |
-
*/
|
58 |
-
function initialize()
|
59 |
-
{
|
60 |
-
if ( ! isset( $this->config["keys"]["id"] ) || ! isset( $this->config["keys"]["secret"] ) ){
|
61 |
-
throw new Exception( "Your application id and secret are required in order to connect to {$this->providerId}.", 4 );
|
62 |
-
}
|
63 |
-
|
64 |
-
if ( ! $this->config["keys"]["id"] || ! $this->config["keys"]["secret"] ){
|
65 |
-
throw new Exception( "Your application id and secret are required in order to connect to {$this->providerId}.", 4 );
|
66 |
-
}
|
67 |
-
|
68 |
-
// override requested scope
|
69 |
-
if( isset( $this->config["scope"] ) && ! empty( $this->config["scope"] ) ){
|
70 |
-
$this->scope = $this->config["scope"];
|
71 |
-
}
|
72 |
-
|
73 |
-
// include OAuth2 client
|
74 |
-
require_once realpath( dirname( __FILE__ ) ) . "/thirdparty/OAuth/OAuth2Client.php";
|
75 |
-
|
76 |
-
// create a new OAuth2 client instance
|
77 |
-
$this->api = new OAuth2Client( $this->config["keys"]["id"], $this->config["keys"]["secret"], $this->endpoint );
|
78 |
-
|
79 |
-
// If we have an access token, set it
|
80 |
-
if( $this->token( "access_token" ) ){
|
81 |
-
$this->api->access_token = $this->token( "access_token" );
|
82 |
-
$this->api->refresh_token = $this->token( "refresh_token" );
|
83 |
-
$this->api->access_token_expires_in = $this->token( "expires_in" );
|
84 |
-
$this->api->access_token_expires_at = $this->token( "expires_at" );
|
85 |
-
}
|
86 |
-
|
87 |
-
// Set curl proxy if exist
|
88 |
-
if( isset( Hybrid_Auth::$config["proxy"] ) ){
|
89 |
-
$this->api->curl_proxy = Hybrid_Auth::$config["proxy"];
|
90 |
-
}
|
91 |
-
}
|
92 |
-
|
93 |
-
// --------------------------------------------------------------------
|
94 |
-
|
95 |
-
/**
|
96 |
-
* begin login step
|
97 |
-
*/
|
98 |
-
function loginBegin()
|
99 |
-
{
|
100 |
-
// redirect the user to the provider authentication url
|
101 |
-
Hybrid_Auth::redirect( $this->api->authorizeUrl( array( "scope" => $this->scope ) ) );
|
102 |
-
}
|
103 |
-
|
104 |
-
// --------------------------------------------------------------------
|
105 |
-
|
106 |
-
/**
|
107 |
-
* finish login step
|
108 |
-
*/
|
109 |
-
function loginFinish()
|
110 |
-
{
|
111 |
-
$error = (array_key_exists('error',$_REQUEST))?$_REQUEST['error']:"";
|
112 |
-
|
113 |
-
// check for errors
|
114 |
-
if ( $error ){
|
115 |
-
throw new Exception( "Authentication failed! {$this->providerId} returned an error: " . htmlentities( $error ), 5 );
|
116 |
-
}
|
117 |
-
|
118 |
-
// try to authenticate user
|
119 |
-
$code = (array_key_exists('code',$_REQUEST))?$_REQUEST['code'] : "";
|
120 |
-
|
121 |
-
try{
|
122 |
-
$this->api->authenticate( $code );
|
123 |
-
}
|
124 |
-
catch( Exception $e ){
|
125 |
-
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid code " . htmlentities( $code ), 5 );
|
126 |
-
}
|
127 |
-
|
128 |
-
// check if authenticated
|
129 |
-
if ( ! $this->api->access_token ){
|
130 |
-
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid access token.", 5 );
|
131 |
-
}
|
132 |
-
|
133 |
-
// store tokens
|
134 |
-
$this->token( "access_token" , $this->api->access_token );
|
135 |
-
$this->token( "refresh_token", $this->api->refresh_token );
|
136 |
-
$this->token( "expires_in" , $this->api->access_token_expires_in );
|
137 |
-
$this->token( "expires_at" , $this->api->access_token_expires_at );
|
138 |
-
|
139 |
-
// set user connected locally
|
140 |
-
$this->setUserConnected();
|
141 |
-
}
|
142 |
-
|
143 |
-
function refreshToken()
|
144 |
-
{
|
145 |
-
// have an access token?
|
146 |
-
if( $this->api->access_token ){
|
147 |
-
|
148 |
-
// have to refresh?
|
149 |
-
if( $this->api->refresh_token && $this->api->access_token_expires_at ){
|
150 |
-
|
151 |
-
// expired?
|
152 |
-
if( $this->api->access_token_expires_at <= time() ){
|
153 |
-
$response = $this->api->refreshToken( array( "refresh_token" => $this->api->refresh_token ) );
|
154 |
-
|
155 |
-
if( ! isset( $response->access_token ) || ! $response->access_token ){
|
156 |
-
// set the user as disconnected at this point and throw an exception
|
157 |
-
$this->setUserUnconnected();
|
158 |
-
|
159 |
-
throw new Exception( "The Authorization Service has return an invalid response while requesting a new access token. " . (string) $response->error );
|
160 |
-
}
|
161 |
-
|
162 |
-
// set new access_token
|
163 |
-
$this->api->access_token = $response->access_token;
|
164 |
-
|
165 |
-
if( isset( $response->refresh_token ) )
|
166 |
-
$this->api->refresh_token = $response->refresh_token;
|
167 |
-
|
168 |
-
if( isset( $response->expires_in ) ){
|
169 |
-
$this->api->access_token_expires_in = $response->expires_in;
|
170 |
-
|
171 |
-
// even given by some idp, we should calculate this
|
172 |
-
$this->api->access_token_expires_at = time() + $response->expires_in;
|
173 |
-
}
|
174 |
-
}
|
175 |
-
}
|
176 |
-
|
177 |
-
// re store tokens
|
178 |
-
$this->token( "access_token" , $this->api->access_token );
|
179 |
-
$this->token( "refresh_token", $this->api->refresh_token );
|
180 |
-
$this->token( "expires_in" , $this->api->access_token_expires_in );
|
181 |
-
$this->token( "expires_at" , $this->api->access_token_expires_at );
|
182 |
-
}
|
183 |
-
}
|
184 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2014, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* To implement an OAuth 2 based service provider, Hybrid_Provider_Model_OAuth2
|
10 |
+
* can be used to save the hassle of the authentication flow.
|
11 |
+
*
|
12 |
+
* Each class that inherit from Hybrid_Provider_Model_OAuth2 have to implement
|
13 |
+
* at least 2 methods:
|
14 |
+
* Hybrid_Providers_{provider_name}::initialize() to setup the provider api end-points urls
|
15 |
+
* Hybrid_Providers_{provider_name}::getUserProfile() to grab the user profile
|
16 |
+
*
|
17 |
+
* Hybrid_Provider_Model_OAuth2 use OAuth2Client v0.1 which can be found on
|
18 |
+
* Hybrid/thirdparty/OAuth/OAuth2Client.php
|
19 |
+
*/
|
20 |
+
class Hybrid_Provider_Model_OAuth2 extends Hybrid_Provider_Model
|
21 |
+
{
|
22 |
+
/**
|
23 |
+
* default permissions
|
24 |
+
* @var string
|
25 |
+
*/
|
26 |
+
public $scope = "";
|
27 |
+
|
28 |
+
/**
|
29 |
+
* Try to get the error message from provider api
|
30 |
+
* @param Numeric $code
|
31 |
+
*/
|
32 |
+
function errorMessageByStatus( $code = null ) {
|
33 |
+
$http_status_codes = ARRAY(
|
34 |
+
200 => "OK: Success!",
|
35 |
+
304 => "Not Modified: There was no new data to return.",
|
36 |
+
400 => "Bad Request: The request was invalid.",
|
37 |
+
401 => "Unauthorized.",
|
38 |
+
403 => "Forbidden: The request is understood, but it has been refused.",
|
39 |
+
404 => "Not Found: The URI requested is invalid or the resource requested does not exists.",
|
40 |
+
406 => "Not Acceptable.",
|
41 |
+
500 => "Internal Server Error: Something is broken.",
|
42 |
+
502 => "Bad Gateway.",
|
43 |
+
503 => "Service Unavailable."
|
44 |
+
);
|
45 |
+
|
46 |
+
if( ! $code && $this->api )
|
47 |
+
$code = $this->api->http_code;
|
48 |
+
|
49 |
+
if( isset( $http_status_codes[ $code ] ) )
|
50 |
+
return $code . " " . $http_status_codes[ $code ];
|
51 |
+
}
|
52 |
+
|
53 |
+
// --------------------------------------------------------------------
|
54 |
+
|
55 |
+
/**
|
56 |
+
* adapter initializer
|
57 |
+
*/
|
58 |
+
function initialize()
|
59 |
+
{
|
60 |
+
if ( ! isset( $this->config["keys"]["id"] ) || ! isset( $this->config["keys"]["secret"] ) ){
|
61 |
+
throw new Exception( "Your application id and secret are required in order to connect to {$this->providerId}.", 4 );
|
62 |
+
}
|
63 |
+
|
64 |
+
if ( ! $this->config["keys"]["id"] || ! $this->config["keys"]["secret"] ){
|
65 |
+
throw new Exception( "Your application id and secret are required in order to connect to {$this->providerId}.", 4 );
|
66 |
+
}
|
67 |
+
|
68 |
+
// override requested scope
|
69 |
+
if( isset( $this->config["scope"] ) && ! empty( $this->config["scope"] ) ){
|
70 |
+
$this->scope = $this->config["scope"];
|
71 |
+
}
|
72 |
+
|
73 |
+
// include OAuth2 client
|
74 |
+
require_once realpath( dirname( __FILE__ ) ) . "/thirdparty/OAuth/OAuth2Client.php";
|
75 |
+
|
76 |
+
// create a new OAuth2 client instance
|
77 |
+
$this->api = new OAuth2Client( $this->config["keys"]["id"], $this->config["keys"]["secret"], $this->endpoint );
|
78 |
+
|
79 |
+
// If we have an access token, set it
|
80 |
+
if( $this->token( "access_token" ) ){
|
81 |
+
$this->api->access_token = $this->token( "access_token" );
|
82 |
+
$this->api->refresh_token = $this->token( "refresh_token" );
|
83 |
+
$this->api->access_token_expires_in = $this->token( "expires_in" );
|
84 |
+
$this->api->access_token_expires_at = $this->token( "expires_at" );
|
85 |
+
}
|
86 |
+
|
87 |
+
// Set curl proxy if exist
|
88 |
+
if( isset( Hybrid_Auth::$config["proxy"] ) ){
|
89 |
+
$this->api->curl_proxy = Hybrid_Auth::$config["proxy"];
|
90 |
+
}
|
91 |
+
}
|
92 |
+
|
93 |
+
// --------------------------------------------------------------------
|
94 |
+
|
95 |
+
/**
|
96 |
+
* begin login step
|
97 |
+
*/
|
98 |
+
function loginBegin()
|
99 |
+
{
|
100 |
+
// redirect the user to the provider authentication url
|
101 |
+
Hybrid_Auth::redirect( $this->api->authorizeUrl( array( "scope" => $this->scope ) ) );
|
102 |
+
}
|
103 |
+
|
104 |
+
// --------------------------------------------------------------------
|
105 |
+
|
106 |
+
/**
|
107 |
+
* finish login step
|
108 |
+
*/
|
109 |
+
function loginFinish()
|
110 |
+
{
|
111 |
+
$error = (array_key_exists('error',$_REQUEST))?$_REQUEST['error']:"";
|
112 |
+
|
113 |
+
// check for errors
|
114 |
+
if ( $error ){
|
115 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an error: " . htmlentities( $error ), 5 );
|
116 |
+
}
|
117 |
+
|
118 |
+
// try to authenticate user
|
119 |
+
$code = (array_key_exists('code',$_REQUEST))?$_REQUEST['code'] : "";
|
120 |
+
|
121 |
+
try{
|
122 |
+
$this->api->authenticate( $code );
|
123 |
+
}
|
124 |
+
catch( Exception $e ){
|
125 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid code " . htmlentities( $code ), 5 );
|
126 |
+
}
|
127 |
+
|
128 |
+
// check if authenticated
|
129 |
+
if ( ! $this->api->access_token ){
|
130 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid access token.", 5 );
|
131 |
+
}
|
132 |
+
|
133 |
+
// store tokens
|
134 |
+
$this->token( "access_token" , $this->api->access_token );
|
135 |
+
$this->token( "refresh_token", $this->api->refresh_token );
|
136 |
+
$this->token( "expires_in" , $this->api->access_token_expires_in );
|
137 |
+
$this->token( "expires_at" , $this->api->access_token_expires_at );
|
138 |
+
|
139 |
+
// set user connected locally
|
140 |
+
$this->setUserConnected();
|
141 |
+
}
|
142 |
+
|
143 |
+
function refreshToken()
|
144 |
+
{
|
145 |
+
// have an access token?
|
146 |
+
if( $this->api->access_token ){
|
147 |
+
|
148 |
+
// have to refresh?
|
149 |
+
if( $this->api->refresh_token && $this->api->access_token_expires_at ){
|
150 |
+
|
151 |
+
// expired?
|
152 |
+
if( $this->api->access_token_expires_at <= time() ){
|
153 |
+
$response = $this->api->refreshToken( array( "refresh_token" => $this->api->refresh_token ) );
|
154 |
+
|
155 |
+
if( ! isset( $response->access_token ) || ! $response->access_token ){
|
156 |
+
// set the user as disconnected at this point and throw an exception
|
157 |
+
$this->setUserUnconnected();
|
158 |
+
|
159 |
+
throw new Exception( "The Authorization Service has return an invalid response while requesting a new access token. " . (string) $response->error );
|
160 |
+
}
|
161 |
+
|
162 |
+
// set new access_token
|
163 |
+
$this->api->access_token = $response->access_token;
|
164 |
+
|
165 |
+
if( isset( $response->refresh_token ) )
|
166 |
+
$this->api->refresh_token = $response->refresh_token;
|
167 |
+
|
168 |
+
if( isset( $response->expires_in ) ){
|
169 |
+
$this->api->access_token_expires_in = $response->expires_in;
|
170 |
+
|
171 |
+
// even given by some idp, we should calculate this
|
172 |
+
$this->api->access_token_expires_at = time() + $response->expires_in;
|
173 |
+
}
|
174 |
+
}
|
175 |
+
}
|
176 |
+
|
177 |
+
// re store tokens
|
178 |
+
$this->token( "access_token" , $this->api->access_token );
|
179 |
+
$this->token( "refresh_token", $this->api->refresh_token );
|
180 |
+
$this->token( "expires_in" , $this->api->access_token_expires_in );
|
181 |
+
$this->token( "expires_at" , $this->api->access_token_expires_at );
|
182 |
+
}
|
183 |
+
}
|
184 |
+
}
|
hybridauth/Hybrid/Provider_Model_OpenID.php
CHANGED
@@ -1,181 +1,181 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2014, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* To implement an OpenID based service provider, Hybrid_Provider_Model_OpenID
|
10 |
-
* can be used to save the hassle of the authentication flow.
|
11 |
-
*
|
12 |
-
* Each class that inherit from Hybrid_Provider_Model_OAuth2 have only to define
|
13 |
-
* the provider identifier : <code>public $openidIdentifier = ""; </code>
|
14 |
-
*
|
15 |
-
* Hybrid_Provider_Model_OpenID use LightOpenID lib which can be found on
|
16 |
-
* Hybrid/thirdparty/OpenID/LightOpenID.php
|
17 |
-
*/
|
18 |
-
class Hybrid_Provider_Model_OpenID extends Hybrid_Provider_Model
|
19 |
-
{
|
20 |
-
/**
|
21 |
-
* Openid provider identifier
|
22 |
-
* @var string
|
23 |
-
*/
|
24 |
-
public $openidIdentifier = "";
|
25 |
-
|
26 |
-
// --------------------------------------------------------------------
|
27 |
-
|
28 |
-
/**
|
29 |
-
* adapter initializer
|
30 |
-
*/
|
31 |
-
function initialize()
|
32 |
-
{
|
33 |
-
if( isset( $this->params["openid_identifier"] ) ){
|
34 |
-
$this->openidIdentifier = $this->params["openid_identifier"];
|
35 |
-
}
|
36 |
-
|
37 |
-
// include LightOpenID lib
|
38 |
-
if ( ! class_exists( 'LightOpenID', false ) ) {
|
39 |
-
require_once realpath( dirname( __FILE__ ) ) . "/thirdparty/OpenID/LightOpenID.php";
|
40 |
-
}
|
41 |
-
|
42 |
-
// An error was occurring when proxy wasn't set. Not sure where proxy was meant to be set/initialized.
|
43 |
-
Hybrid_Auth::$config['proxy'] = isset(Hybrid_Auth::$config['proxy'])?Hybrid_Auth::$config['proxy']:'';
|
44 |
-
|
45 |
-
$hostPort = parse_url( Hybrid_Auth::$config["base_url"], PHP_URL_PORT);
|
46 |
-
$hostUrl = parse_url( Hybrid_Auth::$config["base_url"], PHP_URL_HOST);
|
47 |
-
|
48 |
-
// Check for port on url
|
49 |
-
if($hostPort) {
|
50 |
-
$hostUrl .= ':'.$hostPort;
|
51 |
-
}
|
52 |
-
|
53 |
-
$this->api = new LightOpenID( $hostUrl, Hybrid_Auth::$config["proxy"] );
|
54 |
-
}
|
55 |
-
|
56 |
-
// --------------------------------------------------------------------
|
57 |
-
|
58 |
-
/**
|
59 |
-
* begin login step
|
60 |
-
*/
|
61 |
-
function loginBegin()
|
62 |
-
{
|
63 |
-
if( empty( $this->openidIdentifier ) ){
|
64 |
-
throw new Exception( "OpenID adapter require the identity provider identifier 'openid_identifier' as an extra parameter.", 4 );
|
65 |
-
}
|
66 |
-
|
67 |
-
$this->api->identity = $this->openidIdentifier;
|
68 |
-
$this->api->returnUrl = $this->endpoint;
|
69 |
-
$this->api->required = ARRAY(
|
70 |
-
'namePerson/first' ,
|
71 |
-
'namePerson/last' ,
|
72 |
-
'namePerson/friendly' ,
|
73 |
-
'namePerson' ,
|
74 |
-
|
75 |
-
'contact/email' ,
|
76 |
-
|
77 |
-
'birthDate' ,
|
78 |
-
'birthDate/birthDay' ,
|
79 |
-
'birthDate/birthMonth' ,
|
80 |
-
'birthDate/birthYear' ,
|
81 |
-
|
82 |
-
'person/gender' ,
|
83 |
-
'pref/language' ,
|
84 |
-
|
85 |
-
'contact/postalCode/home',
|
86 |
-
'contact/city/home' ,
|
87 |
-
'contact/country/home' ,
|
88 |
-
|
89 |
-
'media/image/default' ,
|
90 |
-
);
|
91 |
-
|
92 |
-
# redirect the user to the provider authentication url
|
93 |
-
Hybrid_Auth::redirect( $this->api->authUrl() );
|
94 |
-
}
|
95 |
-
|
96 |
-
// --------------------------------------------------------------------
|
97 |
-
|
98 |
-
/**
|
99 |
-
* finish login step
|
100 |
-
*/
|
101 |
-
function loginFinish()
|
102 |
-
{
|
103 |
-
# if user don't grant access of their data to your site, halt with an Exception
|
104 |
-
if( $this->api->mode == 'cancel'){
|
105 |
-
throw new Exception( "Authentication failed! User has cancelled authentication!", 5 );
|
106 |
-
}
|
107 |
-
|
108 |
-
# if something goes wrong
|
109 |
-
if( ! $this->api->validate() ){
|
110 |
-
throw new Exception( "Authentication failed. Invalid request received!", 5 );
|
111 |
-
}
|
112 |
-
|
113 |
-
# fetch received user data
|
114 |
-
$response = $this->api->getAttributes();
|
115 |
-
|
116 |
-
# store the user profile
|
117 |
-
$this->user->profile->identifier = $this->api->identity;
|
118 |
-
|
119 |
-
$this->user->profile->firstName = (array_key_exists("namePerson/first",$response))?$response["namePerson/first"]:"";
|
120 |
-
$this->user->profile->lastName = (array_key_exists("namePerson/last",$response))?$response["namePerson/last"]:"";
|
121 |
-
$this->user->profile->displayName = (array_key_exists("namePerson",$response))?$response["namePerson"]:"";
|
122 |
-
$this->user->profile->email = (array_key_exists("contact/email",$response))?$response["contact/email"]:"";
|
123 |
-
$this->user->profile->language = (array_key_exists("pref/language",$response))?$response["pref/language"]:"";
|
124 |
-
$this->user->profile->country = (array_key_exists("contact/country/home",$response))?$response["contact/country/home"]:"";
|
125 |
-
$this->user->profile->zip = (array_key_exists("contact/postalCode/home",$response))?$response["contact/postalCode/home"]:"";
|
126 |
-
$this->user->profile->gender = (array_key_exists("person/gender",$response))?$response["person/gender"]:"";
|
127 |
-
$this->user->profile->photoURL = (array_key_exists("media/image/default",$response))?$response["media/image/default"]:"";
|
128 |
-
|
129 |
-
$this->user->profile->birthDay = (array_key_exists("birthDate/birthDay",$response))?$response["birthDate/birthDay"]:"";
|
130 |
-
$this->user->profile->birthMonth = (array_key_exists("birthDate/birthMonth",$response))?$response["birthDate/birthMonth"]:"";
|
131 |
-
$this->user->profile->birthYear = (array_key_exists("birthDate/birthDate",$response))?$response["birthDate/birthDate"]:"";
|
132 |
-
|
133 |
-
if( isset( $response['namePerson/friendly'] ) && ! empty( $response['namePerson/friendly'] ) && ! $this->user->profile->displayName ) {
|
134 |
-
$this->user->profile->displayName = $response["namePerson/friendly"];
|
135 |
-
}
|
136 |
-
|
137 |
-
if( isset( $response['birthDate'] ) && ! empty( $response['birthDate'] ) && ! $this->user->profile->birthDay ) {
|
138 |
-
list( $birthday_year, $birthday_month, $birthday_day ) = $response['birthDate'];
|
139 |
-
|
140 |
-
$this->user->profile->birthDay = (int) $birthday_day;
|
141 |
-
$this->user->profile->birthMonth = (int) $birthday_month;
|
142 |
-
$this->user->profile->birthYear = (int) $birthday_year;
|
143 |
-
}
|
144 |
-
|
145 |
-
if( ! $this->user->profile->displayName ){
|
146 |
-
$this->user->profile->displayName = trim( $this->user->profile->firstName . " " . $this->user->profile->lastName );
|
147 |
-
}
|
148 |
-
|
149 |
-
if( strtolower( $this->user->profile->gender ) == "f" ){
|
150 |
-
$this->user->profile->gender = "female";
|
151 |
-
}
|
152 |
-
|
153 |
-
if( strtolower( $this->user->profile->gender ) == "m" ){
|
154 |
-
$this->user->profile->gender = "male";
|
155 |
-
}
|
156 |
-
|
157 |
-
// set user as logged in
|
158 |
-
$this->setUserConnected();
|
159 |
-
|
160 |
-
// with openid providers we get the user profile only once, so store it
|
161 |
-
Hybrid_Auth::storage()->set( "hauth_session.{$this->providerId}.user", $this->user );
|
162 |
-
}
|
163 |
-
|
164 |
-
// --------------------------------------------------------------------
|
165 |
-
|
166 |
-
/**
|
167 |
-
* load the user profile from the IDp api client
|
168 |
-
*/
|
169 |
-
function getUserProfile()
|
170 |
-
{
|
171 |
-
// try to get the user profile from stored data
|
172 |
-
$this->user = Hybrid_Auth::storage()->get( "hauth_session.{$this->providerId}.user" );
|
173 |
-
|
174 |
-
// if not found
|
175 |
-
if ( ! is_object( $this->user ) ){
|
176 |
-
throw new Exception( "User profile request failed! User is not connected to {$this->providerId} or his session has expired.", 6 );
|
177 |
-
}
|
178 |
-
|
179 |
-
return $this->user->profile;
|
180 |
-
}
|
181 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2014, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* To implement an OpenID based service provider, Hybrid_Provider_Model_OpenID
|
10 |
+
* can be used to save the hassle of the authentication flow.
|
11 |
+
*
|
12 |
+
* Each class that inherit from Hybrid_Provider_Model_OAuth2 have only to define
|
13 |
+
* the provider identifier : <code>public $openidIdentifier = ""; </code>
|
14 |
+
*
|
15 |
+
* Hybrid_Provider_Model_OpenID use LightOpenID lib which can be found on
|
16 |
+
* Hybrid/thirdparty/OpenID/LightOpenID.php
|
17 |
+
*/
|
18 |
+
class Hybrid_Provider_Model_OpenID extends Hybrid_Provider_Model
|
19 |
+
{
|
20 |
+
/**
|
21 |
+
* Openid provider identifier
|
22 |
+
* @var string
|
23 |
+
*/
|
24 |
+
public $openidIdentifier = "";
|
25 |
+
|
26 |
+
// --------------------------------------------------------------------
|
27 |
+
|
28 |
+
/**
|
29 |
+
* adapter initializer
|
30 |
+
*/
|
31 |
+
function initialize()
|
32 |
+
{
|
33 |
+
if( isset( $this->params["openid_identifier"] ) ){
|
34 |
+
$this->openidIdentifier = $this->params["openid_identifier"];
|
35 |
+
}
|
36 |
+
|
37 |
+
// include LightOpenID lib
|
38 |
+
if ( ! class_exists( 'LightOpenID', false ) ) {
|
39 |
+
require_once realpath( dirname( __FILE__ ) ) . "/thirdparty/OpenID/LightOpenID.php";
|
40 |
+
}
|
41 |
+
|
42 |
+
// An error was occurring when proxy wasn't set. Not sure where proxy was meant to be set/initialized.
|
43 |
+
Hybrid_Auth::$config['proxy'] = isset(Hybrid_Auth::$config['proxy'])?Hybrid_Auth::$config['proxy']:'';
|
44 |
+
|
45 |
+
$hostPort = parse_url( Hybrid_Auth::$config["base_url"], PHP_URL_PORT);
|
46 |
+
$hostUrl = parse_url( Hybrid_Auth::$config["base_url"], PHP_URL_HOST);
|
47 |
+
|
48 |
+
// Check for port on url
|
49 |
+
if($hostPort) {
|
50 |
+
$hostUrl .= ':'.$hostPort;
|
51 |
+
}
|
52 |
+
|
53 |
+
$this->api = new LightOpenID( $hostUrl, Hybrid_Auth::$config["proxy"] );
|
54 |
+
}
|
55 |
+
|
56 |
+
// --------------------------------------------------------------------
|
57 |
+
|
58 |
+
/**
|
59 |
+
* begin login step
|
60 |
+
*/
|
61 |
+
function loginBegin()
|
62 |
+
{
|
63 |
+
if( empty( $this->openidIdentifier ) ){
|
64 |
+
throw new Exception( "OpenID adapter require the identity provider identifier 'openid_identifier' as an extra parameter.", 4 );
|
65 |
+
}
|
66 |
+
|
67 |
+
$this->api->identity = $this->openidIdentifier;
|
68 |
+
$this->api->returnUrl = $this->endpoint;
|
69 |
+
$this->api->required = ARRAY(
|
70 |
+
'namePerson/first' ,
|
71 |
+
'namePerson/last' ,
|
72 |
+
'namePerson/friendly' ,
|
73 |
+
'namePerson' ,
|
74 |
+
|
75 |
+
'contact/email' ,
|
76 |
+
|
77 |
+
'birthDate' ,
|
78 |
+
'birthDate/birthDay' ,
|
79 |
+
'birthDate/birthMonth' ,
|
80 |
+
'birthDate/birthYear' ,
|
81 |
+
|
82 |
+
'person/gender' ,
|
83 |
+
'pref/language' ,
|
84 |
+
|
85 |
+
'contact/postalCode/home',
|
86 |
+
'contact/city/home' ,
|
87 |
+
'contact/country/home' ,
|
88 |
+
|
89 |
+
'media/image/default' ,
|
90 |
+
);
|
91 |
+
|
92 |
+
# redirect the user to the provider authentication url
|
93 |
+
Hybrid_Auth::redirect( $this->api->authUrl() );
|
94 |
+
}
|
95 |
+
|
96 |
+
// --------------------------------------------------------------------
|
97 |
+
|
98 |
+
/**
|
99 |
+
* finish login step
|
100 |
+
*/
|
101 |
+
function loginFinish()
|
102 |
+
{
|
103 |
+
# if user don't grant access of their data to your site, halt with an Exception
|
104 |
+
if( $this->api->mode == 'cancel'){
|
105 |
+
throw new Exception( "Authentication failed! User has cancelled authentication!", 5 );
|
106 |
+
}
|
107 |
+
|
108 |
+
# if something goes wrong
|
109 |
+
if( ! $this->api->validate() ){
|
110 |
+
throw new Exception( "Authentication failed. Invalid request received!", 5 );
|
111 |
+
}
|
112 |
+
|
113 |
+
# fetch received user data
|
114 |
+
$response = $this->api->getAttributes();
|
115 |
+
|
116 |
+
# store the user profile
|
117 |
+
$this->user->profile->identifier = $this->api->identity;
|
118 |
+
|
119 |
+
$this->user->profile->firstName = (array_key_exists("namePerson/first",$response))?$response["namePerson/first"]:"";
|
120 |
+
$this->user->profile->lastName = (array_key_exists("namePerson/last",$response))?$response["namePerson/last"]:"";
|
121 |
+
$this->user->profile->displayName = (array_key_exists("namePerson",$response))?$response["namePerson"]:"";
|
122 |
+
$this->user->profile->email = (array_key_exists("contact/email",$response))?$response["contact/email"]:"";
|
123 |
+
$this->user->profile->language = (array_key_exists("pref/language",$response))?$response["pref/language"]:"";
|
124 |
+
$this->user->profile->country = (array_key_exists("contact/country/home",$response))?$response["contact/country/home"]:"";
|
125 |
+
$this->user->profile->zip = (array_key_exists("contact/postalCode/home",$response))?$response["contact/postalCode/home"]:"";
|
126 |
+
$this->user->profile->gender = (array_key_exists("person/gender",$response))?$response["person/gender"]:"";
|
127 |
+
$this->user->profile->photoURL = (array_key_exists("media/image/default",$response))?$response["media/image/default"]:"";
|
128 |
+
|
129 |
+
$this->user->profile->birthDay = (array_key_exists("birthDate/birthDay",$response))?$response["birthDate/birthDay"]:"";
|
130 |
+
$this->user->profile->birthMonth = (array_key_exists("birthDate/birthMonth",$response))?$response["birthDate/birthMonth"]:"";
|
131 |
+
$this->user->profile->birthYear = (array_key_exists("birthDate/birthDate",$response))?$response["birthDate/birthDate"]:"";
|
132 |
+
|
133 |
+
if( isset( $response['namePerson/friendly'] ) && ! empty( $response['namePerson/friendly'] ) && ! $this->user->profile->displayName ) {
|
134 |
+
$this->user->profile->displayName = $response["namePerson/friendly"];
|
135 |
+
}
|
136 |
+
|
137 |
+
if( isset( $response['birthDate'] ) && ! empty( $response['birthDate'] ) && ! $this->user->profile->birthDay ) {
|
138 |
+
list( $birthday_year, $birthday_month, $birthday_day ) = $response['birthDate'];
|
139 |
+
|
140 |
+
$this->user->profile->birthDay = (int) $birthday_day;
|
141 |
+
$this->user->profile->birthMonth = (int) $birthday_month;
|
142 |
+
$this->user->profile->birthYear = (int) $birthday_year;
|
143 |
+
}
|
144 |
+
|
145 |
+
if( ! $this->user->profile->displayName ){
|
146 |
+
$this->user->profile->displayName = trim( $this->user->profile->firstName . " " . $this->user->profile->lastName );
|
147 |
+
}
|
148 |
+
|
149 |
+
if( strtolower( $this->user->profile->gender ) == "f" ){
|
150 |
+
$this->user->profile->gender = "female";
|
151 |
+
}
|
152 |
+
|
153 |
+
if( strtolower( $this->user->profile->gender ) == "m" ){
|
154 |
+
$this->user->profile->gender = "male";
|
155 |
+
}
|
156 |
+
|
157 |
+
// set user as logged in
|
158 |
+
$this->setUserConnected();
|
159 |
+
|
160 |
+
// with openid providers we get the user profile only once, so store it
|
161 |
+
Hybrid_Auth::storage()->set( "hauth_session.{$this->providerId}.user", $this->user );
|
162 |
+
}
|
163 |
+
|
164 |
+
// --------------------------------------------------------------------
|
165 |
+
|
166 |
+
/**
|
167 |
+
* load the user profile from the IDp api client
|
168 |
+
*/
|
169 |
+
function getUserProfile()
|
170 |
+
{
|
171 |
+
// try to get the user profile from stored data
|
172 |
+
$this->user = Hybrid_Auth::storage()->get( "hauth_session.{$this->providerId}.user" );
|
173 |
+
|
174 |
+
// if not found
|
175 |
+
if ( ! is_object( $this->user ) ){
|
176 |
+
throw new Exception( "User profile request failed! User is not connected to {$this->providerId} or his session has expired.", 6 );
|
177 |
+
}
|
178 |
+
|
179 |
+
return $this->user->profile;
|
180 |
+
}
|
181 |
+
}
|
hybridauth/Hybrid/Providers/AOL.php
CHANGED
@@ -1,16 +1,16 @@
|
|
1 |
-
<?php
|
2 |
-
/*!
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Hybrid_Providers_AOL provider adapter based on OpenID protocol
|
10 |
-
*
|
11 |
-
* http://hybridauth.sourceforge.net/userguide/IDProvider_info_AOL.html
|
12 |
-
*/
|
13 |
-
class Hybrid_Providers_AOL extends Hybrid_Provider_Model_OpenID
|
14 |
-
{
|
15 |
-
var $openidIdentifier = "http://openid.aol.com/";
|
16 |
-
}
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Hybrid_Providers_AOL provider adapter based on OpenID protocol
|
10 |
+
*
|
11 |
+
* http://hybridauth.sourceforge.net/userguide/IDProvider_info_AOL.html
|
12 |
+
*/
|
13 |
+
class Hybrid_Providers_AOL extends Hybrid_Provider_Model_OpenID
|
14 |
+
{
|
15 |
+
var $openidIdentifier = "http://openid.aol.com/";
|
16 |
+
}
|
hybridauth/Hybrid/Providers/Disqus.php
CHANGED
@@ -1,59 +1,59 @@
|
|
1 |
-
<?php
|
2 |
-
/*!
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | https://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2014 HybridAuth authors | hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Hybrid_Providers_Disqus
|
10 |
-
*/
|
11 |
-
class Hybrid_Providers_Disqus extends Hybrid_Provider_Model_OAuth2
|
12 |
-
{
|
13 |
-
// default permissions
|
14 |
-
// (read,email) => public info and email
|
15 |
-
public $scope = "read,email";
|
16 |
-
|
17 |
-
/**
|
18 |
-
* IDp wrappers initializer
|
19 |
-
*/
|
20 |
-
function initialize()
|
21 |
-
{
|
22 |
-
parent::initialize();
|
23 |
-
|
24 |
-
// Provider api end-points
|
25 |
-
$this->api->api_base_url = "https://disqus.com/api/3.0/";
|
26 |
-
$this->api->authorize_url = "https://disqus.com/api/oauth/2.0/authorize";
|
27 |
-
$this->api->token_url = "https://disqus.com/api/oauth/2.0/access_token/";
|
28 |
-
|
29 |
-
}
|
30 |
-
|
31 |
-
/**
|
32 |
-
* load the user profile from the IDp api client
|
33 |
-
*/
|
34 |
-
function getUserProfile()
|
35 |
-
{
|
36 |
-
$data = $this->api->get( "users/details" , array('api_key' => $this->api->client_id, 'api_secret' => $this->api->client_secret));
|
37 |
-
|
38 |
-
if ( ! isset( $data->code ) ){
|
39 |
-
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
40 |
-
} else if ( $data->code != 0 ){
|
41 |
-
throw new Exception( "User profile request failed! {$this->providerId} returned error code".$data->code.".", 6 );
|
42 |
-
}
|
43 |
-
|
44 |
-
$this->user->profile->identifier = @ $data->response->id;
|
45 |
-
$this->user->profile->displayName = @ $data->response->name;
|
46 |
-
$this->user->profile->description = @ $data->response->bio;
|
47 |
-
$this->user->profile->photoURL = @ $data->response->avatar->permalink;
|
48 |
-
$this->user->profile->profileURL = @ $data->response->profileUrl;
|
49 |
-
$this->user->profile->email = @ $data->response->email;
|
50 |
-
$this->user->profile->region = @ $data->response->location;
|
51 |
-
$this->user->profile->description = @ $data->response->about;
|
52 |
-
|
53 |
-
if( ! $this->user->profile->displayName ){
|
54 |
-
$this->user->profile->displayName = @ $data->response->username;
|
55 |
-
}
|
56 |
-
|
57 |
-
return $this->user->profile;
|
58 |
-
}
|
59 |
-
}
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | https://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2014 HybridAuth authors | hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Hybrid_Providers_Disqus
|
10 |
+
*/
|
11 |
+
class Hybrid_Providers_Disqus extends Hybrid_Provider_Model_OAuth2
|
12 |
+
{
|
13 |
+
// default permissions
|
14 |
+
// (read,email) => public info and email
|
15 |
+
public $scope = "read,email";
|
16 |
+
|
17 |
+
/**
|
18 |
+
* IDp wrappers initializer
|
19 |
+
*/
|
20 |
+
function initialize()
|
21 |
+
{
|
22 |
+
parent::initialize();
|
23 |
+
|
24 |
+
// Provider api end-points
|
25 |
+
$this->api->api_base_url = "https://disqus.com/api/3.0/";
|
26 |
+
$this->api->authorize_url = "https://disqus.com/api/oauth/2.0/authorize";
|
27 |
+
$this->api->token_url = "https://disqus.com/api/oauth/2.0/access_token/";
|
28 |
+
|
29 |
+
}
|
30 |
+
|
31 |
+
/**
|
32 |
+
* load the user profile from the IDp api client
|
33 |
+
*/
|
34 |
+
function getUserProfile()
|
35 |
+
{
|
36 |
+
$data = $this->api->get( "users/details" , array('api_key' => $this->api->client_id, 'api_secret' => $this->api->client_secret));
|
37 |
+
|
38 |
+
if ( ! isset( $data->code ) ){
|
39 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
40 |
+
} else if ( $data->code != 0 ){
|
41 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned error code".$data->code.".", 6 );
|
42 |
+
}
|
43 |
+
|
44 |
+
$this->user->profile->identifier = @ $data->response->id;
|
45 |
+
$this->user->profile->displayName = @ $data->response->name;
|
46 |
+
$this->user->profile->description = @ $data->response->bio;
|
47 |
+
$this->user->profile->photoURL = @ $data->response->avatar->permalink;
|
48 |
+
$this->user->profile->profileURL = @ $data->response->profileUrl;
|
49 |
+
$this->user->profile->email = @ $data->response->email;
|
50 |
+
$this->user->profile->region = @ $data->response->location;
|
51 |
+
$this->user->profile->description = @ $data->response->about;
|
52 |
+
|
53 |
+
if( ! $this->user->profile->displayName ){
|
54 |
+
$this->user->profile->displayName = @ $data->response->username;
|
55 |
+
}
|
56 |
+
|
57 |
+
return $this->user->profile;
|
58 |
+
}
|
59 |
+
}
|
hybridauth/Hybrid/Providers/Dribbble.php
CHANGED
@@ -1,51 +1,51 @@
|
|
1 |
-
<?php
|
2 |
-
/*!
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | https://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2011 HybridAuth authors | hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Hybrid_Providers_Dribbble
|
10 |
-
*/
|
11 |
-
class Hybrid_Providers_Dribbble extends Hybrid_Provider_Model_OAuth2
|
12 |
-
{
|
13 |
-
// default permissions
|
14 |
-
// (no scope) => public read-only access (includes public user profile info, public repo info, and gists).
|
15 |
-
public $scope = "";
|
16 |
-
|
17 |
-
/**
|
18 |
-
* IDp wrappers initializer
|
19 |
-
*/
|
20 |
-
function initialize()
|
21 |
-
{
|
22 |
-
parent::initialize();
|
23 |
-
|
24 |
-
// Provider api end-points
|
25 |
-
$this->api->api_base_url = "https://api.dribbble.com/v1/";
|
26 |
-
$this->api->authorize_url = "https://dribbble.com/oauth/authorize";
|
27 |
-
$this->api->token_url = "https://dribbble.com/oauth/token";
|
28 |
-
}
|
29 |
-
|
30 |
-
/**
|
31 |
-
* load the user profile from the IDp api client
|
32 |
-
*/
|
33 |
-
function getUserProfile()
|
34 |
-
{
|
35 |
-
$data = $this->api->api( "user" );
|
36 |
-
|
37 |
-
if ( ! isset( $data->id ) ){
|
38 |
-
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
39 |
-
}
|
40 |
-
|
41 |
-
$this->user->profile->identifier = property_exists( $data,'id' ) ? $data->id : '';
|
42 |
-
$this->user->profile->displayName = property_exists( $data,'name' ) ? $data->name : property_exists( $data,'username' ) ? $data->username : '';
|
43 |
-
$this->user->profile->profileURL = property_exists( $data,'html_url' ) ? $data->html_url : '';
|
44 |
-
$this->user->profile->photoURL = property_exists( $data,'avatar_url' ) ? $data->avatar_url : '';
|
45 |
-
$this->user->profile->webSiteURL = property_exists( $data,'links' ) ? ( property_exists( $data->links, 'web' ) ? $data->links->web : '' ) : '';
|
46 |
-
$this->user->profile->description = property_exists( $data,'bio' ) ? $data->bio : '';
|
47 |
-
$this->user->profile->region = property_exists( $data,'location' ) ? $data->location : '';
|
48 |
-
|
49 |
-
return $this->user->profile;
|
50 |
-
}
|
51 |
-
}
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | https://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2011 HybridAuth authors | hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Hybrid_Providers_Dribbble
|
10 |
+
*/
|
11 |
+
class Hybrid_Providers_Dribbble extends Hybrid_Provider_Model_OAuth2
|
12 |
+
{
|
13 |
+
// default permissions
|
14 |
+
// (no scope) => public read-only access (includes public user profile info, public repo info, and gists).
|
15 |
+
public $scope = "";
|
16 |
+
|
17 |
+
/**
|
18 |
+
* IDp wrappers initializer
|
19 |
+
*/
|
20 |
+
function initialize()
|
21 |
+
{
|
22 |
+
parent::initialize();
|
23 |
+
|
24 |
+
// Provider api end-points
|
25 |
+
$this->api->api_base_url = "https://api.dribbble.com/v1/";
|
26 |
+
$this->api->authorize_url = "https://dribbble.com/oauth/authorize";
|
27 |
+
$this->api->token_url = "https://dribbble.com/oauth/token";
|
28 |
+
}
|
29 |
+
|
30 |
+
/**
|
31 |
+
* load the user profile from the IDp api client
|
32 |
+
*/
|
33 |
+
function getUserProfile()
|
34 |
+
{
|
35 |
+
$data = $this->api->api( "user" );
|
36 |
+
|
37 |
+
if ( ! isset( $data->id ) ){
|
38 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
39 |
+
}
|
40 |
+
|
41 |
+
$this->user->profile->identifier = property_exists( $data,'id' ) ? $data->id : '';
|
42 |
+
$this->user->profile->displayName = property_exists( $data,'name' ) ? $data->name : property_exists( $data,'username' ) ? $data->username : '';
|
43 |
+
$this->user->profile->profileURL = property_exists( $data,'html_url' ) ? $data->html_url : '';
|
44 |
+
$this->user->profile->photoURL = property_exists( $data,'avatar_url' ) ? $data->avatar_url : '';
|
45 |
+
$this->user->profile->webSiteURL = property_exists( $data,'links' ) ? ( property_exists( $data->links, 'web' ) ? $data->links->web : '' ) : '';
|
46 |
+
$this->user->profile->description = property_exists( $data,'bio' ) ? $data->bio : '';
|
47 |
+
$this->user->profile->region = property_exists( $data,'location' ) ? $data->location : '';
|
48 |
+
|
49 |
+
return $this->user->profile;
|
50 |
+
}
|
51 |
+
}
|
hybridauth/Hybrid/Providers/Facebook.php
CHANGED
@@ -1,381 +1,306 @@
|
|
1 |
-
<?php
|
2 |
-
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
*
|
10 |
-
*
|
11 |
-
*
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
|
225 |
-
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
|
230 |
-
|
231 |
-
|
232 |
-
|
233 |
-
|
234 |
-
|
235 |
-
|
236 |
-
|
237 |
-
|
238 |
-
|
239 |
-
|
240 |
-
|
241 |
-
|
242 |
-
|
243 |
-
|
244 |
-
|
245 |
-
|
246 |
-
|
247 |
-
|
248 |
-
|
249 |
-
|
250 |
-
|
251 |
-
|
252 |
-
|
253 |
-
|
254 |
-
|
255 |
-
|
256 |
-
|
257 |
-
|
258 |
-
|
259 |
-
|
260 |
-
|
261 |
-
|
262 |
-
|
263 |
-
|
264 |
-
|
265 |
-
|
266 |
-
|
267 |
-
|
268 |
-
|
269 |
-
|
270 |
-
|
271 |
-
|
272 |
-
|
273 |
-
|
274 |
-
|
275 |
-
|
276 |
-
|
277 |
-
|
278 |
-
|
279 |
-
|
280 |
-
|
281 |
-
|
282 |
-
|
283 |
-
|
284 |
-
|
285 |
-
$
|
286 |
-
|
287 |
-
|
288 |
-
|
289 |
-
$
|
290 |
-
|
291 |
-
|
292 |
-
|
293 |
-
|
294 |
-
|
295 |
-
|
296 |
-
|
297 |
-
|
298 |
-
|
299 |
-
|
300 |
-
|
301 |
-
|
302 |
-
|
303 |
-
|
304 |
-
|
305 |
-
|
306 |
-
|
307 |
-
$response = $this->api->api( '/' . $pageid . '/feed', 'post', $status );
|
308 |
-
}
|
309 |
-
catch( FacebookApiException $e ){
|
310 |
-
throw new Exception( "Update user status failed! {$this->providerId} returned an error: $e" );
|
311 |
-
}
|
312 |
-
|
313 |
-
return $response;
|
314 |
-
}
|
315 |
-
|
316 |
-
/**
|
317 |
-
* load the user latest activity
|
318 |
-
* - timeline : all the stream
|
319 |
-
* - me : the user activity only
|
320 |
-
*/
|
321 |
-
function getUserActivity( $stream )
|
322 |
-
{
|
323 |
-
try{
|
324 |
-
$this->setAccessToken();
|
325 |
-
|
326 |
-
if( $stream == "me" ){
|
327 |
-
$response = $this->api->api( '/me/feed' );
|
328 |
-
}
|
329 |
-
else{
|
330 |
-
$response = $this->api->api('/me/home');
|
331 |
-
}
|
332 |
-
}
|
333 |
-
catch( FacebookApiException $e ){
|
334 |
-
throw new Exception( "User activity stream request failed! {$this->providerId} returned an error: $e" );
|
335 |
-
}
|
336 |
-
|
337 |
-
if( ! $response || ! count( $response['data'] ) ){
|
338 |
-
return ARRAY();
|
339 |
-
}
|
340 |
-
|
341 |
-
$activities = ARRAY();
|
342 |
-
|
343 |
-
foreach( $response['data'] as $item ){
|
344 |
-
if( $stream == "me" && $item["from"]["id"] != $this->api->getUser() ){
|
345 |
-
continue;
|
346 |
-
}
|
347 |
-
|
348 |
-
$ua = new Hybrid_User_Activity();
|
349 |
-
|
350 |
-
$ua->id = (array_key_exists("id",$item))?$item["id"]:"";
|
351 |
-
$ua->date = (array_key_exists("created_time",$item))?strtotime($item["created_time"]):"";
|
352 |
-
|
353 |
-
if( $item["type"] == "video" ){
|
354 |
-
$ua->text = (array_key_exists("link",$item))?$item["link"]:"";
|
355 |
-
}
|
356 |
-
|
357 |
-
if( $item["type"] == "link" ){
|
358 |
-
$ua->text = (array_key_exists("link",$item))?$item["link"]:"";
|
359 |
-
}
|
360 |
-
|
361 |
-
if( empty( $ua->text ) && isset( $item["story"] ) ){
|
362 |
-
$ua->text = (array_key_exists("link",$item))?$item["link"]:"";
|
363 |
-
}
|
364 |
-
|
365 |
-
if( empty( $ua->text ) && isset( $item["message"] ) ){
|
366 |
-
$ua->text = (array_key_exists("message",$item))?$item["message"]:"";
|
367 |
-
}
|
368 |
-
|
369 |
-
if( ! empty( $ua->text ) ){
|
370 |
-
$ua->user->identifier = (array_key_exists("id",$item["from"]))?$item["from"]["id"]:"";
|
371 |
-
$ua->user->displayName = (array_key_exists("name",$item["from"]))?$item["from"]["name"]:"";
|
372 |
-
$ua->user->profileURL = "https://www.facebook.com/profile.php?id=" . $ua->user->identifier;
|
373 |
-
$ua->user->photoURL = "https://graph.facebook.com/" . $ua->user->identifier . "/picture?type=square";
|
374 |
-
|
375 |
-
$activities[] = $ua;
|
376 |
-
}
|
377 |
-
}
|
378 |
-
|
379 |
-
return $activities;
|
380 |
-
}
|
381 |
-
}
|
1 |
+
<?php
|
2 |
+
|
3 |
+
require_once realpath( dirname( __FILE__ ) ) . "/../thirdparty/Facebook/autoload.php";
|
4 |
+
|
5 |
+
use Facebook\Exceptions\FacebookSDKException;
|
6 |
+
use Facebook\Facebook as FacebookSDK;
|
7 |
+
|
8 |
+
/* !
|
9 |
+
* HybridAuth
|
10 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
11 |
+
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
12 |
+
*/
|
13 |
+
|
14 |
+
/**
|
15 |
+
* Hybrid_Providers_Facebook provider adapter based on OAuth2 protocol
|
16 |
+
* Hybrid_Providers_Facebook use the Facebook PHP SDK created by Facebook
|
17 |
+
* http://hybridauth.sourceforge.net/userguide/IDProvider_info_Facebook.html
|
18 |
+
*/
|
19 |
+
class Hybrid_Providers_Facebook extends Hybrid_Provider_Model {
|
20 |
+
|
21 |
+
/**
|
22 |
+
* Default permissions, and a lot of them. You can change them from the configuration by setting the scope to what you want/need.
|
23 |
+
* For a complete list see: https://developers.facebook.com/docs/facebook-login/permissions
|
24 |
+
*
|
25 |
+
* @link https://developers.facebook.com/docs/facebook-login/permissions
|
26 |
+
* @var array $scope
|
27 |
+
*/
|
28 |
+
public $scope = ['email', 'user_about_me', 'user_birthday', 'user_hometown', 'user_location', 'user_website', 'publish_actions', 'read_custom_friendlists'];
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Provider API client
|
32 |
+
*
|
33 |
+
* @var \Facebook\Facebook
|
34 |
+
*/
|
35 |
+
public $api;
|
36 |
+
|
37 |
+
public $useSafeUrls = true;
|
38 |
+
|
39 |
+
/**
|
40 |
+
* {@inheritdoc}
|
41 |
+
*/
|
42 |
+
function initialize() {
|
43 |
+
if (!$this->config["keys"]["id"] || !$this->config["keys"]["secret"]) {
|
44 |
+
throw new Exception("Your application id and secret are required in order to connect to {$this->providerId}.", 4);
|
45 |
+
}
|
46 |
+
|
47 |
+
if (isset($this->config['scope'])) {
|
48 |
+
$scope = $this->config['scope'];
|
49 |
+
if (is_string($scope)) {
|
50 |
+
$scope = explode(",", $scope);
|
51 |
+
}
|
52 |
+
$scope = array_map('trim', $scope);
|
53 |
+
$this->scope = $scope;
|
54 |
+
}
|
55 |
+
|
56 |
+
$trustForwarded = isset($this->config['trustForwarded']) ? (bool)$this->config['trustForwarded'] : false;
|
57 |
+
|
58 |
+
$this->api = new FacebookSDK([
|
59 |
+
'app_id' => $this->config["keys"]["id"],
|
60 |
+
'app_secret' => $this->config["keys"]["secret"],
|
61 |
+
'default_graph_version' => 'v2.8',
|
62 |
+
'trustForwarded' => $trustForwarded,
|
63 |
+
]);
|
64 |
+
}
|
65 |
+
|
66 |
+
/**
|
67 |
+
* {@inheritdoc}
|
68 |
+
*/
|
69 |
+
function loginBegin() {
|
70 |
+
|
71 |
+
$this->endpoint = $this->params['login_done'];
|
72 |
+
$this->endpoint = str_replace('?hauth.done=Facebook','?hauth_done=Facebook', $this->endpoint);
|
73 |
+
|
74 |
+
$helper = $this->api->getRedirectLoginHelper();
|
75 |
+
|
76 |
+
// Use re-request, because this will trigger permissions window if not all permissions are granted.
|
77 |
+
$url = $helper->getReRequestUrl($this->endpoint, $this->scope);
|
78 |
+
|
79 |
+
// Redirect to Facebook
|
80 |
+
Hybrid_Auth::redirect($url);
|
81 |
+
}
|
82 |
+
|
83 |
+
/**
|
84 |
+
* {@inheritdoc}
|
85 |
+
*/
|
86 |
+
function loginFinish() {
|
87 |
+
|
88 |
+
$helper = $this->api->getRedirectLoginHelper();
|
89 |
+
try {
|
90 |
+
$this->endpoint = str_replace('?hauth.done=Facebook','?hauth_done=Facebook', $this->endpoint);
|
91 |
+
$accessToken = $helper->getAccessToken($this->endpoint);
|
92 |
+
} catch (Facebook\Exceptions\FacebookResponseException $e) {
|
93 |
+
throw new Hybrid_Exception('Facebook Graph returned an error: ' . $e->getMessage());
|
94 |
+
} catch (Facebook\Exceptions\FacebookSDKException $e) {
|
95 |
+
throw new Hybrid_Exception('Facebook SDK returned an error: ' . $e->getMessage());
|
96 |
+
}
|
97 |
+
|
98 |
+
if (!isset($accessToken)) {
|
99 |
+
if ($helper->getError()) {
|
100 |
+
throw new Hybrid_Exception(sprintf("Could not authorize user, reason: %s (%d)", $helper->getErrorDescription(), $helper->getErrorCode()));
|
101 |
+
} else {
|
102 |
+
throw new Hybrid_Exception("Could not authorize user. Bad request");
|
103 |
+
}
|
104 |
+
}
|
105 |
+
|
106 |
+
try {
|
107 |
+
// Validate token
|
108 |
+
$oAuth2Client = $this->api->getOAuth2Client();
|
109 |
+
$tokenMetadata = $oAuth2Client->debugToken($accessToken);
|
110 |
+
$tokenMetadata->validateAppId($this->config["keys"]["id"]);
|
111 |
+
$tokenMetadata->validateExpiration();
|
112 |
+
|
113 |
+
// Exchanges a short-lived access token for a long-lived one
|
114 |
+
if (!$accessToken->isLongLived()) {
|
115 |
+
$accessToken = $oAuth2Client->getLongLivedAccessToken($accessToken);
|
116 |
+
}
|
117 |
+
} catch (FacebookSDKException $e) {
|
118 |
+
throw new Hybrid_Exception($e->getMessage(), 0, $e);
|
119 |
+
}
|
120 |
+
|
121 |
+
$this->setUserConnected();
|
122 |
+
$this->token("access_token", $accessToken->getValue());
|
123 |
+
}
|
124 |
+
|
125 |
+
/**
|
126 |
+
* {@inheritdoc}
|
127 |
+
*/
|
128 |
+
function logout() {
|
129 |
+
parent::logout();
|
130 |
+
}
|
131 |
+
|
132 |
+
/**
|
133 |
+
* {@inheritdoc}
|
134 |
+
*/
|
135 |
+
function getUserProfile() {
|
136 |
+
try {
|
137 |
+
$fields = [
|
138 |
+
'id',
|
139 |
+
'name',
|
140 |
+
'first_name',
|
141 |
+
'last_name',
|
142 |
+
'link',
|
143 |
+
'website',
|
144 |
+
'gender',
|
145 |
+
'locale',
|
146 |
+
'about',
|
147 |
+
'email',
|
148 |
+
'hometown',
|
149 |
+
'location',
|
150 |
+
'birthday'
|
151 |
+
];
|
152 |
+
$response = $this->api->get('/me?fields=' . implode(',', $fields), $this->token('access_token'));
|
153 |
+
$data = $response->getDecodedBody();
|
154 |
+
} catch (FacebookSDKException $e) {
|
155 |
+
throw new Exception("User profile request failed! {$this->providerId} returned an error: {$e->getMessage()}", 6, $e);
|
156 |
+
}
|
157 |
+
|
158 |
+
// Store the user profile.
|
159 |
+
$this->user->profile->identifier = (array_key_exists('id', $data)) ? $data['id'] : "";
|
160 |
+
$this->user->profile->displayName = (array_key_exists('name', $data)) ? $data['name'] : "";
|
161 |
+
$this->user->profile->firstName = (array_key_exists('first_name', $data)) ? $data['first_name'] : "";
|
162 |
+
$this->user->profile->lastName = (array_key_exists('last_name', $data)) ? $data['last_name'] : "";
|
163 |
+
$this->user->profile->photoURL = !empty($this->user->profile->identifier) ? "https://graph.facebook.com/" . $this->user->profile->identifier . "/picture?width=150&height=150" : '';
|
164 |
+
$this->user->profile->profileURL = (array_key_exists('link', $data)) ? $data['link'] : "";
|
165 |
+
$this->user->profile->webSiteURL = (array_key_exists('website', $data)) ? $data['website'] : "";
|
166 |
+
$this->user->profile->gender = (array_key_exists('gender', $data)) ? $data['gender'] : "";
|
167 |
+
$this->user->profile->language = (array_key_exists('locale', $data)) ? $data['locale'] : "";
|
168 |
+
$this->user->profile->description = (array_key_exists('about', $data)) ? $data['about'] : "";
|
169 |
+
$this->user->profile->email = (array_key_exists('email', $data)) ? $data['email'] : "";
|
170 |
+
$this->user->profile->emailVerified = (array_key_exists('email', $data)) ? $data['email'] : "";
|
171 |
+
$this->user->profile->region = (array_key_exists("location", $data) && array_key_exists("name", $data['location'])) ? $data['location']["name"] : "";
|
172 |
+
|
173 |
+
if (!empty($this->user->profile->region)) {
|
174 |
+
$regionArr = explode(',', $this->user->profile->region);
|
175 |
+
if (count($regionArr) > 1) {
|
176 |
+
$this->user->profile->city = trim($regionArr[0]);
|
177 |
+
$this->user->profile->country = trim(end($regionArr));
|
178 |
+
}
|
179 |
+
}
|
180 |
+
|
181 |
+
if (array_key_exists('birthday', $data)) {
|
182 |
+
$birtydayPieces = explode('/', $data['birthday']);
|
183 |
+
|
184 |
+
if (count($birtydayPieces) == 1) {
|
185 |
+
$this->user->profile->birthYear = (int)$birtydayPieces[0];
|
186 |
+
} elseif (count($birtydayPieces) == 2) {
|
187 |
+
$this->user->profile->birthMonth = (int)$birtydayPieces[0];
|
188 |
+
$this->user->profile->birthDay = (int)$birtydayPieces[1];
|
189 |
+
} elseif (count($birtydayPieces) == 3) {
|
190 |
+
$this->user->profile->birthMonth = (int)$birtydayPieces[0];
|
191 |
+
$this->user->profile->birthDay = (int)$birtydayPieces[1];
|
192 |
+
$this->user->profile->birthYear = (int)$birtydayPieces[2];
|
193 |
+
}
|
194 |
+
}
|
195 |
+
|
196 |
+
return $this->user->profile;
|
197 |
+
}
|
198 |
+
|
199 |
+
/**
|
200 |
+
* Since the Graph API 2.0, the /friends endpoint only returns friend that also use your Facebook app.
|
201 |
+
* {@inheritdoc}
|
202 |
+
*/
|
203 |
+
function getUserContacts() {
|
204 |
+
$apiCall = '?fields=link,name';
|
205 |
+
$returnedContacts = [];
|
206 |
+
$pagedList = true;
|
207 |
+
|
208 |
+
while ($pagedList) {
|
209 |
+
try {
|
210 |
+
$response = $this->api->get('/me/friends' . $apiCall, $this->token('access_token'));
|
211 |
+
$response = $response->getDecodedBody();
|
212 |
+
} catch (FacebookSDKException $e) {
|
213 |
+
throw new Hybrid_Exception("User contacts request failed! {$this->providerId} returned an error {$e->getMessage()}", 0, $e);
|
214 |
+
}
|
215 |
+
|
216 |
+
// Prepare the next call if paging links have been returned
|
217 |
+
if (array_key_exists('paging', $response) && array_key_exists('next', $response['paging'])) {
|
218 |
+
$pagedList = true;
|
219 |
+
$next_page = explode('friends', $response['paging']['next']);
|
220 |
+
$apiCall = $next_page[1];
|
221 |
+
} else {
|
222 |
+
$pagedList = false;
|
223 |
+
}
|
224 |
+
|
225 |
+
// Add the new page contacts
|
226 |
+
$returnedContacts = array_merge($returnedContacts, $response['data']);
|
227 |
+
}
|
228 |
+
|
229 |
+
$contacts = [];
|
230 |
+
|
231 |
+
foreach ($returnedContacts as $item) {
|
232 |
+
|
233 |
+
$uc = new Hybrid_User_Contact();
|
234 |
+
$uc->identifier = (array_key_exists("id", $item)) ? $item["id"] : "";
|
235 |
+
$uc->displayName = (array_key_exists("name", $item)) ? $item["name"] : "";
|
236 |
+
$uc->profileURL = (array_key_exists("link", $item)) ? $item["link"] : "https://www.facebook.com/profile.php?id=" . $uc->identifier;
|
237 |
+
$uc->photoURL = "https://graph.facebook.com/" . $uc->identifier . "/picture?width=150&height=150";
|
238 |
+
|
239 |
+
$contacts[] = $uc;
|
240 |
+
}
|
241 |
+
|
242 |
+
return $contacts;
|
243 |
+
}
|
244 |
+
|
245 |
+
/**
|
246 |
+
* Load the user latest activity, needs 'read_stream' permission
|
247 |
+
*
|
248 |
+
* @param string $stream Which activity to fetch:
|
249 |
+
* - timeline : all the stream
|
250 |
+
* - me : the user activity only
|
251 |
+
* {@inheritdoc}
|
252 |
+
*/
|
253 |
+
function getUserActivity($stream = 'timeline') {
|
254 |
+
try {
|
255 |
+
if ($stream == "me") {
|
256 |
+
$response = $this->api->get('/me/feed', $this->token('access_token'));
|
257 |
+
} else {
|
258 |
+
$response = $this->api->get('/me/home', $this->token('access_token'));
|
259 |
+
}
|
260 |
+
} catch (FacebookSDKException $e) {
|
261 |
+
throw new Hybrid_Exception("User activity stream request failed! {$this->providerId} returned an error: {$e->getMessage()}", 0, $e);
|
262 |
+
}
|
263 |
+
|
264 |
+
if (!$response || !count($response['data'])) {
|
265 |
+
return [];
|
266 |
+
}
|
267 |
+
|
268 |
+
$activities = [];
|
269 |
+
|
270 |
+
foreach ($response['data'] as $item) {
|
271 |
+
|
272 |
+
$ua = new Hybrid_User_Activity();
|
273 |
+
|
274 |
+
$ua->id = (array_key_exists("id", $item)) ? $item["id"] : "";
|
275 |
+
$ua->date = (array_key_exists("created_time", $item)) ? strtotime($item["created_time"]) : "";
|
276 |
+
|
277 |
+
if ($item["type"] == "video") {
|
278 |
+
$ua->text = (array_key_exists("link", $item)) ? $item["link"] : "";
|
279 |
+
}
|
280 |
+
|
281 |
+
if ($item["type"] == "link") {
|
282 |
+
$ua->text = (array_key_exists("link", $item)) ? $item["link"] : "";
|
283 |
+
}
|
284 |
+
|
285 |
+
if (empty($ua->text) && isset($item["story"])) {
|
286 |
+
$ua->text = (array_key_exists("link", $item)) ? $item["link"] : "";
|
287 |
+
}
|
288 |
+
|
289 |
+
if (empty($ua->text) && isset($item["message"])) {
|
290 |
+
$ua->text = (array_key_exists("message", $item)) ? $item["message"] : "";
|
291 |
+
}
|
292 |
+
|
293 |
+
if (!empty($ua->text)) {
|
294 |
+
$ua->user->identifier = (array_key_exists("id", $item["from"])) ? $item["from"]["id"] : "";
|
295 |
+
$ua->user->displayName = (array_key_exists("name", $item["from"])) ? $item["from"]["name"] : "";
|
296 |
+
$ua->user->profileURL = "https://www.facebook.com/profile.php?id=" . $ua->user->identifier;
|
297 |
+
$ua->user->photoURL = "https://graph.facebook.com/" . $ua->user->identifier . "/picture?type=square";
|
298 |
+
|
299 |
+
$activities[] = $ua;
|
300 |
+
}
|
301 |
+
}
|
302 |
+
|
303 |
+
return $activities;
|
304 |
+
}
|
305 |
+
|
306 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
hybridauth/Hybrid/Providers/Foursquare.php
CHANGED
@@ -1,56 +1,56 @@
|
|
1 |
-
<?php
|
2 |
-
/*!
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Hybrid_Providers_Foursquare provider adapter based on OAuth2 protocol
|
10 |
-
*
|
11 |
-
* http://hybridauth.sourceforge.net/userguide/IDProvider_info_Foursquare.html
|
12 |
-
*/
|
13 |
-
class Hybrid_Providers_Foursquare extends Hybrid_Provider_Model_OAuth2
|
14 |
-
{
|
15 |
-
/**
|
16 |
-
* IDp wrappers initializer
|
17 |
-
*/
|
18 |
-
function initialize()
|
19 |
-
{
|
20 |
-
parent::initialize();
|
21 |
-
|
22 |
-
// Provider apis end-points
|
23 |
-
$this->api->api_base_url = "https://api.foursquare.com/v2/";
|
24 |
-
$this->api->authorize_url = "https://foursquare.com/oauth2/authenticate";
|
25 |
-
$this->api->token_url = "https://foursquare.com/oauth2/access_token";
|
26 |
-
|
27 |
-
$this->api->sign_token_name = "oauth_token";
|
28 |
-
}
|
29 |
-
|
30 |
-
/**
|
31 |
-
* load the user profile from the IDp api client
|
32 |
-
*/
|
33 |
-
function getUserProfile()
|
34 |
-
{
|
35 |
-
$data = $this->api->api( "users/self", "GET", array( "v" => "20120610" ) );
|
36 |
-
|
37 |
-
if ( ! isset( $data->response->user->id ) ){
|
38 |
-
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
39 |
-
}
|
40 |
-
|
41 |
-
$data = $data->response->user;
|
42 |
-
|
43 |
-
$this->user->profile->identifier = $data->id;
|
44 |
-
$this->user->profile->firstName = $data->firstName;
|
45 |
-
$this->user->profile->lastName = $data->lastName;
|
46 |
-
$this->user->profile->displayName = trim( $this->user->profile->firstName . " " . $this->user->profile->lastName );
|
47 |
-
$this->user->profile->photoURL = $data->photo;
|
48 |
-
$this->user->profile->profileURL = "https://www.foursquare.com/user/" . $data->id;
|
49 |
-
$this->user->profile->gender = $data->gender;
|
50 |
-
$this->user->profile->city = $data->homeCity;
|
51 |
-
$this->user->profile->email = $data->contact->email;
|
52 |
-
$this->user->profile->emailVerified = $data->contact->email;
|
53 |
-
|
54 |
-
return $this->user->profile;
|
55 |
-
}
|
56 |
-
}
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Hybrid_Providers_Foursquare provider adapter based on OAuth2 protocol
|
10 |
+
*
|
11 |
+
* http://hybridauth.sourceforge.net/userguide/IDProvider_info_Foursquare.html
|
12 |
+
*/
|
13 |
+
class Hybrid_Providers_Foursquare extends Hybrid_Provider_Model_OAuth2
|
14 |
+
{
|
15 |
+
/**
|
16 |
+
* IDp wrappers initializer
|
17 |
+
*/
|
18 |
+
function initialize()
|
19 |
+
{
|
20 |
+
parent::initialize();
|
21 |
+
|
22 |
+
// Provider apis end-points
|
23 |
+
$this->api->api_base_url = "https://api.foursquare.com/v2/";
|
24 |
+
$this->api->authorize_url = "https://foursquare.com/oauth2/authenticate";
|
25 |
+
$this->api->token_url = "https://foursquare.com/oauth2/access_token";
|
26 |
+
|
27 |
+
$this->api->sign_token_name = "oauth_token";
|
28 |
+
}
|
29 |
+
|
30 |
+
/**
|
31 |
+
* load the user profile from the IDp api client
|
32 |
+
*/
|
33 |
+
function getUserProfile()
|
34 |
+
{
|
35 |
+
$data = $this->api->api( "users/self", "GET", array( "v" => "20120610" ) );
|
36 |
+
|
37 |
+
if ( ! isset( $data->response->user->id ) ){
|
38 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
39 |
+
}
|
40 |
+
|
41 |
+
$data = $data->response->user;
|
42 |
+
|
43 |
+
$this->user->profile->identifier = $data->id;
|
44 |
+
$this->user->profile->firstName = $data->firstName;
|
45 |
+
$this->user->profile->lastName = $data->lastName;
|
46 |
+
$this->user->profile->displayName = trim( $this->user->profile->firstName . " " . $this->user->profile->lastName );
|
47 |
+
$this->user->profile->photoURL = $data->photo;
|
48 |
+
$this->user->profile->profileURL = "https://www.foursquare.com/user/" . $data->id;
|
49 |
+
$this->user->profile->gender = $data->gender;
|
50 |
+
$this->user->profile->city = $data->homeCity;
|
51 |
+
$this->user->profile->email = $data->contact->email;
|
52 |
+
$this->user->profile->emailVerified = $data->contact->email;
|
53 |
+
|
54 |
+
return $this->user->profile;
|
55 |
+
}
|
56 |
+
}
|
hybridauth/Hybrid/Providers/GitHub.php
CHANGED
@@ -1,72 +1,72 @@
|
|
1 |
-
<?php
|
2 |
-
/*!
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | https://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2011 HybridAuth authors | hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Hybrid_Providers_GitHub
|
10 |
-
*/
|
11 |
-
class Hybrid_Providers_GitHub extends Hybrid_Provider_Model_OAuth2
|
12 |
-
{
|
13 |
-
// default permissions
|
14 |
-
// (no scope) => public read-only access (includes public user profile info, public repo info, and gists).
|
15 |
-
public $scope = "user:email";
|
16 |
-
|
17 |
-
/**
|
18 |
-
* IDp wrappers initializer
|
19 |
-
*/
|
20 |
-
function initialize()
|
21 |
-
{
|
22 |
-
parent::initialize();
|
23 |
-
|
24 |
-
// Provider api end-points
|
25 |
-
$this->api->api_base_url = "https://api.github.com/";
|
26 |
-
$this->api->authorize_url = "https://github.com/login/oauth/authorize";
|
27 |
-
$this->api->token_url = "https://github.com/login/oauth/access_token";
|
28 |
-
}
|
29 |
-
|
30 |
-
/**
|
31 |
-
* load the user profile from the IDp api client
|
32 |
-
*/
|
33 |
-
function getUserProfile()
|
34 |
-
{
|
35 |
-
$data = $this->api->api( "user" );
|
36 |
-
|
37 |
-
if ( ! isset( $data->id ) ){
|
38 |
-
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
39 |
-
}
|
40 |
-
|
41 |
-
$this->user->profile->identifier = @ $data->id;
|
42 |
-
$this->user->profile->displayName = @ $data->name;
|
43 |
-
$this->user->profile->description = @ $data->bio;
|
44 |
-
$this->user->profile->photoURL = @ $data->avatar_url;
|
45 |
-
$this->user->profile->profileURL = @ $data->html_url;
|
46 |
-
$this->user->profile->email = @ $data->email;
|
47 |
-
$this->user->profile->webSiteURL = @ $data->blog;
|
48 |
-
$this->user->profile->region = @ $data->location;
|
49 |
-
|
50 |
-
if( ! $this->user->profile->displayName ){
|
51 |
-
$this->user->profile->displayName = @ $data->login;
|
52 |
-
}
|
53 |
-
|
54 |
-
// request user emails from github api
|
55 |
-
if( ! $data->email ){
|
56 |
-
try{
|
57 |
-
$emails = $this->api->api("user/emails");
|
58 |
-
|
59 |
-
// fail gracefully, and let apps collect the email if not present
|
60 |
-
if (is_array($emails) && !empty($emails[0]->email))
|
61 |
-
{
|
62 |
-
$this->user->profile->email = $emails[0]->email;
|
63 |
-
}
|
64 |
-
}
|
65 |
-
catch( GithubApiException $e ){
|
66 |
-
throw new Exception( "User email request failed! {$this->providerId} returned an error: $e", 6 );
|
67 |
-
}
|
68 |
-
}
|
69 |
-
|
70 |
-
return $this->user->profile;
|
71 |
-
}
|
72 |
-
}
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | https://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2011 HybridAuth authors | hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Hybrid_Providers_GitHub
|
10 |
+
*/
|
11 |
+
class Hybrid_Providers_GitHub extends Hybrid_Provider_Model_OAuth2
|
12 |
+
{
|
13 |
+
// default permissions
|
14 |
+
// (no scope) => public read-only access (includes public user profile info, public repo info, and gists).
|
15 |
+
public $scope = "user:email";
|
16 |
+
|
17 |
+
/**
|
18 |
+
* IDp wrappers initializer
|
19 |
+
*/
|
20 |
+
function initialize()
|
21 |
+
{
|
22 |
+
parent::initialize();
|
23 |
+
|
24 |
+
// Provider api end-points
|
25 |
+
$this->api->api_base_url = "https://api.github.com/";
|
26 |
+
$this->api->authorize_url = "https://github.com/login/oauth/authorize";
|
27 |
+
$this->api->token_url = "https://github.com/login/oauth/access_token";
|
28 |
+
}
|
29 |
+
|
30 |
+
/**
|
31 |
+
* load the user profile from the IDp api client
|
32 |
+
*/
|
33 |
+
function getUserProfile()
|
34 |
+
{
|
35 |
+
$data = $this->api->api( "user" );
|
36 |
+
|
37 |
+
if ( ! isset( $data->id ) ){
|
38 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
39 |
+
}
|
40 |
+
|
41 |
+
$this->user->profile->identifier = @ $data->id;
|
42 |
+
$this->user->profile->displayName = @ $data->name;
|
43 |
+
$this->user->profile->description = @ $data->bio;
|
44 |
+
$this->user->profile->photoURL = @ $data->avatar_url;
|
45 |
+
$this->user->profile->profileURL = @ $data->html_url;
|
46 |
+
$this->user->profile->email = @ $data->email;
|
47 |
+
$this->user->profile->webSiteURL = @ $data->blog;
|
48 |
+
$this->user->profile->region = @ $data->location;
|
49 |
+
|
50 |
+
if( ! $this->user->profile->displayName ){
|
51 |
+
$this->user->profile->displayName = @ $data->login;
|
52 |
+
}
|
53 |
+
|
54 |
+
// request user emails from github api
|
55 |
+
if( ! $data->email ){
|
56 |
+
try{
|
57 |
+
$emails = $this->api->api("user/emails");
|
58 |
+
|
59 |
+
// fail gracefully, and let apps collect the email if not present
|
60 |
+
if (is_array($emails) && !empty($emails[0]->email))
|
61 |
+
{
|
62 |
+
$this->user->profile->email = $emails[0]->email;
|
63 |
+
}
|
64 |
+
}
|
65 |
+
catch( GithubApiException $e ){
|
66 |
+
throw new Exception( "User email request failed! {$this->providerId} returned an error: $e", 6 );
|
67 |
+
}
|
68 |
+
}
|
69 |
+
|
70 |
+
return $this->user->profile;
|
71 |
+
}
|
72 |
+
}
|
hybridauth/Hybrid/Providers/Goodreads.php
CHANGED
@@ -1,115 +1,115 @@
|
|
1 |
-
<?php
|
2 |
-
/*!
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | https://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2011 HybridAuth authors | hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Hybrid_Providers_Goodreads
|
10 |
-
*/
|
11 |
-
class Hybrid_Providers_Goodreads extends Hybrid_Provider_Model_OAuth1
|
12 |
-
{
|
13 |
-
/**
|
14 |
-
* IDp wrappers initializer
|
15 |
-
*/
|
16 |
-
function initialize()
|
17 |
-
{
|
18 |
-
parent::initialize();
|
19 |
-
|
20 |
-
// provider api end-points
|
21 |
-
$this->api->api_base_url = "http://www.goodreads.com/";
|
22 |
-
$this->api->authorize_url = "http://www.goodreads.com/oauth/authorize";
|
23 |
-
$this->api->request_token_url = "http://www.goodreads.com/oauth/request_token";
|
24 |
-
$this->api->access_token_url = "http://www.goodreads.com/oauth/access_token";
|
25 |
-
|
26 |
-
// turn off json parsing!
|
27 |
-
$this->api->decode_json = false;
|
28 |
-
}
|
29 |
-
|
30 |
-
/**
|
31 |
-
* finish login step
|
32 |
-
*/
|
33 |
-
function loginFinish()
|
34 |
-
{
|
35 |
-
// in case we get authorize=0
|
36 |
-
if ( ! isset($_REQUEST['oauth_token']) || ( isset( $_REQUEST['authorize'] ) && $_REQUEST['authorize'] == "0" ) ){
|
37 |
-
throw new Exception( "Authentication failed! The user denied your request.", 5 );
|
38 |
-
}
|
39 |
-
|
40 |
-
$oauth_verifier = @ $_REQUEST['oauth_token'];
|
41 |
-
|
42 |
-
if ( !$oauth_verifier ){
|
43 |
-
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid oauth verifier.", 5 );
|
44 |
-
}
|
45 |
-
|
46 |
-
// request an access token
|
47 |
-
$tokens = $this->api->accessToken( $oauth_verifier );
|
48 |
-
|
49 |
-
// access tokens as received from provider
|
50 |
-
$this->access_tokens_raw = $tokens;
|
51 |
-
|
52 |
-
// check the last HTTP status code returned
|
53 |
-
if ( $this->api->http_code != 200 ){
|
54 |
-
throw new Exception( "Authentication failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ), 5 );
|
55 |
-
}
|
56 |
-
|
57 |
-
// we should have an access_token, or else, something has gone wrong
|
58 |
-
if ( ! isset( $tokens["oauth_token"] ) ){
|
59 |
-
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid access token.", 5 );
|
60 |
-
}
|
61 |
-
|
62 |
-
// we no more need to store request tokens
|
63 |
-
$this->deleteToken( "request_token" );
|
64 |
-
$this->deleteToken( "request_token_secret" );
|
65 |
-
|
66 |
-
// store access_token for later user
|
67 |
-
$this->token( "access_token" , $tokens['oauth_token'] );
|
68 |
-
$this->token( "access_token_secret" , $tokens['oauth_token_secret'] );
|
69 |
-
|
70 |
-
// set user as logged in to the current provider
|
71 |
-
$this->setUserConnected();
|
72 |
-
}
|
73 |
-
|
74 |
-
/**
|
75 |
-
* load the user profile from the IDp api client
|
76 |
-
*/
|
77 |
-
function getUserProfile()
|
78 |
-
{
|
79 |
-
$response = $this->api->get( 'http://www.goodreads.com/api/auth_user' );
|
80 |
-
|
81 |
-
// check the last HTTP status code returned
|
82 |
-
if ( $this->api->http_code != 200 )
|
83 |
-
{
|
84 |
-
throw new Exception( "User profile request failed! {$this->providerId} returned an error: " . $this->errorMessageByStatus( $this->api->http_code ), 6 );
|
85 |
-
}
|
86 |
-
|
87 |
-
// parse the response
|
88 |
-
$response = @ new SimpleXMLElement( $response );
|
89 |
-
|
90 |
-
$this->user->profile->identifier = (string) $response->user['id'];
|
91 |
-
$this->user->profile->displayName = (string) $response->user->name;
|
92 |
-
$this->user->profile->profileURL = (string) $response->user->link;
|
93 |
-
|
94 |
-
// try to grab more information about the user if possible
|
95 |
-
$response = $this->api->get( 'http://www.goodreads.com/user/show/' . $this->user->profile->identifier . '.xml' );
|
96 |
-
|
97 |
-
// check the last HTTP status code returned
|
98 |
-
if ( $this->api->http_code != 200 )
|
99 |
-
{
|
100 |
-
return $this->user->profile;
|
101 |
-
}
|
102 |
-
|
103 |
-
// parse the response
|
104 |
-
$response = @ new SimpleXMLElement( $response );
|
105 |
-
|
106 |
-
$this->user->profile->photoURL = (string) $response->user->image_url;
|
107 |
-
$this->user->profile->webSiteURL = (string) $response->user->website;
|
108 |
-
$this->user->profile->description = (string) $response->user->about;
|
109 |
-
$this->user->profile->country = (string) $response->user->location;
|
110 |
-
$this->user->profile->gender = (string) $response->user->gender;
|
111 |
-
$this->user->profile->age = (string) $response->user->age;
|
112 |
-
|
113 |
-
return $this->user->profile;
|
114 |
-
}
|
115 |
-
}
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | https://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2011 HybridAuth authors | hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Hybrid_Providers_Goodreads
|
10 |
+
*/
|
11 |
+
class Hybrid_Providers_Goodreads extends Hybrid_Provider_Model_OAuth1
|
12 |
+
{
|
13 |
+
/**
|
14 |
+
* IDp wrappers initializer
|
15 |
+
*/
|
16 |
+
function initialize()
|
17 |
+
{
|
18 |
+
parent::initialize();
|
19 |
+
|
20 |
+
// provider api end-points
|
21 |
+
$this->api->api_base_url = "http://www.goodreads.com/";
|
22 |
+
$this->api->authorize_url = "http://www.goodreads.com/oauth/authorize";
|
23 |
+
$this->api->request_token_url = "http://www.goodreads.com/oauth/request_token";
|
24 |
+
$this->api->access_token_url = "http://www.goodreads.com/oauth/access_token";
|
25 |
+
|
26 |
+
// turn off json parsing!
|
27 |
+
$this->api->decode_json = false;
|
28 |
+
}
|
29 |
+
|
30 |
+
/**
|
31 |
+
* finish login step
|
32 |
+
*/
|
33 |
+
function loginFinish()
|
34 |
+
{
|
35 |
+
// in case we get authorize=0
|
36 |
+
if ( ! isset($_REQUEST['oauth_token']) || ( isset( $_REQUEST['authorize'] ) && $_REQUEST['authorize'] == "0" ) ){
|
37 |
+
throw new Exception( "Authentication failed! The user denied your request.", 5 );
|
38 |
+
}
|
39 |
+
|
40 |
+
$oauth_verifier = @ $_REQUEST['oauth_token'];
|
41 |
+
|
42 |
+
if ( !$oauth_verifier ){
|
43 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid oauth verifier.", 5 );
|
44 |
+
}
|
45 |
+
|
46 |
+
// request an access token
|
47 |
+
$tokens = $this->api->accessToken( $oauth_verifier );
|
48 |
+
|
49 |
+
// access tokens as received from provider
|
50 |
+
$this->access_tokens_raw = $tokens;
|
51 |
+
|
52 |
+
// check the last HTTP status code returned
|
53 |
+
if ( $this->api->http_code != 200 ){
|
54 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ), 5 );
|
55 |
+
}
|
56 |
+
|
57 |
+
// we should have an access_token, or else, something has gone wrong
|
58 |
+
if ( ! isset( $tokens["oauth_token"] ) ){
|
59 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid access token.", 5 );
|
60 |
+
}
|
61 |
+
|
62 |
+
// we no more need to store request tokens
|
63 |
+
$this->deleteToken( "request_token" );
|
64 |
+
$this->deleteToken( "request_token_secret" );
|
65 |
+
|
66 |
+
// store access_token for later user
|
67 |
+
$this->token( "access_token" , $tokens['oauth_token'] );
|
68 |
+
$this->token( "access_token_secret" , $tokens['oauth_token_secret'] );
|
69 |
+
|
70 |
+
// set user as logged in to the current provider
|
71 |
+
$this->setUserConnected();
|
72 |
+
}
|
73 |
+
|
74 |
+
/**
|
75 |
+
* load the user profile from the IDp api client
|
76 |
+
*/
|
77 |
+
function getUserProfile()
|
78 |
+
{
|
79 |
+
$response = $this->api->get( 'http://www.goodreads.com/api/auth_user' );
|
80 |
+
|
81 |
+
// check the last HTTP status code returned
|
82 |
+
if ( $this->api->http_code != 200 )
|
83 |
+
{
|
84 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an error: " . $this->errorMessageByStatus( $this->api->http_code ), 6 );
|
85 |
+
}
|
86 |
+
|
87 |
+
// parse the response
|
88 |
+
$response = @ new SimpleXMLElement( $response );
|
89 |
+
|
90 |
+
$this->user->profile->identifier = (string) $response->user['id'];
|
91 |
+
$this->user->profile->displayName = (string) $response->user->name;
|
92 |
+
$this->user->profile->profileURL = (string) $response->user->link;
|
93 |
+
|
94 |
+
// try to grab more information about the user if possible
|
95 |
+
$response = $this->api->get( 'http://www.goodreads.com/user/show/' . $this->user->profile->identifier . '.xml' );
|
96 |
+
|
97 |
+
// check the last HTTP status code returned
|
98 |
+
if ( $this->api->http_code != 200 )
|
99 |
+
{
|
100 |
+
return $this->user->profile;
|
101 |
+
}
|
102 |
+
|
103 |
+
// parse the response
|
104 |
+
$response = @ new SimpleXMLElement( $response );
|
105 |
+
|
106 |
+
$this->user->profile->photoURL = (string) $response->user->image_url;
|
107 |
+
$this->user->profile->webSiteURL = (string) $response->user->website;
|
108 |
+
$this->user->profile->description = (string) $response->user->about;
|
109 |
+
$this->user->profile->country = (string) $response->user->location;
|
110 |
+
$this->user->profile->gender = (string) $response->user->gender;
|
111 |
+
$this->user->profile->age = (string) $response->user->age;
|
112 |
+
|
113 |
+
return $this->user->profile;
|
114 |
+
}
|
115 |
+
}
|
hybridauth/Hybrid/Providers/Google.php
CHANGED
@@ -1,242 +1,242 @@
|
|
1 |
-
<?php
|
2 |
-
/*!
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2014, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Hybrid_Providers_Google provider adapter based on OAuth2 protocol
|
10 |
-
*
|
11 |
-
* http://hybridauth.sourceforge.net/userguide/IDProvider_info_Google.html
|
12 |
-
*/
|
13 |
-
class Hybrid_Providers_Google extends Hybrid_Provider_Model_OAuth2
|
14 |
-
{
|
15 |
-
// > more infos on google APIs: http://developer.google.com (official site)
|
16 |
-
// or here: http://discovery-check.appspot.com/ (unofficial but up to date)
|
17 |
-
|
18 |
-
// default permissions
|
19 |
-
public $scope = "profile https://www.googleapis.com/auth/plus.profile.emails.read";
|
20 |
-
|
21 |
-
/**
|
22 |
-
* IDp wrappers initializer
|
23 |
-
*/
|
24 |
-
function initialize()
|
25 |
-
{
|
26 |
-
parent::initialize();
|
27 |
-
|
28 |
-
// Provider api end-points
|
29 |
-
$this->api->api_base_url = "https://www.googleapis.com/plus/v1/";
|
30 |
-
$this->api->authorize_url = "https://accounts.google.com/o/oauth2/auth";
|
31 |
-
$this->api->token_url = "https://accounts.google.com/o/oauth2/token";
|
32 |
-
$this->api->token_info_url = "https://www.googleapis.com/oauth2/v2/tokeninfo";
|
33 |
-
|
34 |
-
// Override the redirect uri when it's set in the config parameters. This way we prevent
|
35 |
-
// redirect uri mismatches when authenticating with Google.
|
36 |
-
if( isset( $this->config['redirect_uri'] ) && ! empty( $this->config['redirect_uri'] ) ){
|
37 |
-
$this->api->redirect_uri = $this->config['redirect_uri'];
|
38 |
-
}
|
39 |
-
}
|
40 |
-
|
41 |
-
/**
|
42 |
-
* begin login step
|
43 |
-
*/
|
44 |
-
function loginBegin()
|
45 |
-
{
|
46 |
-
$parameters = array("scope" => $this->scope, "access_type" => "offline");
|
47 |
-
$optionals = array("scope", "access_type", "redirect_uri", "approval_prompt", "hd", "state");
|
48 |
-
|
49 |
-
foreach ($optionals as $parameter){
|
50 |
-
if( isset( $this->config[$parameter] ) && ! empty( $this->config[$parameter] ) ){
|
51 |
-
$parameters[$parameter] = $this->config[$parameter];
|
52 |
-
}
|
53 |
-
if( isset( $this->config["scope"] ) && ! empty( $this->config["scope"] ) ){
|
54 |
-
$this->scope = $this->config["scope"];
|
55 |
-
}
|
56 |
-
}
|
57 |
-
|
58 |
-
if( isset( $this->config[ 'force' ] ) && $this->config[ 'force' ] === true ){
|
59 |
-
$parameters[ 'approval_prompt' ] = 'force';
|
60 |
-
}
|
61 |
-
|
62 |
-
Hybrid_Auth::redirect( $this->api->authorizeUrl( $parameters ) );
|
63 |
-
}
|
64 |
-
|
65 |
-
/**
|
66 |
-
* load the user profile from the IDp api client
|
67 |
-
*/
|
68 |
-
function getUserProfile()
|
69 |
-
{
|
70 |
-
// refresh tokens if needed
|
71 |
-
$this->refreshToken();
|
72 |
-
|
73 |
-
$response = $this->api->api( "https://www.googleapis.com/plus/v1/people/me" );
|
74 |
-
|
75 |
-
if ( ! isset( $response->id ) || isset( $response->error ) ){
|
76 |
-
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
77 |
-
}
|
78 |
-
|
79 |
-
$this->user->profile->identifier = (property_exists($response,'id'))?$response->id:((property_exists($response,'id'))?$response->id:"");
|
80 |
-
$this->user->profile->firstName = (property_exists($response,'name'))?$response->name->givenName:"";
|
81 |
-
$this->user->profile->lastName = (property_exists($response,'name'))?$response->name->familyName:"";
|
82 |
-
$this->user->profile->displayName = (property_exists($response,'displayName'))?$response->displayName:"";
|
83 |
-
$this->user->profile->photoURL = (property_exists($response,'image'))?((property_exists($response->image,'url'))?substr($response->image->url, 0, -2)."200":''):'';
|
84 |
-
$this->user->profile->profileURL = (property_exists($response,'url'))?$response->url:"";
|
85 |
-
$this->user->profile->description = (property_exists($response,'aboutMe'))?$response->aboutMe:"";
|
86 |
-
$this->user->profile->gender = (property_exists($response,'gender'))?$response->gender:"";
|
87 |
-
$this->user->profile->language = (property_exists($response,'locale'))?$response->locale:'';
|
88 |
-
$this->user->profile->email = (property_exists($response,'email'))?$response->email:'';
|
89 |
-
|
90 |
-
if (property_exists($response, 'emails')) {
|
91 |
-
if (count($response->emails) == 1) {
|
92 |
-
$this->user->profile->email = $response->emails[0]->value;
|
93 |
-
} else {
|
94 |
-
foreach ($response->emails as $email) {
|
95 |
-
if ($email->type == 'account') {
|
96 |
-
$this->user->profile->email = $email->value;
|
97 |
-
break;
|
98 |
-
}
|
99 |
-
}
|
100 |
-
}
|
101 |
-
}
|
102 |
-
|
103 |
-
$this->user->profile->emailVerified = $this->user->profile->email;
|
104 |
-
|
105 |
-
$this->user->profile->phone = (property_exists($response,'phone'))?$response->phone:"";
|
106 |
-
$this->user->profile->country = (property_exists($response,'country'))?$response->country:"";
|
107 |
-
$this->user->profile->region = (property_exists($response,'region'))?$response->region:"";
|
108 |
-
$this->user->profile->zip = (property_exists($response,'zip'))?$response->zip:"";
|
109 |
-
if( property_exists($response,'placesLived') ){
|
110 |
-
$this->user->profile->city = "";
|
111 |
-
$this->user->profile->address = "";
|
112 |
-
foreach($response->placesLived as $c){
|
113 |
-
if(property_exists($c,'primary')){
|
114 |
-
if($c->primary == true){
|
115 |
-
$this->user->profile->address = $c->value;
|
116 |
-
$this->user->profile->city = $c->value;
|
117 |
-
break;
|
118 |
-
}
|
119 |
-
}else{
|
120 |
-
if(property_exists($c,'value')){
|
121 |
-
$this->user->profile->address = $c->value;
|
122 |
-
$this->user->profile->city = $c->value;
|
123 |
-
}
|
124 |
-
}
|
125 |
-
}
|
126 |
-
}
|
127 |
-
|
128 |
-
// google API returns multiple urls, but a "website" only if it is verified
|
129 |
-
// see http://support.google.com/plus/answer/1713826?hl=en
|
130 |
-
if( property_exists($response,'urls') ){
|
131 |
-
foreach($response->urls as $u){
|
132 |
-
if(property_exists($u, 'primary') && $u->primary == true) $this->user->profile->webSiteURL = $u->value;
|
133 |
-
}
|
134 |
-
} else {
|
135 |
-
$this->user->profile->webSiteURL = '';
|
136 |
-
}
|
137 |
-
// google API returns age ranges or min. age only (with plus.login scope)
|
138 |
-
if( property_exists($response,'ageRange') ){
|
139 |
-
if( property_exists($response->ageRange,'min') && property_exists($response->ageRange,'max') ){
|
140 |
-
$this->user->profile->age = $response->ageRange->min.' - '.$response->ageRange->max;
|
141 |
-
} else {
|
142 |
-
$this->user->profile->age = '> '.$response->ageRange->min;
|
143 |
-
}
|
144 |
-
} else {
|
145 |
-
$this->user->profile->age = '';
|
146 |
-
}
|
147 |
-
// google API returns birthdays only if a user set 'show in my account'
|
148 |
-
if( property_exists($response,'birthday') ){
|
149 |
-
list($birthday_year, $birthday_month, $birthday_day) = explode( '-', $response->birthday );
|
150 |
-
|
151 |
-
$this->user->profile->birthDay = (int) $birthday_day;
|
152 |
-
$this->user->profile->birthMonth = (int) $birthday_month;
|
153 |
-
$this->user->profile->birthYear = (int) $birthday_year;
|
154 |
-
} else {
|
155 |
-
$this->user->profile->birthDay=0;$this->user->profile->birthMonth=0;$this->user->profile->birthYear=0;
|
156 |
-
}
|
157 |
-
|
158 |
-
return $this->user->profile;
|
159 |
-
}
|
160 |
-
|
161 |
-
/**
|
162 |
-
* load the user (Gmail and google plus) contacts
|
163 |
-
* ..toComplete
|
164 |
-
*/
|
165 |
-
function getUserContacts()
|
166 |
-
{
|
167 |
-
// refresh tokens if needed
|
168 |
-
$this->refreshToken();
|
169 |
-
|
170 |
-
$contacts = array();
|
171 |
-
if( ! isset( $this->config['contacts_param'] ) ){
|
172 |
-
$this->config['contacts_param'] = array( "max-results" => 500 );
|
173 |
-
}
|
174 |
-
|
175 |
-
$response = $this->api->api( "https://www.google.com/m8/feeds/contacts/default/full?"
|
176 |
-
. http_build_query( array_merge( array('alt' => 'json', 'v' => '3.0'), $this->config['contacts_param'] ) ) );
|
177 |
-
|
178 |
-
if( ! $response ){
|
179 |
-
return ARRAY();
|
180 |
-
}
|
181 |
-
|
182 |
-
if (isset($response->feed->entry)) {
|
183 |
-
foreach( $response->feed->entry as $idx => $entry ){
|
184 |
-
$uc = new Hybrid_User_Contact();
|
185 |
-
$uc->email = isset($entry->{'gd$email'}[0]->address) ? (string) $entry->{'gd$email'}[0]->address : '';
|
186 |
-
$uc->displayName = isset($entry->title->{'$t'}) ? (string) $entry->title->{'$t'} : '';
|
187 |
-
$uc->identifier = ($uc->email!='')?$uc->email:'';
|
188 |
-
$uc->description = '';
|
189 |
-
if( property_exists($entry,'link') ){
|
190 |
-
/**
|
191 |
-
* sign links with access_token
|
192 |
-
*/
|
193 |
-
if(is_array($entry->link)){
|
194 |
-
foreach($entry->link as $l){
|
195 |
-
if( property_exists($l,'gd$etag') && $l->type=="image/*"){
|
196 |
-
$uc->photoURL = $this->addUrlParam($l->href, array('access_token' => $this->api->access_token));
|
197 |
-
} else if($l->type=="self"){
|
198 |
-
$uc->profileURL = $this->addUrlParam($l->href, array('access_token' => $this->api->access_token));
|
199 |
-
}
|
200 |
-
}
|
201 |
-
}
|
202 |
-
} else {
|
203 |
-
$uc->profileURL = '';
|
204 |
-
}
|
205 |
-
if( property_exists($response,'website') ){
|
206 |
-
if(is_array($response->website)){
|
207 |
-
foreach($response->website as $w){
|
208 |
-
if($w->primary == true) $uc->webSiteURL = $w->value;
|
209 |
-
}
|
210 |
-
} else {
|
211 |
-
$uc->webSiteURL = $response->website->value;
|
212 |
-
}
|
213 |
-
} else {
|
214 |
-
$uc->webSiteURL = '';
|
215 |
-
}
|
216 |
-
|
217 |
-
$contacts[] = $uc;
|
218 |
-
}
|
219 |
-
}
|
220 |
-
|
221 |
-
return $contacts;
|
222 |
-
}
|
223 |
-
|
224 |
-
/**
|
225 |
-
* Add to the $url new parameters
|
226 |
-
* @param string $url
|
227 |
-
* @param array $params
|
228 |
-
* @return string
|
229 |
-
*/
|
230 |
-
function addUrlParam($url, array $params)
|
231 |
-
{
|
232 |
-
$query = parse_url($url, PHP_URL_QUERY);
|
233 |
-
|
234 |
-
// Returns the URL string with new parameters
|
235 |
-
if( $query ) {
|
236 |
-
$url .= '&' . http_build_query( $params );
|
237 |
-
} else {
|
238 |
-
$url .= '?' . http_build_query( $params );
|
239 |
-
}
|
240 |
-
return $url;
|
241 |
-
}
|
242 |
-
}
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2014, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Hybrid_Providers_Google provider adapter based on OAuth2 protocol
|
10 |
+
*
|
11 |
+
* http://hybridauth.sourceforge.net/userguide/IDProvider_info_Google.html
|
12 |
+
*/
|
13 |
+
class Hybrid_Providers_Google extends Hybrid_Provider_Model_OAuth2
|
14 |
+
{
|
15 |
+
// > more infos on google APIs: http://developer.google.com (official site)
|
16 |
+
// or here: http://discovery-check.appspot.com/ (unofficial but up to date)
|
17 |
+
|
18 |
+
// default permissions
|
19 |
+
public $scope = "profile https://www.googleapis.com/auth/plus.profile.emails.read";
|
20 |
+
|
21 |
+
/**
|
22 |
+
* IDp wrappers initializer
|
23 |
+
*/
|
24 |
+
function initialize()
|
25 |
+
{
|
26 |
+
parent::initialize();
|
27 |
+
|
28 |
+
// Provider api end-points
|
29 |
+
$this->api->api_base_url = "https://www.googleapis.com/plus/v1/";
|
30 |
+
$this->api->authorize_url = "https://accounts.google.com/o/oauth2/auth";
|
31 |
+
$this->api->token_url = "https://accounts.google.com/o/oauth2/token";
|
32 |
+
$this->api->token_info_url = "https://www.googleapis.com/oauth2/v2/tokeninfo";
|
33 |
+
|
34 |
+
// Override the redirect uri when it's set in the config parameters. This way we prevent
|
35 |
+
// redirect uri mismatches when authenticating with Google.
|
36 |
+
if( isset( $this->config['redirect_uri'] ) && ! empty( $this->config['redirect_uri'] ) ){
|
37 |
+
$this->api->redirect_uri = $this->config['redirect_uri'];
|
38 |
+
}
|
39 |
+
}
|
40 |
+
|
41 |
+
/**
|
42 |
+
* begin login step
|
43 |
+
*/
|
44 |
+
function loginBegin()
|
45 |
+
{
|
46 |
+
$parameters = array("scope" => $this->scope, "access_type" => "offline");
|
47 |
+
$optionals = array("scope", "access_type", "redirect_uri", "approval_prompt", "hd", "state");
|
48 |
+
|
49 |
+
foreach ($optionals as $parameter){
|
50 |
+
if( isset( $this->config[$parameter] ) && ! empty( $this->config[$parameter] ) ){
|
51 |
+
$parameters[$parameter] = $this->config[$parameter];
|
52 |
+
}
|
53 |
+
if( isset( $this->config["scope"] ) && ! empty( $this->config["scope"] ) ){
|
54 |
+
$this->scope = $this->config["scope"];
|
55 |
+
}
|
56 |
+
}
|
57 |
+
|
58 |
+
if( isset( $this->config[ 'force' ] ) && $this->config[ 'force' ] === true ){
|
59 |
+
$parameters[ 'approval_prompt' ] = 'force';
|
60 |
+
}
|
61 |
+
|
62 |
+
Hybrid_Auth::redirect( $this->api->authorizeUrl( $parameters ) );
|
63 |
+
}
|
64 |
+
|
65 |
+
/**
|
66 |
+
* load the user profile from the IDp api client
|
67 |
+
*/
|
68 |
+
function getUserProfile()
|
69 |
+
{
|
70 |
+
// refresh tokens if needed
|
71 |
+
$this->refreshToken();
|
72 |
+
|
73 |
+
$response = $this->api->api( "https://www.googleapis.com/plus/v1/people/me" );
|
74 |
+
|
75 |
+
if ( ! isset( $response->id ) || isset( $response->error ) ){
|
76 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
77 |
+
}
|
78 |
+
|
79 |
+
$this->user->profile->identifier = (property_exists($response,'id'))?$response->id:((property_exists($response,'id'))?$response->id:"");
|
80 |
+
$this->user->profile->firstName = (property_exists($response,'name'))?$response->name->givenName:"";
|
81 |
+
$this->user->profile->lastName = (property_exists($response,'name'))?$response->name->familyName:"";
|
82 |
+
$this->user->profile->displayName = (property_exists($response,'displayName'))?$response->displayName:"";
|
83 |
+
$this->user->profile->photoURL = (property_exists($response,'image'))?((property_exists($response->image,'url'))?substr($response->image->url, 0, -2)."200":''):'';
|
84 |
+
$this->user->profile->profileURL = (property_exists($response,'url'))?$response->url:"";
|
85 |
+
$this->user->profile->description = (property_exists($response,'aboutMe'))?$response->aboutMe:"";
|
86 |
+
$this->user->profile->gender = (property_exists($response,'gender'))?$response->gender:"";
|
87 |
+
$this->user->profile->language = (property_exists($response,'locale'))?$response->locale:'';
|
88 |
+
$this->user->profile->email = (property_exists($response,'email'))?$response->email:'';
|
89 |
+
|
90 |
+
if (property_exists($response, 'emails')) {
|
91 |
+
if (count($response->emails) == 1) {
|
92 |
+
$this->user->profile->email = $response->emails[0]->value;
|
93 |
+
} else {
|
94 |
+
foreach ($response->emails as $email) {
|
95 |
+
if ($email->type == 'account') {
|
96 |
+
$this->user->profile->email = $email->value;
|
97 |
+
break;
|
98 |
+
}
|
99 |
+
}
|
100 |
+
}
|
101 |
+
}
|
102 |
+
|
103 |
+
$this->user->profile->emailVerified = $this->user->profile->email;
|
104 |
+
|
105 |
+
$this->user->profile->phone = (property_exists($response,'phone'))?$response->phone:"";
|
106 |
+
$this->user->profile->country = (property_exists($response,'country'))?$response->country:"";
|
107 |
+
$this->user->profile->region = (property_exists($response,'region'))?$response->region:"";
|
108 |
+
$this->user->profile->zip = (property_exists($response,'zip'))?$response->zip:"";
|
109 |
+
if( property_exists($response,'placesLived') ){
|
110 |
+
$this->user->profile->city = "";
|
111 |
+
$this->user->profile->address = "";
|
112 |
+
foreach($response->placesLived as $c){
|
113 |
+
if(property_exists($c,'primary')){
|
114 |
+
if($c->primary == true){
|
115 |
+
$this->user->profile->address = $c->value;
|
116 |
+
$this->user->profile->city = $c->value;
|
117 |
+
break;
|
118 |
+
}
|
119 |
+
}else{
|
120 |
+
if(property_exists($c,'value')){
|
121 |
+
$this->user->profile->address = $c->value;
|
122 |
+
$this->user->profile->city = $c->value;
|
123 |
+
}
|
124 |
+
}
|
125 |
+
}
|
126 |
+
}
|
127 |
+
|
128 |
+
// google API returns multiple urls, but a "website" only if it is verified
|
129 |
+
// see http://support.google.com/plus/answer/1713826?hl=en
|
130 |
+
if( property_exists($response,'urls') ){
|
131 |
+
foreach($response->urls as $u){
|
132 |
+
if(property_exists($u, 'primary') && $u->primary == true) $this->user->profile->webSiteURL = $u->value;
|
133 |
+
}
|
134 |
+
} else {
|
135 |
+
$this->user->profile->webSiteURL = '';
|
136 |
+
}
|
137 |
+
// google API returns age ranges or min. age only (with plus.login scope)
|
138 |
+
if( property_exists($response,'ageRange') ){
|
139 |
+
if( property_exists($response->ageRange,'min') && property_exists($response->ageRange,'max') ){
|
140 |
+
$this->user->profile->age = $response->ageRange->min.' - '.$response->ageRange->max;
|
141 |
+
} else {
|
142 |
+
$this->user->profile->age = '> '.$response->ageRange->min;
|
143 |
+
}
|
144 |
+
} else {
|
145 |
+
$this->user->profile->age = '';
|
146 |
+
}
|
147 |
+
// google API returns birthdays only if a user set 'show in my account'
|
148 |
+
if( property_exists($response,'birthday') ){
|
149 |
+
list($birthday_year, $birthday_month, $birthday_day) = explode( '-', $response->birthday );
|
150 |
+
|
151 |
+
$this->user->profile->birthDay = (int) $birthday_day;
|
152 |
+
$this->user->profile->birthMonth = (int) $birthday_month;
|
153 |
+
$this->user->profile->birthYear = (int) $birthday_year;
|
154 |
+
} else {
|
155 |
+
$this->user->profile->birthDay=0;$this->user->profile->birthMonth=0;$this->user->profile->birthYear=0;
|
156 |
+
}
|
157 |
+
|
158 |
+
return $this->user->profile;
|
159 |
+
}
|
160 |
+
|
161 |
+
/**
|
162 |
+
* load the user (Gmail and google plus) contacts
|
163 |
+
* ..toComplete
|
164 |
+
*/
|
165 |
+
function getUserContacts()
|
166 |
+
{
|
167 |
+
// refresh tokens if needed
|
168 |
+
$this->refreshToken();
|
169 |
+
|
170 |
+
$contacts = array();
|
171 |
+
if( ! isset( $this->config['contacts_param'] ) ){
|
172 |
+
$this->config['contacts_param'] = array( "max-results" => 500 );
|
173 |
+
}
|
174 |
+
|
175 |
+
$response = $this->api->api( "https://www.google.com/m8/feeds/contacts/default/full?"
|
176 |
+
. http_build_query( array_merge( array('alt' => 'json', 'v' => '3.0'), $this->config['contacts_param'] ) ) );
|
177 |
+
|
178 |
+
if( ! $response ){
|
179 |
+
return ARRAY();
|
180 |
+
}
|
181 |
+
|
182 |
+
if (isset($response->feed->entry)) {
|
183 |
+
foreach( $response->feed->entry as $idx => $entry ){
|
184 |
+
$uc = new Hybrid_User_Contact();
|
185 |
+
$uc->email = isset($entry->{'gd$email'}[0]->address) ? (string) $entry->{'gd$email'}[0]->address : '';
|
186 |
+
$uc->displayName = isset($entry->title->{'$t'}) ? (string) $entry->title->{'$t'} : '';
|
187 |
+
$uc->identifier = ($uc->email!='')?$uc->email:'';
|
188 |
+
$uc->description = '';
|
189 |
+
if( property_exists($entry,'link') ){
|
190 |
+
/**
|
191 |
+
* sign links with access_token
|
192 |
+
*/
|
193 |
+
if(is_array($entry->link)){
|
194 |
+
foreach($entry->link as $l){
|
195 |
+
if( property_exists($l,'gd$etag') && $l->type=="image/*"){
|
196 |
+
$uc->photoURL = $this->addUrlParam($l->href, array('access_token' => $this->api->access_token));
|
197 |
+
} else if($l->type=="self"){
|
198 |
+
$uc->profileURL = $this->addUrlParam($l->href, array('access_token' => $this->api->access_token));
|
199 |
+
}
|
200 |
+
}
|
201 |
+
}
|
202 |
+
} else {
|
203 |
+
$uc->profileURL = '';
|
204 |
+
}
|
205 |
+
if( property_exists($response,'website') ){
|
206 |
+
if(is_array($response->website)){
|
207 |
+
foreach($response->website as $w){
|
208 |
+
if($w->primary == true) $uc->webSiteURL = $w->value;
|
209 |
+
}
|
210 |
+
} else {
|
211 |
+
$uc->webSiteURL = $response->website->value;
|
212 |
+
}
|
213 |
+
} else {
|
214 |
+
$uc->webSiteURL = '';
|
215 |
+
}
|
216 |
+
|
217 |
+
$contacts[] = $uc;
|
218 |
+
}
|
219 |
+
}
|
220 |
+
|
221 |
+
return $contacts;
|
222 |
+
}
|
223 |
+
|
224 |
+
/**
|
225 |
+
* Add to the $url new parameters
|
226 |
+
* @param string $url
|
227 |
+
* @param array $params
|
228 |
+
* @return string
|
229 |
+
*/
|
230 |
+
function addUrlParam($url, array $params)
|
231 |
+
{
|
232 |
+
$query = parse_url($url, PHP_URL_QUERY);
|
233 |
+
|
234 |
+
// Returns the URL string with new parameters
|
235 |
+
if( $query ) {
|
236 |
+
$url .= '&' . http_build_query( $params );
|
237 |
+
} else {
|
238 |
+
$url .= '?' . http_build_query( $params );
|
239 |
+
}
|
240 |
+
return $url;
|
241 |
+
}
|
242 |
+
}
|
hybridauth/Hybrid/Providers/Instagram.php
CHANGED
@@ -1,48 +1,49 @@
|
|
1 |
-
<?php
|
2 |
-
/*!
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | https://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2012 HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Hybrid_Providers_Instagram (By Sebastian Lasse - https://github.com/sebilasse)
|
10 |
-
*/
|
11 |
-
class Hybrid_Providers_Instagram extends Hybrid_Provider_Model_OAuth2
|
12 |
-
{
|
13 |
-
// default permissions
|
14 |
-
public $scope = "basic";
|
15 |
-
|
16 |
-
/**
|
17 |
-
* IDp wrappers initializer
|
18 |
-
*/
|
19 |
-
function initialize()
|
20 |
-
{
|
21 |
-
parent::initialize();
|
22 |
-
|
23 |
-
// Provider api end-points
|
24 |
-
$this->api->api_base_url = "https://api.instagram.com/v1/";
|
25 |
-
$this->api->authorize_url = "https://api.instagram.com/oauth/authorize/";
|
26 |
-
$this->api->token_url = "https://api.instagram.com/oauth/access_token";
|
27 |
-
}
|
28 |
-
|
29 |
-
/**
|
30 |
-
* load the user profile from the IDp api client
|
31 |
-
*/
|
32 |
-
function getUserProfile(){
|
33 |
-
$data = $this->api->api("users/self/" );
|
34 |
-
|
35 |
-
if ( $data->meta->code != 200 ){
|
36 |
-
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
37 |
-
}
|
38 |
-
|
39 |
-
$this->user->profile->identifier = $data->data->id;
|
40 |
-
$this->user->profile->displayName = $data->data->full_name ? $data->data->full_name : $data->data->username;
|
41 |
-
$this->user->profile->description = $data->data->bio;
|
42 |
-
$this->user->profile->photoURL = $data->data->profile_picture;
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
}
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | https://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2012 HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Hybrid_Providers_Instagram (By Sebastian Lasse - https://github.com/sebilasse)
|
10 |
+
*/
|
11 |
+
class Hybrid_Providers_Instagram extends Hybrid_Provider_Model_OAuth2
|
12 |
+
{
|
13 |
+
// default permissions
|
14 |
+
public $scope = "basic";
|
15 |
+
|
16 |
+
/**
|
17 |
+
* IDp wrappers initializer
|
18 |
+
*/
|
19 |
+
function initialize()
|
20 |
+
{
|
21 |
+
parent::initialize();
|
22 |
+
|
23 |
+
// Provider api end-points
|
24 |
+
$this->api->api_base_url = "https://api.instagram.com/v1/";
|
25 |
+
$this->api->authorize_url = "https://api.instagram.com/oauth/authorize/";
|
26 |
+
$this->api->token_url = "https://api.instagram.com/oauth/access_token";
|
27 |
+
}
|
28 |
+
|
29 |
+
/**
|
30 |
+
* load the user profile from the IDp api client
|
31 |
+
*/
|
32 |
+
function getUserProfile(){
|
33 |
+
$data = $this->api->api("users/self/" );
|
34 |
+
|
35 |
+
if ( $data->meta->code != 200 ){
|
36 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
37 |
+
}
|
38 |
+
|
39 |
+
$this->user->profile->identifier = $data->data->id;
|
40 |
+
$this->user->profile->displayName = $data->data->full_name ? $data->data->full_name : $data->data->username;
|
41 |
+
$this->user->profile->description = $data->data->bio;
|
42 |
+
$this->user->profile->photoURL = $data->data->profile_picture;
|
43 |
+
$this->user->profile->profileURL = 'https://instagram.com/' . $data->data->username;
|
44 |
+
|
45 |
+
$this->user->profile->webSiteURL = $data->data->website;
|
46 |
+
|
47 |
+
return $this->user->profile;
|
48 |
+
}
|
49 |
+
}
|
hybridauth/Hybrid/Providers/LastFM.php
CHANGED
@@ -1,111 +1,111 @@
|
|
1 |
-
<?php
|
2 |
-
/*!
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Hybrid_Providers_LastFM class, wrapper for Vimeo
|
10 |
-
*/
|
11 |
-
class Hybrid_Providers_LastFM extends Hybrid_Provider_Model
|
12 |
-
{
|
13 |
-
/**
|
14 |
-
* IDp wrappers initializer
|
15 |
-
*/
|
16 |
-
function initialize()
|
17 |
-
{
|
18 |
-
if ( ! $this->config["keys"]["key"] || ! $this->config["keys"]["secret"] )
|
19 |
-
{
|
20 |
-
throw new Exception( "Your application key and secret are required in order to connect to {$this->providerId}.", 4 );
|
21 |
-
}
|
22 |
-
|
23 |
-
require_once realpath( dirname( __FILE__ ) ) . "/../thirdparty/LastFM/LastFM.php";
|
24 |
-
|
25 |
-
$this->api = new LastFM( array( 'api_key' => $this->config["keys"]["key"], 'api_secret' => $this->config["keys"]["secret"] ) );
|
26 |
-
|
27 |
-
if( $this->token( "access_token" ) )
|
28 |
-
{
|
29 |
-
$this->api->setSessionKey( $this->token( "access_token" ) );
|
30 |
-
}
|
31 |
-
}
|
32 |
-
|
33 |
-
/**
|
34 |
-
* begin login step
|
35 |
-
*/
|
36 |
-
function loginBegin()
|
37 |
-
{
|
38 |
-
# redirect to Authorize url
|
39 |
-
Hybrid_Auth::redirect( $this->api->getLoginUrl( $this->endpoint ) );
|
40 |
-
}
|
41 |
-
|
42 |
-
/**
|
43 |
-
* finish login step
|
44 |
-
*/
|
45 |
-
function loginFinish()
|
46 |
-
{
|
47 |
-
$token = @ $_REQUEST['token'];
|
48 |
-
|
49 |
-
if ( ! $token )
|
50 |
-
{
|
51 |
-
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid Token.", 5 );
|
52 |
-
}
|
53 |
-
|
54 |
-
try{
|
55 |
-
$response = $this->api->fetchSession( $token );
|
56 |
-
}
|
57 |
-
catch( LastFMException $e ){
|
58 |
-
throw new Exception( "Authentication failed! {$this->providerId} returned an error while requesting and access token. $e.", 6 );
|
59 |
-
}
|
60 |
-
|
61 |
-
if( isset( $response['sk'] ) && isset( $response['name'] ) ){
|
62 |
-
$this->token( "access_token" , $response['sk'] );
|
63 |
-
|
64 |
-
// let set the user name as access_token_secret ...
|
65 |
-
$this->token( "user_name" , $response['name'] );
|
66 |
-
|
67 |
-
// set user as logged in
|
68 |
-
$this->setUserConnected();
|
69 |
-
}
|
70 |
-
else{
|
71 |
-
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid access Token.", 5 );
|
72 |
-
}
|
73 |
-
}
|
74 |
-
|
75 |
-
/**
|
76 |
-
* load the user profile from the IDp api client
|
77 |
-
*/
|
78 |
-
function getUserProfile()
|
79 |
-
{
|
80 |
-
try{
|
81 |
-
$response = $this->api->api( "user.getInfo", array( "token" => $this->token( "access_token" ), "user" => $this->token( "user_name" ) ) );
|
82 |
-
}
|
83 |
-
catch( LastFMInvalidSessionException $e ){
|
84 |
-
throw new Exception( "User profile request failed! {$this->providerId} returned an error while requesting the user profile. Invalid session key - Please re-authenticate. $e.", 6 );
|
85 |
-
}
|
86 |
-
catch( LastFMException $e ){
|
87 |
-
throw new Exception( "User profile request failed! {$this->providerId} returned an error while requesting the user profile. $e", 6 );
|
88 |
-
}
|
89 |
-
|
90 |
-
// fetch user profile
|
91 |
-
$this->user->profile->identifier = @ (string) $response["user"]["id"];
|
92 |
-
$this->user->profile->firstName = @ (string) $response["user"]["name"];
|
93 |
-
$this->user->profile->displayName = @ (string) $response["user"]["realname"];
|
94 |
-
$this->user->profile->photoURL = @ (string) $response["user"]["image"][2]["#text"];
|
95 |
-
$this->user->profile->profileURL = @ (string) $response["user"]["url"];
|
96 |
-
|
97 |
-
$this->user->profile->country = @ (string) $response["user"]["country"];
|
98 |
-
$this->user->profile->gender = @ (string) $response["user"]["gender"];
|
99 |
-
$this->user->profile->age = @ (int) $response["user"]["age"];
|
100 |
-
|
101 |
-
if( $this->user->profile->gender == "f" ){
|
102 |
-
$this->user->profile->gender = "female";
|
103 |
-
}
|
104 |
-
|
105 |
-
if( $this->user->profile->gender == "m" ){
|
106 |
-
$this->user->profile->gender = "male";
|
107 |
-
}
|
108 |
-
|
109 |
-
return $this->user->profile;
|
110 |
-
}
|
111 |
-
}
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Hybrid_Providers_LastFM class, wrapper for Vimeo
|
10 |
+
*/
|
11 |
+
class Hybrid_Providers_LastFM extends Hybrid_Provider_Model
|
12 |
+
{
|
13 |
+
/**
|
14 |
+
* IDp wrappers initializer
|
15 |
+
*/
|
16 |
+
function initialize()
|
17 |
+
{
|
18 |
+
if ( ! $this->config["keys"]["key"] || ! $this->config["keys"]["secret"] )
|
19 |
+
{
|
20 |
+
throw new Exception( "Your application key and secret are required in order to connect to {$this->providerId}.", 4 );
|
21 |
+
}
|
22 |
+
|
23 |
+
require_once realpath( dirname( __FILE__ ) ) . "/../thirdparty/LastFM/LastFM.php";
|
24 |
+
|
25 |
+
$this->api = new LastFM( array( 'api_key' => $this->config["keys"]["key"], 'api_secret' => $this->config["keys"]["secret"] ) );
|
26 |
+
|
27 |
+
if( $this->token( "access_token" ) )
|
28 |
+
{
|
29 |
+
$this->api->setSessionKey( $this->token( "access_token" ) );
|
30 |
+
}
|
31 |
+
}
|
32 |
+
|
33 |
+
/**
|
34 |
+
* begin login step
|
35 |
+
*/
|
36 |
+
function loginBegin()
|
37 |
+
{
|
38 |
+
# redirect to Authorize url
|
39 |
+
Hybrid_Auth::redirect( $this->api->getLoginUrl( $this->endpoint ) );
|
40 |
+
}
|
41 |
+
|
42 |
+
/**
|
43 |
+
* finish login step
|
44 |
+
*/
|
45 |
+
function loginFinish()
|
46 |
+
{
|
47 |
+
$token = @ $_REQUEST['token'];
|
48 |
+
|
49 |
+
if ( ! $token )
|
50 |
+
{
|
51 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid Token.", 5 );
|
52 |
+
}
|
53 |
+
|
54 |
+
try{
|
55 |
+
$response = $this->api->fetchSession( $token );
|
56 |
+
}
|
57 |
+
catch( LastFMException $e ){
|
58 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an error while requesting and access token. $e.", 6 );
|
59 |
+
}
|
60 |
+
|
61 |
+
if( isset( $response['sk'] ) && isset( $response['name'] ) ){
|
62 |
+
$this->token( "access_token" , $response['sk'] );
|
63 |
+
|
64 |
+
// let set the user name as access_token_secret ...
|
65 |
+
$this->token( "user_name" , $response['name'] );
|
66 |
+
|
67 |
+
// set user as logged in
|
68 |
+
$this->setUserConnected();
|
69 |
+
}
|
70 |
+
else{
|
71 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid access Token.", 5 );
|
72 |
+
}
|
73 |
+
}
|
74 |
+
|
75 |
+
/**
|
76 |
+
* load the user profile from the IDp api client
|
77 |
+
*/
|
78 |
+
function getUserProfile()
|
79 |
+
{
|
80 |
+
try{
|
81 |
+
$response = $this->api->api( "user.getInfo", array( "token" => $this->token( "access_token" ), "user" => $this->token( "user_name" ) ) );
|
82 |
+
}
|
83 |
+
catch( LastFMInvalidSessionException $e ){
|
84 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an error while requesting the user profile. Invalid session key - Please re-authenticate. $e.", 6 );
|
85 |
+
}
|
86 |
+
catch( LastFMException $e ){
|
87 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an error while requesting the user profile. $e", 6 );
|
88 |
+
}
|
89 |
+
|
90 |
+
// fetch user profile
|
91 |
+
$this->user->profile->identifier = @ (string) $response["user"]["id"];
|
92 |
+
$this->user->profile->firstName = @ (string) $response["user"]["name"];
|
93 |
+
$this->user->profile->displayName = @ (string) $response["user"]["realname"];
|
94 |
+
$this->user->profile->photoURL = @ (string) $response["user"]["image"][2]["#text"];
|
95 |
+
$this->user->profile->profileURL = @ (string) $response["user"]["url"];
|
96 |
+
|
97 |
+
$this->user->profile->country = @ (string) $response["user"]["country"];
|
98 |
+
$this->user->profile->gender = @ (string) $response["user"]["gender"];
|
99 |
+
$this->user->profile->age = @ (int) $response["user"]["age"];
|
100 |
+
|
101 |
+
if( $this->user->profile->gender == "f" ){
|
102 |
+
$this->user->profile->gender = "female";
|
103 |
+
}
|
104 |
+
|
105 |
+
if( $this->user->profile->gender == "m" ){
|
106 |
+
$this->user->profile->gender = "male";
|
107 |
+
}
|
108 |
+
|
109 |
+
return $this->user->profile;
|
110 |
+
}
|
111 |
+
}
|
hybridauth/Hybrid/Providers/Latch.php
CHANGED
@@ -1,30 +1,30 @@
|
|
1 |
-
<?php
|
2 |
-
/*!
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2013, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Hybrid_Providers_Latch provider adapter based on OpenID protocol
|
10 |
-
*
|
11 |
-
* http://hybridauth.sourceforge.net/userguide/IDProvider_info_Latch.html
|
12 |
-
*/
|
13 |
-
class Hybrid_Providers_Latch extends Hybrid_Provider_Model_OpenID
|
14 |
-
{
|
15 |
-
var $openidIdentifier = "http://auth.latch-app.com/OpenIdServer/user.jsp";
|
16 |
-
|
17 |
-
/**
|
18 |
-
* finish login step
|
19 |
-
*/
|
20 |
-
function loginFinish()
|
21 |
-
{
|
22 |
-
parent::loginFinish();
|
23 |
-
|
24 |
-
$this->user->profile->identifier = $this->user->profile->email;
|
25 |
-
$this->user->profile->emailVerified = $this->user->profile->email;
|
26 |
-
|
27 |
-
// restore the user profile
|
28 |
-
Hybrid_Auth::storage()->set( "hauth_session.{$this->providerId}.user", $this->user );
|
29 |
-
}
|
30 |
-
}
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2013, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Hybrid_Providers_Latch provider adapter based on OpenID protocol
|
10 |
+
*
|
11 |
+
* http://hybridauth.sourceforge.net/userguide/IDProvider_info_Latch.html
|
12 |
+
*/
|
13 |
+
class Hybrid_Providers_Latch extends Hybrid_Provider_Model_OpenID
|
14 |
+
{
|
15 |
+
var $openidIdentifier = "http://auth.latch-app.com/OpenIdServer/user.jsp";
|
16 |
+
|
17 |
+
/**
|
18 |
+
* finish login step
|
19 |
+
*/
|
20 |
+
function loginFinish()
|
21 |
+
{
|
22 |
+
parent::loginFinish();
|
23 |
+
|
24 |
+
$this->user->profile->identifier = $this->user->profile->email;
|
25 |
+
$this->user->profile->emailVerified = $this->user->profile->email;
|
26 |
+
|
27 |
+
// restore the user profile
|
28 |
+
Hybrid_Auth::storage()->set( "hauth_session.{$this->providerId}.user", $this->user );
|
29 |
+
}
|
30 |
+
}
|
hybridauth/Hybrid/Providers/LinkedIn.php
CHANGED
@@ -1,269 +1,269 @@
|
|
1 |
-
<?php
|
2 |
-
/*!
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Hybrid_Providers_LinkedIn provider adapter based on OAuth1 protocol
|
10 |
-
*
|
11 |
-
* Hybrid_Providers_LinkedIn use linkedinPHP library created by fiftyMission Inc.
|
12 |
-
*
|
13 |
-
* http://hybridauth.sourceforge.net/userguide/IDProvider_info_LinkedIn.html
|
14 |
-
*/
|
15 |
-
class Hybrid_Providers_LinkedIn extends Hybrid_Provider_Model
|
16 |
-
{
|
17 |
-
/**
|
18 |
-
* IDp wrappers initializer
|
19 |
-
*/
|
20 |
-
function initialize()
|
21 |
-
{
|
22 |
-
if ( ! $this->config["keys"]["key"] || ! $this->config["keys"]["secret"] ){
|
23 |
-
throw new Exception( "Your application key and secret are required in order to connect to {$this->providerId}.", 4 );
|
24 |
-
}
|
25 |
-
|
26 |
-
if ( ! class_exists( 'OAuthConsumer', false ) ) {
|
27 |
-
require_once realpath( dirname( __FILE__ ) ) . "/../thirdparty/OAuth/OAuth.php";
|
28 |
-
}
|
29 |
-
|
30 |
-
require_once realpath( dirname( __FILE__ ) ) . "/../thirdparty/LinkedIn/LinkedIn.php";
|
31 |
-
|
32 |
-
$this->api = new LinkedIn( array( 'appKey' => $this->config["keys"]["key"], 'appSecret' => $this->config["keys"]["secret"], 'callbackUrl' => $this->endpoint ) );
|
33 |
-
|
34 |
-
if( $this->token( "access_token_linkedin" ) ){
|
35 |
-
$this->api->setTokenAccess( $this->token( "access_token_linkedin" ) );
|
36 |
-
}
|
37 |
-
}
|
38 |
-
|
39 |
-
/**
|
40 |
-
* begin login step
|
41 |
-
*/
|
42 |
-
function loginBegin()
|
43 |
-
{
|
44 |
-
// send a request for a LinkedIn access token
|
45 |
-
$response = $this->api->retrieveTokenRequest();
|
46 |
-
|
47 |
-
if( isset( $response['success'] ) && $response['success'] === TRUE ){
|
48 |
-
$this->token( "oauth_token", $response['linkedin']['oauth_token'] );
|
49 |
-
$this->token( "oauth_token_secret", $response['linkedin']['oauth_token_secret'] );
|
50 |
-
|
51 |
-
# redirect user to LinkedIn authorisation web page
|
52 |
-
Hybrid_Auth::redirect( LINKEDIN::_URL_AUTH . $response['linkedin']['oauth_token'] );
|
53 |
-
}
|
54 |
-
else{
|
55 |
-
if( isset( $response['linkedin']['oauth_problem'] ) ){
|
56 |
-
if( $response['linkedin']['oauth_problem'] == 'timestamp_refused' ){
|
57 |
-
throw new Exception( "Authentication failed! Your server time is not in sync with the {$this->providerId} servers. Acceptable timestamps: " . date("D, d M Y G:i:s", (int) $response['linkedin']['oauth_acceptable_timestamps'] ), 5 );
|
58 |
-
}
|
59 |
-
|
60 |
-
throw new Exception( "Authentication failed! {$this->providerId} returned an oauth_problem.", 5 );
|
61 |
-
}
|
62 |
-
|
63 |
-
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid oauth_token", 5 );
|
64 |
-
}
|
65 |
-
}
|
66 |
-
|
67 |
-
/**
|
68 |
-
* finish login step
|
69 |
-
*/
|
70 |
-
function loginFinish()
|
71 |
-
{
|
72 |
-
$oauth_token = $_REQUEST['oauth_token'];
|
73 |
-
$oauth_verifier = $_REQUEST['oauth_verifier'];
|
74 |
-
|
75 |
-
if ( ! $oauth_verifier ){
|
76 |
-
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid oauth_verifier", 5 );
|
77 |
-
}
|
78 |
-
|
79 |
-
$response = $this->api->retrieveTokenAccess( $oauth_token, $this->token( "oauth_token_secret" ), $oauth_verifier );
|
80 |
-
|
81 |
-
if( isset( $response['success'] ) && $response['success'] === TRUE ){
|
82 |
-
$this->deleteToken( "oauth_token" );
|
83 |
-
$this->deleteToken( "oauth_token_secret" );
|
84 |
-
|
85 |
-
$this->token( "access_token_linkedin", $response['linkedin'] );
|
86 |
-
$this->token( "access_token" , $response['linkedin']['oauth_token'] );
|
87 |
-
$this->token( "access_token_secret" , $response['linkedin']['oauth_token_secret'] );
|
88 |
-
|
89 |
-
// set user as logged in
|
90 |
-
$this->setUserConnected();
|
91 |
-
}
|
92 |
-
else{
|
93 |
-
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid access_token", 5 );
|
94 |
-
}
|
95 |
-
}
|
96 |
-
|
97 |
-
/**
|
98 |
-
* load the user profile from the IDp api client
|
99 |
-
*/
|
100 |
-
function getUserProfile()
|
101 |
-
{
|
102 |
-
try{
|
103 |
-
// http://developer.linkedin.com/docs/DOC-1061
|
104 |
-
$response = $this->api->profile('~:(id,first-name,last-name,public-profile-url,picture-url,picture-urls::(original),email-address,date-of-birth,phone-numbers,headline)');
|
105 |
-
}
|
106 |
-
catch( LinkedInException $e ){
|
107 |
-
throw new Exception( "User profile request failed! {$this->providerId} returned an error: $e", 6 );
|
108 |
-
}
|
109 |
-
|
110 |
-
if( isset( $response['success'] ) && $response['success'] === TRUE ){
|
111 |
-
$data = @ new SimpleXMLElement( $response['linkedin'] );
|
112 |
-
|
113 |
-
if ( ! is_object( $data ) ){
|
114 |
-
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid data.", 6 );
|
115 |
-
}
|
116 |
-
|
117 |
-
$this->user->profile->identifier = (string) $data->{'id'};
|
118 |
-
$this->user->profile->firstName = (string) $data->{'first-name'};
|
119 |
-
$this->user->profile->lastName = (string) $data->{'last-name'};
|
120 |
-
$this->user->profile->displayName = trim( $this->user->profile->firstName . " " . $this->user->profile->lastName );
|
121 |
-
|
122 |
-
$this->user->profile->email = (string) $data->{'email-address'};
|
123 |
-
$this->user->profile->emailVerified = (string) $data->{'email-address'};
|
124 |
-
|
125 |
-
$this->user->profile->photoURL = (string) $data->{'picture-url'};
|
126 |
-
$this->user->profile->profileURL = (string) $data->{'public-profile-url'};
|
127 |
-
$this->user->profile->description = (string) $data->{'headline'};
|
128 |
-
|
129 |
-
if( $data->{'phone-numbers'} && $data->{'phone-numbers'}->{'phone-number'} ){
|
130 |
-
$this->user->profile->phone = (string) $data->{'phone-numbers'}->{'phone-number'}->{'phone-number'};
|
131 |
-
}
|
132 |
-
else{
|
133 |
-
$this->user->profile->phone = null;
|
134 |
-
}
|
135 |
-
|
136 |
-
if( $data->{'date-of-birth'} ){
|
137 |
-
$this->user->profile->birthDay = (string) $data->{'date-of-birth'}->day;
|
138 |
-
$this->user->profile->birthMonth = (string) $data->{'date-of-birth'}->month;
|
139 |
-
$this->user->profile->birthYear = (string) $data->{'date-of-birth'}->year;
|
140 |
-
}
|
141 |
-
|
142 |
-
if( (string) $data->{'picture-urls'}->{'picture-url'} ){
|
143 |
-
$this->user->profile->photoURL = (string) $data->{'picture-urls'}->{'picture-url'};
|
144 |
-
}
|
145 |
-
|
146 |
-
return $this->user->profile;
|
147 |
-
}
|
148 |
-
else{
|
149 |
-
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
150 |
-
}
|
151 |
-
}
|
152 |
-
|
153 |
-
/**
|
154 |
-
* load the user contacts
|
155 |
-
*/
|
156 |
-
function getUserContacts()
|
157 |
-
{
|
158 |
-
try{
|
159 |
-
$response = $this->api->profile('~/connections:(id,first-name,last-name,picture-url,public-profile-url,summary)');
|
160 |
-
}
|
161 |
-
catch( LinkedInException $e ){
|
162 |
-
throw new Exception( "User contacts request failed! {$this->providerId} returned an error: $e" );
|
163 |
-
}
|
164 |
-
|
165 |
-
if( ! $response || ! $response['success'] ){
|
166 |
-
return ARRAY();
|
167 |
-
}
|
168 |
-
|
169 |
-
$connections = new SimpleXMLElement( $response['linkedin'] );
|
170 |
-
|
171 |
-
$contacts = ARRAY();
|
172 |
-
|
173 |
-
foreach( $connections->person as $connection ) {
|
174 |
-
$uc = new Hybrid_User_Contact();
|
175 |
-
|
176 |
-
$uc->identifier = (string) $connection->id;
|
177 |
-
$uc->displayName = (string) $connection->{'last-name'} . " " . $connection->{'first-name'};
|
178 |
-
$uc->profileURL = (string) $connection->{'public-profile-url'};
|
179 |
-
$uc->photoURL = (string) $connection->{'picture-url'};
|
180 |
-
$uc->description = (string) $connection->{'summary'};
|
181 |
-
|
182 |
-
$contacts[] = $uc;
|
183 |
-
}
|
184 |
-
|
185 |
-
return $contacts;
|
186 |
-
}
|
187 |
-
|
188 |
-
/**
|
189 |
-
* update user status
|
190 |
-
*/
|
191 |
-
function setUserStatus( $status )
|
192 |
-
{
|
193 |
-
$parameters = array();
|
194 |
-
$private = true; // share with your connections only
|
195 |
-
|
196 |
-
if( is_array( $status ) ){
|
197 |
-
if( isset( $status[0] ) && ! empty( $status[0] ) ) $parameters["title"] = $status[0]; // post title
|
198 |
-
if( isset( $status[1] ) && ! empty( $status[1] ) ) $parameters["comment"] = $status[1]; // post comment
|
199 |
-
if( isset( $status[2] ) && ! empty( $status[2] ) ) $parameters["submitted-url"] = $status[2]; // post url
|
200 |
-
if( isset( $status[3] ) && ! empty( $status[3] ) ) $parameters["submitted-image-url"] = $status[3]; // post picture url
|
201 |
-
if( isset( $status[4] ) && ! empty( $status[4] ) ) $private = $status[4]; // true or false
|
202 |
-
}
|
203 |
-
else{
|
204 |
-
$parameters["comment"] = $status;
|
205 |
-
}
|
206 |
-
|
207 |
-
try{
|
208 |
-
$response = $this->api->share( 'new', $parameters, $private );
|
209 |
-
}
|
210 |
-
catch( LinkedInException $e ){
|
211 |
-
throw new Exception( "Update user status update failed! {$this->providerId} returned an error: $e" );
|
212 |
-
}
|
213 |
-
|
214 |
-
if ( ! $response || ! $response['success'] )
|
215 |
-
{
|
216 |
-
throw new Exception( "Update user status update failed! {$this->providerId} returned an error." );
|
217 |
-
}
|
218 |
-
|
219 |
-
return $response;
|
220 |
-
}
|
221 |
-
|
222 |
-
/**
|
223 |
-
* load the user latest activity
|
224 |
-
* - timeline : all the stream
|
225 |
-
* - me : the user activity only
|
226 |
-
*/
|
227 |
-
function getUserActivity( $stream )
|
228 |
-
{
|
229 |
-
try{
|
230 |
-
if( $stream == "me" ){
|
231 |
-
$response = $this->api->updates( '?type=SHAR&scope=self&count=25' );
|
232 |
-
}
|
233 |
-
else{
|
234 |
-
$response = $this->api->updates( '?type=SHAR&count=25' );
|
235 |
-
}
|
236 |
-
}
|
237 |
-
catch( LinkedInException $e ){
|
238 |
-
throw new Exception( "User activity stream request failed! {$this->providerId} returned an error: $e" );
|
239 |
-
}
|
240 |
-
|
241 |
-
if( ! $response || ! $response['success'] ){
|
242 |
-
return ARRAY();
|
243 |
-
}
|
244 |
-
|
245 |
-
$updates = new SimpleXMLElement( $response['linkedin'] );
|
246 |
-
|
247 |
-
$activities = ARRAY();
|
248 |
-
|
249 |
-
foreach( $updates->update as $update ) {
|
250 |
-
$person = $update->{'update-content'}->person;
|
251 |
-
$share = $update->{'update-content'}->person->{'current-share'};
|
252 |
-
|
253 |
-
$ua = new Hybrid_User_Activity();
|
254 |
-
|
255 |
-
$ua->id = (string) $update->id;
|
256 |
-
$ua->date = (string) $update->timestamp;
|
257 |
-
$ua->text = (string) $share->{'comment'};
|
258 |
-
|
259 |
-
$ua->user->identifier = (string) $person->id;
|
260 |
-
$ua->user->displayName = (string) $person->{'first-name'} . ' ' . $person->{'last-name'};
|
261 |
-
$ua->user->profileURL = (string) $person->{'site-standard-profile-request'}->url;
|
262 |
-
$ua->user->photoURL = NULL;
|
263 |
-
|
264 |
-
$activities[] = $ua;
|
265 |
-
}
|
266 |
-
|
267 |
-
return $activities;
|
268 |
-
}
|
269 |
-
}
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Hybrid_Providers_LinkedIn provider adapter based on OAuth1 protocol
|
10 |
+
*
|
11 |
+
* Hybrid_Providers_LinkedIn use linkedinPHP library created by fiftyMission Inc.
|
12 |
+
*
|
13 |
+
* http://hybridauth.sourceforge.net/userguide/IDProvider_info_LinkedIn.html
|
14 |
+
*/
|
15 |
+
class Hybrid_Providers_LinkedIn extends Hybrid_Provider_Model
|
16 |
+
{
|
17 |
+
/**
|
18 |
+
* IDp wrappers initializer
|
19 |
+
*/
|
20 |
+
function initialize()
|
21 |
+
{
|
22 |
+
if ( ! $this->config["keys"]["key"] || ! $this->config["keys"]["secret"] ){
|
23 |
+
throw new Exception( "Your application key and secret are required in order to connect to {$this->providerId}.", 4 );
|
24 |
+
}
|
25 |
+
|
26 |
+
if ( ! class_exists( 'OAuthConsumer', false ) ) {
|
27 |
+
require_once realpath( dirname( __FILE__ ) ) . "/../thirdparty/OAuth/OAuth.php";
|
28 |
+
}
|
29 |
+
|
30 |
+
require_once realpath( dirname( __FILE__ ) ) . "/../thirdparty/LinkedIn/LinkedIn.php";
|
31 |
+
|
32 |
+
$this->api = new LinkedIn( array( 'appKey' => $this->config["keys"]["key"], 'appSecret' => $this->config["keys"]["secret"], 'callbackUrl' => $this->endpoint ) );
|
33 |
+
|
34 |
+
if( $this->token( "access_token_linkedin" ) ){
|
35 |
+
$this->api->setTokenAccess( $this->token( "access_token_linkedin" ) );
|
36 |
+
}
|
37 |
+
}
|
38 |
+
|
39 |
+
/**
|
40 |
+
* begin login step
|
41 |
+
*/
|
42 |
+
function loginBegin()
|
43 |
+
{
|
44 |
+
// send a request for a LinkedIn access token
|
45 |
+
$response = $this->api->retrieveTokenRequest();
|
46 |
+
|
47 |
+
if( isset( $response['success'] ) && $response['success'] === TRUE ){
|
48 |
+
$this->token( "oauth_token", $response['linkedin']['oauth_token'] );
|
49 |
+
$this->token( "oauth_token_secret", $response['linkedin']['oauth_token_secret'] );
|
50 |
+
|
51 |
+
# redirect user to LinkedIn authorisation web page
|
52 |
+
Hybrid_Auth::redirect( LINKEDIN::_URL_AUTH . $response['linkedin']['oauth_token'] );
|
53 |
+
}
|
54 |
+
else{
|
55 |
+
if( isset( $response['linkedin']['oauth_problem'] ) ){
|
56 |
+
if( $response['linkedin']['oauth_problem'] == 'timestamp_refused' ){
|
57 |
+
throw new Exception( "Authentication failed! Your server time is not in sync with the {$this->providerId} servers. Acceptable timestamps: " . date("D, d M Y G:i:s", (int) $response['linkedin']['oauth_acceptable_timestamps'] ), 5 );
|
58 |
+
}
|
59 |
+
|
60 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an oauth_problem.", 5 );
|
61 |
+
}
|
62 |
+
|
63 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid oauth_token", 5 );
|
64 |
+
}
|
65 |
+
}
|
66 |
+
|
67 |
+
/**
|
68 |
+
* finish login step
|
69 |
+
*/
|
70 |
+
function loginFinish()
|
71 |
+
{
|
72 |
+
$oauth_token = $_REQUEST['oauth_token'];
|
73 |
+
$oauth_verifier = $_REQUEST['oauth_verifier'];
|
74 |
+
|
75 |
+
if ( ! $oauth_verifier ){
|
76 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid oauth_verifier", 5 );
|
77 |
+
}
|
78 |
+
|
79 |
+
$response = $this->api->retrieveTokenAccess( $oauth_token, $this->token( "oauth_token_secret" ), $oauth_verifier );
|
80 |
+
|
81 |
+
if( isset( $response['success'] ) && $response['success'] === TRUE ){
|
82 |
+
$this->deleteToken( "oauth_token" );
|
83 |
+
$this->deleteToken( "oauth_token_secret" );
|
84 |
+
|
85 |
+
$this->token( "access_token_linkedin", $response['linkedin'] );
|
86 |
+
$this->token( "access_token" , $response['linkedin']['oauth_token'] );
|
87 |
+
$this->token( "access_token_secret" , $response['linkedin']['oauth_token_secret'] );
|
88 |
+
|
89 |
+
// set user as logged in
|
90 |
+
$this->setUserConnected();
|
91 |
+
}
|
92 |
+
else{
|
93 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid access_token", 5 );
|
94 |
+
}
|
95 |
+
}
|
96 |
+
|
97 |
+
/**
|
98 |
+
* load the user profile from the IDp api client
|
99 |
+
*/
|
100 |
+
function getUserProfile()
|
101 |
+
{
|
102 |
+
try{
|
103 |
+
// http://developer.linkedin.com/docs/DOC-1061
|
104 |
+
$response = $this->api->profile('~:(id,first-name,last-name,public-profile-url,picture-url,picture-urls::(original),email-address,date-of-birth,phone-numbers,headline)');
|
105 |
+
}
|
106 |
+
catch( LinkedInException $e ){
|
107 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an error: $e", 6 );
|
108 |
+
}
|
109 |
+
|
110 |
+
if( isset( $response['success'] ) && $response['success'] === TRUE ){
|
111 |
+
$data = @ new SimpleXMLElement( $response['linkedin'] );
|
112 |
+
|
113 |
+
if ( ! is_object( $data ) ){
|
114 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid data.", 6 );
|
115 |
+
}
|
116 |
+
|
117 |
+
$this->user->profile->identifier = (string) $data->{'id'};
|
118 |
+
$this->user->profile->firstName = (string) $data->{'first-name'};
|
119 |
+
$this->user->profile->lastName = (string) $data->{'last-name'};
|
120 |
+
$this->user->profile->displayName = trim( $this->user->profile->firstName . " " . $this->user->profile->lastName );
|
121 |
+
|
122 |
+
$this->user->profile->email = (string) $data->{'email-address'};
|
123 |
+
$this->user->profile->emailVerified = (string) $data->{'email-address'};
|
124 |
+
|
125 |
+
$this->user->profile->photoURL = (string) $data->{'picture-url'};
|
126 |
+
$this->user->profile->profileURL = (string) $data->{'public-profile-url'};
|
127 |
+
$this->user->profile->description = (string) $data->{'headline'};
|
128 |
+
|
129 |
+
if( $data->{'phone-numbers'} && $data->{'phone-numbers'}->{'phone-number'} ){
|
130 |
+
$this->user->profile->phone = (string) $data->{'phone-numbers'}->{'phone-number'}->{'phone-number'};
|
131 |
+
}
|
132 |
+
else{
|
133 |
+
$this->user->profile->phone = null;
|
134 |
+
}
|
135 |
+
|
136 |
+
if( $data->{'date-of-birth'} ){
|
137 |
+
$this->user->profile->birthDay = (string) $data->{'date-of-birth'}->day;
|
138 |
+
$this->user->profile->birthMonth = (string) $data->{'date-of-birth'}->month;
|
139 |
+
$this->user->profile->birthYear = (string) $data->{'date-of-birth'}->year;
|
140 |
+
}
|
141 |
+
|
142 |
+
if( (string) $data->{'picture-urls'}->{'picture-url'} ){
|
143 |
+
$this->user->profile->photoURL = (string) $data->{'picture-urls'}->{'picture-url'};
|
144 |
+
}
|
145 |
+
|
146 |
+
return $this->user->profile;
|
147 |
+
}
|
148 |
+
else{
|
149 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
150 |
+
}
|
151 |
+
}
|
152 |
+
|
153 |
+
/**
|
154 |
+
* load the user contacts
|
155 |
+
*/
|
156 |
+
function getUserContacts()
|
157 |
+
{
|
158 |
+
try{
|
159 |
+
$response = $this->api->profile('~/connections:(id,first-name,last-name,picture-url,public-profile-url,summary)');
|
160 |
+
}
|
161 |
+
catch( LinkedInException $e ){
|
162 |
+
throw new Exception( "User contacts request failed! {$this->providerId} returned an error: $e" );
|
163 |
+
}
|
164 |
+
|
165 |
+
if( ! $response || ! $response['success'] ){
|
166 |
+
return ARRAY();
|
167 |
+
}
|
168 |
+
|
169 |
+
$connections = new SimpleXMLElement( $response['linkedin'] );
|
170 |
+
|
171 |
+
$contacts = ARRAY();
|
172 |
+
|
173 |
+
foreach( $connections->person as $connection ) {
|
174 |
+
$uc = new Hybrid_User_Contact();
|
175 |
+
|
176 |
+
$uc->identifier = (string) $connection->id;
|
177 |
+
$uc->displayName = (string) $connection->{'last-name'} . " " . $connection->{'first-name'};
|
178 |
+
$uc->profileURL = (string) $connection->{'public-profile-url'};
|
179 |
+
$uc->photoURL = (string) $connection->{'picture-url'};
|
180 |
+
$uc->description = (string) $connection->{'summary'};
|
181 |
+
|
182 |
+
$contacts[] = $uc;
|
183 |
+
}
|
184 |
+
|
185 |
+
return $contacts;
|
186 |
+
}
|
187 |
+
|
188 |
+
/**
|
189 |
+
* update user status
|
190 |
+
*/
|
191 |
+
function setUserStatus( $status )
|
192 |
+
{
|
193 |
+
$parameters = array();
|
194 |
+
$private = true; // share with your connections only
|
195 |
+
|
196 |
+
if( is_array( $status ) ){
|
197 |
+
if( isset( $status[0] ) && ! empty( $status[0] ) ) $parameters["title"] = $status[0]; // post title
|
198 |
+
if( isset( $status[1] ) && ! empty( $status[1] ) ) $parameters["comment"] = $status[1]; // post comment
|
199 |
+
if( isset( $status[2] ) && ! empty( $status[2] ) ) $parameters["submitted-url"] = $status[2]; // post url
|
200 |
+
if( isset( $status[3] ) && ! empty( $status[3] ) ) $parameters["submitted-image-url"] = $status[3]; // post picture url
|
201 |
+
if( isset( $status[4] ) && ! empty( $status[4] ) ) $private = $status[4]; // true or false
|
202 |
+
}
|
203 |
+
else{
|
204 |
+
$parameters["comment"] = $status;
|
205 |
+
}
|
206 |
+
|
207 |
+
try{
|
208 |
+
$response = $this->api->share( 'new', $parameters, $private );
|
209 |
+
}
|
210 |
+
catch( LinkedInException $e ){
|
211 |
+
throw new Exception( "Update user status update failed! {$this->providerId} returned an error: $e" );
|
212 |
+
}
|
213 |
+
|
214 |
+
if ( ! $response || ! $response['success'] )
|
215 |
+
{
|
216 |
+
throw new Exception( "Update user status update failed! {$this->providerId} returned an error." );
|
217 |
+
}
|
218 |
+
|
219 |
+
return $response;
|
220 |
+
}
|
221 |
+
|
222 |
+
/**
|
223 |
+
* load the user latest activity
|
224 |
+
* - timeline : all the stream
|
225 |
+
* - me : the user activity only
|
226 |
+
*/
|
227 |
+
function getUserActivity( $stream )
|
228 |
+
{
|
229 |
+
try{
|
230 |
+
if( $stream == "me" ){
|
231 |
+
$response = $this->api->updates( '?type=SHAR&scope=self&count=25' );
|
232 |
+
}
|
233 |
+
else{
|
234 |
+
$response = $this->api->updates( '?type=SHAR&count=25' );
|
235 |
+
}
|
236 |
+
}
|
237 |
+
catch( LinkedInException $e ){
|
238 |
+
throw new Exception( "User activity stream request failed! {$this->providerId} returned an error: $e" );
|
239 |
+
}
|
240 |
+
|
241 |
+
if( ! $response || ! $response['success'] ){
|
242 |
+
return ARRAY();
|
243 |
+
}
|
244 |
+
|
245 |
+
$updates = new SimpleXMLElement( $response['linkedin'] );
|
246 |
+
|
247 |
+
$activities = ARRAY();
|
248 |
+
|
249 |
+
foreach( $updates->update as $update ) {
|
250 |
+
$person = $update->{'update-content'}->person;
|
251 |
+
$share = $update->{'update-content'}->person->{'current-share'};
|
252 |
+
|
253 |
+
$ua = new Hybrid_User_Activity();
|
254 |
+
|
255 |
+
$ua->id = (string) $update->id;
|
256 |
+
$ua->date = (string) $update->timestamp;
|
257 |
+
$ua->text = (string) $share->{'comment'};
|
258 |
+
|
259 |
+
$ua->user->identifier = (string) $person->id;
|
260 |
+
$ua->user->displayName = (string) $person->{'first-name'} . ' ' . $person->{'last-name'};
|
261 |
+
$ua->user->profileURL = (string) $person->{'site-standard-profile-request'}->url;
|
262 |
+
$ua->user->photoURL = NULL;
|
263 |
+
|
264 |
+
$activities[] = $ua;
|
265 |
+
}
|
266 |
+
|
267 |
+
return $activities;
|
268 |
+
}
|
269 |
+
}
|
hybridauth/Hybrid/Providers/Live.php
CHANGED
@@ -1,108 +1,108 @@
|
|
1 |
-
<?php
|
2 |
-
/*!
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Windows Live OAuth2 Class
|
10 |
-
*
|
11 |
-
* @package HybridAuth providers package
|
12 |
-
* @author Lukasz Koprowski <azram19@gmail.com>
|
13 |
-
* @version 0.2
|
14 |
-
* @license BSD License
|
15 |
-
*/
|
16 |
-
|
17 |
-
/**
|
18 |
-
* Hybrid_Providers_Live - Windows Live provider adapter based on OAuth2 protocol
|
19 |
-
*/
|
20 |
-
class Hybrid_Providers_Live extends Hybrid_Provider_Model_OAuth2
|
21 |
-
{
|
22 |
-
// default permissions
|
23 |
-
public $scope = "wl.basic wl.emails wl.signin wl.share wl.birthday";
|
24 |
-
|
25 |
-
|
26 |
-
/**
|
27 |
-
* IDp wrappers initializer
|
28 |
-
*/
|
29 |
-
function initialize()
|
30 |
-
{
|
31 |
-
parent::initialize();
|
32 |
-
|
33 |
-
// Provider api end-points
|
34 |
-
$this->api->api_base_url = 'https://apis.live.net/v5.0/';
|
35 |
-
$this->api->authorize_url = 'https://login.live.com/oauth20_authorize.srf';
|
36 |
-
$this->api->token_url = 'https://login.live.com/oauth20_token.srf';
|
37 |
-
|
38 |
-
$this->api->curl_authenticate_method = "GET";
|
39 |
-
}
|
40 |
-
|
41 |
-
// --------------------------------------------------------------------
|
42 |
-
|
43 |
-
/**
|
44 |
-
* grab the user profile from the api client
|
45 |
-
*/
|
46 |
-
function getUserProfile()
|
47 |
-
{
|
48 |
-
$data = $this->api->get( "me" );
|
49 |
-
|
50 |
-
if ( ! isset( $data->id ) ){
|
51 |
-
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
52 |
-
}
|
53 |
-
|
54 |
-
$this->user->profile->identifier = (property_exists($data,'id'))?$data->id:"";
|
55 |
-
$this->user->profile->firstName = (property_exists($data,'first_name'))?$data->first_name:"";
|
56 |
-
$this->user->profile->lastName = (property_exists($data,'last_name'))?$data->last_name:"";
|
57 |
-
$this->user->profile->displayName = (property_exists($data,'name'))?trim( $data->name ):"";
|
58 |
-
$this->user->profile->gender = (property_exists($data,'gender'))?$data->gender:"";
|
59 |
-
|
60 |
-
//wl.basic
|
61 |
-
$this->user->profile->profileURL = (property_exists($data,'link'))?$data->link:"";
|
62 |
-
|
63 |
-
//wl.emails
|
64 |
-
$this->user->profile->email = (property_exists($data,'emails'))?$data->emails->account:"";
|
65 |
-
$this->user->profile->emailVerified = (property_exists($data,'emails'))?$data->emails->account:"";
|
66 |
-
|
67 |
-
//wl.birthday
|
68 |
-
$this->user->profile->birthDay = (property_exists($data,'birth_day'))?$data->birth_day:"";
|
69 |
-
$this->user->profile->birthMonth = (property_exists($data,'birth_month'))?$data->birth_month:"";
|
70 |
-
$this->user->profile->birthYear = (property_exists($data,'birth_year'))?$data->birth_year:"";
|
71 |
-
|
72 |
-
return $this->user->profile;
|
73 |
-
}
|
74 |
-
|
75 |
-
|
76 |
-
/**
|
77 |
-
* load the current logged in user contacts list from the IDp api client
|
78 |
-
*/
|
79 |
-
|
80 |
-
/* Windows Live api does not support retrieval of email addresses (only hashes :/) */
|
81 |
-
function getUserContacts()
|
82 |
-
{
|
83 |
-
$response = $this->api->get( 'me/contacts' );
|
84 |
-
|
85 |
-
if ( $this->api->http_code != 200 )
|
86 |
-
{
|
87 |
-
throw new Exception( 'User contacts request failed! ' . $this->providerId . ' returned an error: ' . $this->errorMessageByStatus( $this->api->http_code ) );
|
88 |
-
}
|
89 |
-
|
90 |
-
if ( !isset($response->data) || ( isset($response->errcode) && $response->errcode != 0 ) )
|
91 |
-
{
|
92 |
-
return array();
|
93 |
-
}
|
94 |
-
|
95 |
-
$contacts = array();
|
96 |
-
|
97 |
-
foreach( $response->data as $item ) {
|
98 |
-
$uc = new Hybrid_User_Contact();
|
99 |
-
|
100 |
-
$uc->identifier = (property_exists($item,'id'))?$item->id:"";
|
101 |
-
$uc->displayName = (property_exists($item,'name'))?$item->name:"";
|
102 |
-
|
103 |
-
$contacts[] = $uc;
|
104 |
-
}
|
105 |
-
|
106 |
-
return $contacts;
|
107 |
-
}
|
108 |
-
}
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Windows Live OAuth2 Class
|
10 |
+
*
|
11 |
+
* @package HybridAuth providers package
|
12 |
+
* @author Lukasz Koprowski <azram19@gmail.com>
|
13 |
+
* @version 0.2
|
14 |
+
* @license BSD License
|
15 |
+
*/
|
16 |
+
|
17 |
+
/**
|
18 |
+
* Hybrid_Providers_Live - Windows Live provider adapter based on OAuth2 protocol
|
19 |
+
*/
|
20 |
+
class Hybrid_Providers_Live extends Hybrid_Provider_Model_OAuth2
|
21 |
+
{
|
22 |
+
// default permissions
|
23 |
+
public $scope = "wl.basic wl.emails wl.signin wl.share wl.birthday";
|
24 |
+
|
25 |
+
|
26 |
+
/**
|
27 |
+
* IDp wrappers initializer
|
28 |
+
*/
|
29 |
+
function initialize()
|
30 |
+
{
|
31 |
+
parent::initialize();
|
32 |
+
|
33 |
+
// Provider api end-points
|
34 |
+
$this->api->api_base_url = 'https://apis.live.net/v5.0/';
|
35 |
+
$this->api->authorize_url = 'https://login.live.com/oauth20_authorize.srf';
|
36 |
+
$this->api->token_url = 'https://login.live.com/oauth20_token.srf';
|
37 |
+
|
38 |
+
$this->api->curl_authenticate_method = "GET";
|
39 |
+
}
|
40 |
+
|
41 |
+
// --------------------------------------------------------------------
|
42 |
+
|
43 |
+
/**
|
44 |
+
* grab the user profile from the api client
|
45 |
+
*/
|
46 |
+
function getUserProfile()
|
47 |
+
{
|
48 |
+
$data = $this->api->get( "me" );
|
49 |
+
|
50 |
+
if ( ! isset( $data->id ) ){
|
51 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
52 |
+
}
|
53 |
+
|
54 |
+
$this->user->profile->identifier = (property_exists($data,'id'))?$data->id:"";
|
55 |
+
$this->user->profile->firstName = (property_exists($data,'first_name'))?$data->first_name:"";
|
56 |
+
$this->user->profile->lastName = (property_exists($data,'last_name'))?$data->last_name:"";
|
57 |
+
$this->user->profile->displayName = (property_exists($data,'name'))?trim( $data->name ):"";
|
58 |
+
$this->user->profile->gender = (property_exists($data,'gender'))?$data->gender:"";
|
59 |
+
|
60 |
+
//wl.basic
|
61 |
+
$this->user->profile->profileURL = (property_exists($data,'link'))?$data->link:"";
|
62 |
+
|
63 |
+
//wl.emails
|
64 |
+
$this->user->profile->email = (property_exists($data,'emails'))?$data->emails->account:"";
|
65 |
+
$this->user->profile->emailVerified = (property_exists($data,'emails'))?$data->emails->account:"";
|
66 |
+
|
67 |
+
//wl.birthday
|
68 |
+
$this->user->profile->birthDay = (property_exists($data,'birth_day'))?$data->birth_day:"";
|
69 |
+
$this->user->profile->birthMonth = (property_exists($data,'birth_month'))?$data->birth_month:"";
|
70 |
+
$this->user->profile->birthYear = (property_exists($data,'birth_year'))?$data->birth_year:"";
|
71 |
+
|
72 |
+
return $this->user->profile;
|
73 |
+
}
|
74 |
+
|
75 |
+
|
76 |
+
/**
|
77 |
+
* load the current logged in user contacts list from the IDp api client
|
78 |
+
*/
|
79 |
+
|
80 |
+
/* Windows Live api does not support retrieval of email addresses (only hashes :/) */
|
81 |
+
function getUserContacts()
|
82 |
+
{
|
83 |
+
$response = $this->api->get( 'me/contacts' );
|
84 |
+
|
85 |
+
if ( $this->api->http_code != 200 )
|
86 |
+
{
|
87 |
+
throw new Exception( 'User contacts request failed! ' . $this->providerId . ' returned an error: ' . $this->errorMessageByStatus( $this->api->http_code ) );
|
88 |
+
}
|
89 |
+
|
90 |
+
if ( !isset($response->data) || ( isset($response->errcode) && $response->errcode != 0 ) )
|
91 |
+
{
|
92 |
+
return array();
|
93 |
+
}
|
94 |
+
|
95 |
+
$contacts = array();
|
96 |
+
|
97 |
+
foreach( $response->data as $item ) {
|
98 |
+
$uc = new Hybrid_User_Contact();
|
99 |
+
|
100 |
+
$uc->identifier = (property_exists($item,'id'))?$item->id:"";
|
101 |
+
$uc->displayName = (property_exists($item,'name'))?$item->name:"";
|
102 |
+
|
103 |
+
$contacts[] = $uc;
|
104 |
+
}
|
105 |
+
|
106 |
+
return $contacts;
|
107 |
+
}
|
108 |
+
}
|
hybridauth/Hybrid/Providers/Mailru.php
CHANGED
@@ -1,63 +1,63 @@
|
|
1 |
-
<?php
|
2 |
-
/*!
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*
|
7 |
-
* Provider writed by xbreaker | https://github.com/xbreaker/hybridauth
|
8 |
-
*/
|
9 |
-
|
10 |
-
/**
|
11 |
-
* Hybrid_Providers_Mailru provider adapter based on OAuth2 protocol
|
12 |
-
*
|
13 |
-
*/
|
14 |
-
class Hybrid_Providers_Mailru extends Hybrid_Provider_Model_OAuth2
|
15 |
-
{
|
16 |
-
/**
|
17 |
-
* IDp wrappers initializer
|
18 |
-
*/
|
19 |
-
function initialize()
|
20 |
-
{
|
21 |
-
parent::initialize();
|
22 |
-
|
23 |
-
// Provider apis end-points
|
24 |
-
$this->api->api_base_url = "http://www.appsmail.ru/platform/api";
|
25 |
-
$this->api->authorize_url = "https://connect.mail.ru/oauth/authorize";
|
26 |
-
$this->api->token_url = "https://connect.mail.ru/oauth/token";
|
27 |
-
$this->api->sign_token_name = "session_key";
|
28 |
-
}
|
29 |
-
|
30 |
-
/**
|
31 |
-
* load the user profile from the IDp api client
|
32 |
-
*/
|
33 |
-
function getUserProfile()
|
34 |
-
{
|
35 |
-
$sig = md5( "client_id=" . $this->api->client_id . "format=jsonmethod=users.getInfosecure=1session_key=". $this->api->access_token . $this->api->client_secret );
|
36 |
-
$response = $this->api->api( "?format=json&client_id=" . $this->api->client_id . "&method=users.getInfo&secure=1&sig=" .$sig);
|
37 |
-
if ( ! isset( $response[0]->uid ) ){
|
38 |
-
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
39 |
-
}
|
40 |
-
|
41 |
-
$response = $response[0];
|
42 |
-
|
43 |
-
$this->user->profile->identifier = (property_exists($response,'uid'))?$response->uid:"";
|
44 |
-
$this->user->profile->firstName = (property_exists($response,'first_name'))?$response->first_name:"";
|
45 |
-
$this->user->profile->lastName = (property_exists($response,'last_name'))?$response->last_name:"";
|
46 |
-
$this->user->profile->displayName = (property_exists($response,'nick'))?$response->nick:"";
|
47 |
-
$this->user->profile->photoURL = (property_exists($response,'pic'))?$response->pic:"";
|
48 |
-
$this->user->profile->profileURL = (property_exists($response,'link'))?$response->link:"";
|
49 |
-
$this->user->profile->gender = (property_exists($response,'sex'))?$response->sex:"";
|
50 |
-
$this->user->profile->email = (property_exists($response,'email'))?$response->email:"";
|
51 |
-
$this->user->profile->emailVerified = (property_exists($response,'email'))?$response->email:"";
|
52 |
-
|
53 |
-
if( property_exists($response,'birthday') ){
|
54 |
-
list($birthday_day, $birthday_month, $birthday_year) = explode( '.', $response->birthday );
|
55 |
-
|
56 |
-
$this->user->profile->birthDay = (int) $birthday_day;
|
57 |
-
$this->user->profile->birthMonth = (int) $birthday_month;
|
58 |
-
$this->user->profile->birthYear = (int) $birthday_year;
|
59 |
-
}
|
60 |
-
|
61 |
-
return $this->user->profile;
|
62 |
-
}
|
63 |
-
}
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*
|
7 |
+
* Provider writed by xbreaker | https://github.com/xbreaker/hybridauth
|
8 |
+
*/
|
9 |
+
|
10 |
+
/**
|
11 |
+
* Hybrid_Providers_Mailru provider adapter based on OAuth2 protocol
|
12 |
+
*
|
13 |
+
*/
|
14 |
+
class Hybrid_Providers_Mailru extends Hybrid_Provider_Model_OAuth2
|
15 |
+
{
|
16 |
+
/**
|
17 |
+
* IDp wrappers initializer
|
18 |
+
*/
|
19 |
+
function initialize()
|
20 |
+
{
|
21 |
+
parent::initialize();
|
22 |
+
|
23 |
+
// Provider apis end-points
|
24 |
+
$this->api->api_base_url = "http://www.appsmail.ru/platform/api";
|
25 |
+
$this->api->authorize_url = "https://connect.mail.ru/oauth/authorize";
|
26 |
+
$this->api->token_url = "https://connect.mail.ru/oauth/token";
|
27 |
+
$this->api->sign_token_name = "session_key";
|
28 |
+
}
|
29 |
+
|
30 |
+
/**
|
31 |
+
* load the user profile from the IDp api client
|
32 |
+
*/
|
33 |
+
function getUserProfile()
|
34 |
+
{
|
35 |
+
$sig = md5( "client_id=" . $this->api->client_id . "format=jsonmethod=users.getInfosecure=1session_key=". $this->api->access_token . $this->api->client_secret );
|
36 |
+
$response = $this->api->api( "?format=json&client_id=" . $this->api->client_id . "&method=users.getInfo&secure=1&sig=" .$sig);
|
37 |
+
if ( ! isset( $response[0]->uid ) ){
|
38 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
39 |
+
}
|
40 |
+
|
41 |
+
$response = $response[0];
|
42 |
+
|
43 |
+
$this->user->profile->identifier = (property_exists($response,'uid'))?$response->uid:"";
|
44 |
+
$this->user->profile->firstName = (property_exists($response,'first_name'))?$response->first_name:"";
|
45 |
+
$this->user->profile->lastName = (property_exists($response,'last_name'))?$response->last_name:"";
|
46 |
+
$this->user->profile->displayName = (property_exists($response,'nick'))?$response->nick:"";
|
47 |
+
$this->user->profile->photoURL = (property_exists($response,'pic'))?$response->pic:"";
|
48 |
+
$this->user->profile->profileURL = (property_exists($response,'link'))?$response->link:"";
|
49 |
+
$this->user->profile->gender = (property_exists($response,'sex'))?$response->sex:"";
|
50 |
+
$this->user->profile->email = (property_exists($response,'email'))?$response->email:"";
|
51 |
+
$this->user->profile->emailVerified = (property_exists($response,'email'))?$response->email:"";
|
52 |
+
|
53 |
+
if( property_exists($response,'birthday') ){
|
54 |
+
list($birthday_day, $birthday_month, $birthday_year) = explode( '.', $response->birthday );
|
55 |
+
|
56 |
+
$this->user->profile->birthDay = (int) $birthday_day;
|
57 |
+
$this->user->profile->birthMonth = (int) $birthday_month;
|
58 |
+
$this->user->profile->birthYear = (int) $birthday_year;
|
59 |
+
}
|
60 |
+
|
61 |
+
return $this->user->profile;
|
62 |
+
}
|
63 |
+
}
|
hybridauth/Hybrid/Providers/Mixi.php
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
-
<?php
|
2 |
-
// credit to: http://hp.nonip.info/wiki/work/index.php?php%2FHybridAuth
|
3 |
-
class Hybrid_Providers_Mixi extends Hybrid_Provider_Model_OpenID
|
4 |
-
{
|
5 |
-
var $openidIdentifier = "https://mixi.jp";
|
6 |
-
}
|
1 |
+
<?php
|
2 |
+
// credit to: http://hp.nonip.info/wiki/work/index.php?php%2FHybridAuth
|
3 |
+
class Hybrid_Providers_Mixi extends Hybrid_Provider_Model_OpenID
|
4 |
+
{
|
5 |
+
var $openidIdentifier = "https://mixi.jp";
|
6 |
+
}
|
hybridauth/Hybrid/Providers/Odnoklassniki.php
CHANGED
@@ -1,176 +1,176 @@
|
|
1 |
-
<?php
|
2 |
-
/*!
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Hybrid_Providers_Odnoklassniki provider adapter based on OAuth2 protocol
|
10 |
-
*
|
11 |
-
*/
|
12 |
-
class Hybrid_Providers_Odnoklassniki extends Hybrid_Provider_Model_OAuth2
|
13 |
-
{
|
14 |
-
/**
|
15 |
-
* IDp wrappers initializer
|
16 |
-
*/
|
17 |
-
function initialize()
|
18 |
-
{
|
19 |
-
parent::initialize();
|
20 |
-
|
21 |
-
// Provider apis end-points
|
22 |
-
$this->api->api_base_url = "http://api.odnoklassniki.ru/fb.do";
|
23 |
-
$this->api->authorize_url = "http://www.odnoklassniki.ru/oauth/authorize";
|
24 |
-
$this->api->token_url = "http://api.odnoklassniki.ru/oauth/token.do";
|
25 |
-
$this->api->sign_token_name = "access_token";
|
26 |
-
}
|
27 |
-
|
28 |
-
private function request( $url, $params=false, $type="GET" )
|
29 |
-
{
|
30 |
-
if( $type == "GET" ){
|
31 |
-
$url = $url . ( strpos( $url, '?' ) ? '&' : '?' ) . http_build_query($params, '', '&');
|
32 |
-
}
|
33 |
-
|
34 |
-
$this->http_info = array();
|
35 |
-
$ch = curl_init();
|
36 |
-
|
37 |
-
curl_setopt($ch, CURLOPT_URL , $url );
|
38 |
-
curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1 );
|
39 |
-
curl_setopt($ch, CURLOPT_TIMEOUT , $this->api->curl_time_out );
|
40 |
-
curl_setopt($ch, CURLOPT_USERAGENT , $this->api->curl_useragent );
|
41 |
-
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT , $this->api->curl_connect_time_out );
|
42 |
-
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER , $this->api->curl_ssl_verifypeer );
|
43 |
-
curl_setopt($ch, CURLOPT_HTTPHEADER , $this->api->curl_header );
|
44 |
-
if($this->api->curl_proxy){
|
45 |
-
curl_setopt( $ch, CURLOPT_PROXY , $this->api->curl_proxy);
|
46 |
-
}
|
47 |
-
if( $type == "POST" ){
|
48 |
-
curl_setopt($ch, CURLOPT_POST, 1);
|
49 |
-
if($params) curl_setopt( $ch, CURLOPT_POSTFIELDS, $params );
|
50 |
-
}
|
51 |
-
$response = curl_exec($ch);
|
52 |
-
|
53 |
-
$this->http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
54 |
-
$this->http_info = array_merge($this->http_info, curl_getinfo($ch));
|
55 |
-
|
56 |
-
curl_close ($ch);
|
57 |
-
|
58 |
-
return $response;
|
59 |
-
}
|
60 |
-
|
61 |
-
private function parseRequestResult( $result )
|
62 |
-
{
|
63 |
-
if( json_decode( $result ) ) return json_decode( $result );
|
64 |
-
|
65 |
-
parse_str( $result, $output );
|
66 |
-
|
67 |
-
$result = new StdClass();
|
68 |
-
|
69 |
-
foreach( $output as $k => $v )
|
70 |
-
$result->$k = $v;
|
71 |
-
|
72 |
-
return $result;
|
73 |
-
}
|
74 |
-
|
75 |
-
function authodnoklass( $code )
|
76 |
-
{
|
77 |
-
$params = array(
|
78 |
-
"client_id" => $this->api->client_id,
|
79 |
-
"client_secret" => $this->api->client_secret,
|
80 |
-
"grant_type" => "authorization_code",
|
81 |
-
"redirect_uri" => $this->api->redirect_uri,
|
82 |
-
"code" => $code
|
83 |
-
);
|
84 |
-
|
85 |
-
$response = $this->request( $this->api->token_url, http_build_query($params, '', '&'), $this->api->curl_authenticate_method );
|
86 |
-
|
87 |
-
$response = $this->parseRequestResult( $response );
|
88 |
-
|
89 |
-
if( ! $response || ! isset( $response->access_token ) ){
|
90 |
-
throw new Exception( "The Authorization Service has return: " . $response->error );
|
91 |
-
}
|
92 |
-
|
93 |
-
if( isset( $response->access_token ) ) $this->api->access_token = $response->access_token;
|
94 |
-
if( isset( $response->refresh_token ) ) $this->api->refresh_token = $response->refresh_token;
|
95 |
-
if( isset( $response->expires_in ) ) $this->api->access_token_expires_in = $response->expires_in;
|
96 |
-
|
97 |
-
// calculate when the access token expire
|
98 |
-
// At this moment Odnoklassniki does not return expire time in response.
|
99 |
-
// 30 minutes expire time staten in dev docs http://apiok.ru/wiki/pages/viewpage.action?pageId=42476652
|
100 |
-
if( isset( $response->expires_in ) ) {
|
101 |
-
$this->api->access_token_expires_at = time() + $response->expires_in;
|
102 |
-
}
|
103 |
-
else {
|
104 |
-
$this->api->access_token_expires_at = time() + 1800;
|
105 |
-
}
|
106 |
-
|
107 |
-
return $response;
|
108 |
-
}
|
109 |
-
|
110 |
-
function loginFinish()
|
111 |
-
{
|
112 |
-
$error = (array_key_exists('error',$_REQUEST))?$_REQUEST['error']:"";
|
113 |
-
|
114 |
-
// check for errors
|
115 |
-
if ( $error ){
|
116 |
-
throw new Exception( "Authentication failed! {$this->providerId} returned an error: " . htmlentities( $error ), 5 );
|
117 |
-
}
|
118 |
-
|
119 |
-
// try to authenticate user
|
120 |
-
$code = (array_key_exists('code',$_REQUEST))?$_REQUEST['code']:"";
|
121 |
-
|
122 |
-
try{
|
123 |
-
$this->authodnoklass( $code );
|
124 |
-
}
|
125 |
-
catch( Exception $e ){
|
126 |
-
throw new Exception( "Authentication failed! {$this->providerId} returned an error", 6 );
|
127 |
-
}
|
128 |
-
|
129 |
-
// check if authenticated
|
130 |
-
if ( ! $this->api->access_token ){
|
131 |
-
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid access_token.", 5 );
|
132 |
-
}
|
133 |
-
|
134 |
-
// store tokens
|
135 |
-
$this->token( "access_token" , $this->api->access_token );
|
136 |
-
$this->token( "refresh_token", $this->api->refresh_token );
|
137 |
-
$this->token( "expires_in" , $this->api->access_token_expires_in );
|
138 |
-
$this->token( "expires_at" , $this->api->access_token_expires_at );
|
139 |
-
|
140 |
-
// set user connected locally
|
141 |
-
$this->setUserConnected();
|
142 |
-
}
|
143 |
-
|
144 |
-
/**
|
145 |
-
* load the user profile from the IDp api client
|
146 |
-
*/
|
147 |
-
function getUserProfile()
|
148 |
-
{
|
149 |
-
$sig = md5('application_key=' . $this->config['keys']['key'] . 'method=users.getCurrentUser' . md5($this->api->access_token . $this->api->client_secret));
|
150 |
-
$response = $this->api->api( '?application_key=' . $this->config['keys']['key'] . '&method=users.getCurrentUser&sig=' .$sig);
|
151 |
-
if ( ! isset( $response->uid ) ){
|
152 |
-
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
153 |
-
}
|
154 |
-
|
155 |
-
$this->user->profile->identifier = (property_exists($response,'uid'))?$response->uid:"";
|
156 |
-
$this->user->profile->firstName = (property_exists($response,'first_name'))?$response->first_name:"";
|
157 |
-
$this->user->profile->lastName = (property_exists($response,'last_name'))?$response->last_name:"";
|
158 |
-
$this->user->profile->displayName = (property_exists($response,'name'))?$response->name:"";
|
159 |
-
$this->user->profile->photoURL = (property_exists($response,'pic_1'))?$response->pic_1:"";
|
160 |
-
$this->user->profile->photoBIG = (property_exists($response,'pic_2'))?$response->pic_2:"";
|
161 |
-
$this->user->profile->profileURL = (property_exists($response,'link'))?$response->link:"";
|
162 |
-
$this->user->profile->gender = (property_exists($response,'gender'))?$response->gender:"";
|
163 |
-
$this->user->profile->email = (property_exists($response,'email'))?$response->email:"";
|
164 |
-
$this->user->profile->emailVerified = (property_exists($response,'email'))?$response->email:"";
|
165 |
-
|
166 |
-
if( property_exists($response,'birthday') ){
|
167 |
-
list($birthday_year, $birthday_month, $birthday_day) = explode( '-', $response->birthday );
|
168 |
-
|
169 |
-
$this->user->profile->birthDay = (int) $birthday_day;
|
170 |
-
$this->user->profile->birthMonth = (int) $birthday_month;
|
171 |
-
$this->user->profile->birthYear = (int) $birthday_year;
|
172 |
-
}
|
173 |
-
|
174 |
-
return $this->user->profile;
|
175 |
-
}
|
176 |
-
}
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Hybrid_Providers_Odnoklassniki provider adapter based on OAuth2 protocol
|
10 |
+
*
|
11 |
+
*/
|
12 |
+
class Hybrid_Providers_Odnoklassniki extends Hybrid_Provider_Model_OAuth2
|
13 |
+
{
|
14 |
+
/**
|
15 |
+
* IDp wrappers initializer
|
16 |
+
*/
|
17 |
+
function initialize()
|
18 |
+
{
|
19 |
+
parent::initialize();
|
20 |
+
|
21 |
+
// Provider apis end-points
|
22 |
+
$this->api->api_base_url = "http://api.odnoklassniki.ru/fb.do";
|
23 |
+
$this->api->authorize_url = "http://www.odnoklassniki.ru/oauth/authorize";
|
24 |
+
$this->api->token_url = "http://api.odnoklassniki.ru/oauth/token.do";
|
25 |
+
$this->api->sign_token_name = "access_token";
|
26 |
+
}
|
27 |
+
|
28 |
+
private function request( $url, $params=false, $type="GET" )
|
29 |
+
{
|
30 |
+
if( $type == "GET" ){
|
31 |
+
$url = $url . ( strpos( $url, '?' ) ? '&' : '?' ) . http_build_query($params, '', '&');
|
32 |
+
}
|
33 |
+
|
34 |
+
$this->http_info = array();
|
35 |
+
$ch = curl_init();
|
36 |
+
|
37 |
+
curl_setopt($ch, CURLOPT_URL , $url );
|
38 |
+
curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1 );
|
39 |
+
curl_setopt($ch, CURLOPT_TIMEOUT , $this->api->curl_time_out );
|
40 |
+
curl_setopt($ch, CURLOPT_USERAGENT , $this->api->curl_useragent );
|
41 |
+
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT , $this->api->curl_connect_time_out );
|
42 |
+
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER , $this->api->curl_ssl_verifypeer );
|
43 |
+
curl_setopt($ch, CURLOPT_HTTPHEADER , $this->api->curl_header );
|
44 |
+
if($this->api->curl_proxy){
|
45 |
+
curl_setopt( $ch, CURLOPT_PROXY , $this->api->curl_proxy);
|
46 |
+
}
|
47 |
+
if( $type == "POST" ){
|
48 |
+
curl_setopt($ch, CURLOPT_POST, 1);
|
49 |
+
if($params) curl_setopt( $ch, CURLOPT_POSTFIELDS, $params );
|
50 |
+
}
|
51 |
+
$response = curl_exec($ch);
|
52 |
+
|
53 |
+
$this->http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
54 |
+
$this->http_info = array_merge($this->http_info, curl_getinfo($ch));
|
55 |
+
|
56 |
+
curl_close ($ch);
|
57 |
+
|
58 |
+
return $response;
|
59 |
+
}
|
60 |
+
|
61 |
+
private function parseRequestResult( $result )
|
62 |
+
{
|
63 |
+
if( json_decode( $result ) ) return json_decode( $result );
|
64 |
+
|
65 |
+
parse_str( $result, $output );
|
66 |
+
|
67 |
+
$result = new StdClass();
|
68 |
+
|
69 |
+
foreach( $output as $k => $v )
|
70 |
+
$result->$k = $v;
|
71 |
+
|
72 |
+
return $result;
|
73 |
+
}
|
74 |
+
|
75 |
+
function authodnoklass( $code )
|
76 |
+
{
|
77 |
+
$params = array(
|
78 |
+
"client_id" => $this->api->client_id,
|
79 |
+
"client_secret" => $this->api->client_secret,
|
80 |
+
"grant_type" => "authorization_code",
|
81 |
+
"redirect_uri" => $this->api->redirect_uri,
|
82 |
+
"code" => $code
|
83 |
+
);
|
84 |
+
|
85 |
+
$response = $this->request( $this->api->token_url, http_build_query($params, '', '&'), $this->api->curl_authenticate_method );
|
86 |
+
|
87 |
+
$response = $this->parseRequestResult( $response );
|
88 |
+
|
89 |
+
if( ! $response || ! isset( $response->access_token ) ){
|
90 |
+
throw new Exception( "The Authorization Service has return: " . $response->error );
|
91 |
+
}
|
92 |
+
|
93 |
+
if( isset( $response->access_token ) ) $this->api->access_token = $response->access_token;
|
94 |
+
if( isset( $response->refresh_token ) ) $this->api->refresh_token = $response->refresh_token;
|
95 |
+
if( isset( $response->expires_in ) ) $this->api->access_token_expires_in = $response->expires_in;
|
96 |
+
|
97 |
+
// calculate when the access token expire
|
98 |
+
// At this moment Odnoklassniki does not return expire time in response.
|
99 |
+
// 30 minutes expire time staten in dev docs http://apiok.ru/wiki/pages/viewpage.action?pageId=42476652
|
100 |
+
if( isset( $response->expires_in ) ) {
|
101 |
+
$this->api->access_token_expires_at = time() + $response->expires_in;
|
102 |
+
}
|
103 |
+
else {
|
104 |
+
$this->api->access_token_expires_at = time() + 1800;
|
105 |
+
}
|
106 |
+
|
107 |
+
return $response;
|
108 |
+
}
|
109 |
+
|
110 |
+
function loginFinish()
|
111 |
+
{
|
112 |
+
$error = (array_key_exists('error',$_REQUEST))?$_REQUEST['error']:"";
|
113 |
+
|
114 |
+
// check for errors
|
115 |
+
if ( $error ){
|
116 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an error: " . htmlentities( $error ), 5 );
|
117 |
+
}
|
118 |
+
|
119 |
+
// try to authenticate user
|
120 |
+
$code = (array_key_exists('code',$_REQUEST))?$_REQUEST['code']:"";
|
121 |
+
|
122 |
+
try{
|
123 |
+
$this->authodnoklass( $code );
|
124 |
+
}
|
125 |
+
catch( Exception $e ){
|
126 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an error", 6 );
|
127 |
+
}
|
128 |
+
|
129 |
+
// check if authenticated
|
130 |
+
if ( ! $this->api->access_token ){
|
131 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid access_token.", 5 );
|
132 |
+
}
|
133 |
+
|
134 |
+
// store tokens
|
135 |
+
$this->token( "access_token" , $this->api->access_token );
|
136 |
+
$this->token( "refresh_token", $this->api->refresh_token );
|
137 |
+
$this->token( "expires_in" , $this->api->access_token_expires_in );
|
138 |
+
$this->token( "expires_at" , $this->api->access_token_expires_at );
|
139 |
+
|
140 |
+
// set user connected locally
|
141 |
+
$this->setUserConnected();
|
142 |
+
}
|
143 |
+
|
144 |
+
/**
|
145 |
+
* load the user profile from the IDp api client
|
146 |
+
*/
|
147 |
+
function getUserProfile()
|
148 |
+
{
|
149 |
+
$sig = md5('application_key=' . $this->config['keys']['key'] . 'method=users.getCurrentUser' . md5($this->api->access_token . $this->api->client_secret));
|
150 |
+
$response = $this->api->api( '?application_key=' . $this->config['keys']['key'] . '&method=users.getCurrentUser&sig=' .$sig);
|
151 |
+
if ( ! isset( $response->uid ) ){
|
152 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
153 |
+
}
|
154 |
+
|
155 |
+
$this->user->profile->identifier = (property_exists($response,'uid'))?$response->uid:"";
|
156 |
+
$this->user->profile->firstName = (property_exists($response,'first_name'))?$response->first_name:"";
|
157 |
+
$this->user->profile->lastName = (property_exists($response,'last_name'))?$response->last_name:"";
|
158 |
+
$this->user->profile->displayName = (property_exists($response,'name'))?$response->name:"";
|
159 |
+
$this->user->profile->photoURL = (property_exists($response,'pic_1'))?$response->pic_1:"";
|
160 |
+
$this->user->profile->photoBIG = (property_exists($response,'pic_2'))?$response->pic_2:"";
|
161 |
+
$this->user->profile->profileURL = (property_exists($response,'link'))?$response->link:"";
|
162 |
+
$this->user->profile->gender = (property_exists($response,'gender'))?$response->gender:"";
|
163 |
+
$this->user->profile->email = (property_exists($response,'email'))?$response->email:"";
|
164 |
+
$this->user->profile->emailVerified = (property_exists($response,'email'))?$response->email:"";
|
165 |
+
|
166 |
+
if( property_exists($response,'birthday') ){
|
167 |
+
list($birthday_year, $birthday_month, $birthday_day) = explode( '-', $response->birthday );
|
168 |
+
|
169 |
+
$this->user->profile->birthDay = (int) $birthday_day;
|
170 |
+
$this->user->profile->birthMonth = (int) $birthday_month;
|
171 |
+
$this->user->profile->birthYear = (int) $birthday_year;
|
172 |
+
}
|
173 |
+
|
174 |
+
return $this->user->profile;
|
175 |
+
}
|
176 |
+
}
|
hybridauth/Hybrid/Providers/OpenID.php
CHANGED
@@ -1,15 +1,15 @@
|
|
1 |
-
<?php
|
2 |
-
/*!
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Hybrid_Providers_OpenID provider adapter for any idp openid based
|
10 |
-
*
|
11 |
-
* http://hybridauth.sourceforge.net/userguide/IDProvider_info_OpenID.html
|
12 |
-
*/
|
13 |
-
class Hybrid_Providers_OpenID extends Hybrid_Provider_Model_OpenID
|
14 |
-
{
|
15 |
-
}
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Hybrid_Providers_OpenID provider adapter for any idp openid based
|
10 |
+
*
|
11 |
+
* http://hybridauth.sourceforge.net/userguide/IDProvider_info_OpenID.html
|
12 |
+
*/
|
13 |
+
class Hybrid_Providers_OpenID extends Hybrid_Provider_Model_OpenID
|
14 |
+
{
|
15 |
+
}
|
hybridauth/Hybrid/Providers/PixelPin.php
CHANGED
@@ -1,49 +1,49 @@
|
|
1 |
-
<?php
|
2 |
-
/*!
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Hybrid_Providers_PixelPin provider adapter based on OAuth2 protocol
|
10 |
-
*
|
11 |
-
* http://hybridauth.sourceforge.net/userguide/IDProvider_info_PixelPin.html
|
12 |
-
*/
|
13 |
-
class Hybrid_Providers_PixelPin extends Hybrid_Provider_Model_OAuth2
|
14 |
-
{
|
15 |
-
/**
|
16 |
-
* IDp wrappers initializer
|
17 |
-
*/
|
18 |
-
function initialize()
|
19 |
-
{
|
20 |
-
parent::initialize();
|
21 |
-
|
22 |
-
// Provider apis end-points
|
23 |
-
$this->api->api_base_url = "https://ws3.pixelpin.co.uk/index.php/api/";
|
24 |
-
$this->api->authorize_url = "https://login.pixelpin.co.uk/OAuth2/FLogin.aspx";
|
25 |
-
$this->api->token_url = "https://ws3.pixelpin.co.uk/index.php/api/token";
|
26 |
-
|
27 |
-
$this->api->sign_token_name = "oauth_token";
|
28 |
-
}
|
29 |
-
|
30 |
-
/**
|
31 |
-
* load the user profile from the IDp api client
|
32 |
-
*/
|
33 |
-
function getUserProfile()
|
34 |
-
{
|
35 |
-
$data = $this->api->api( "userdata", "POST" );
|
36 |
-
|
37 |
-
if ( ! isset( $data->id ) ){
|
38 |
-
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
39 |
-
}
|
40 |
-
|
41 |
-
$this->user->profile->identifier = $data->id;
|
42 |
-
$this->user->profile->firstName = $data->firstName;
|
43 |
-
$this->user->profile->displayName = $data->firstName;
|
44 |
-
$this->user->profile->email = $data->email;
|
45 |
-
$this->user->profile->emailVerified = $data->email;
|
46 |
-
|
47 |
-
return $this->user->profile;
|
48 |
-
}
|
49 |
-
}
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Hybrid_Providers_PixelPin provider adapter based on OAuth2 protocol
|
10 |
+
*
|
11 |
+
* http://hybridauth.sourceforge.net/userguide/IDProvider_info_PixelPin.html
|
12 |
+
*/
|
13 |
+
class Hybrid_Providers_PixelPin extends Hybrid_Provider_Model_OAuth2
|
14 |
+
{
|
15 |
+
/**
|
16 |
+
* IDp wrappers initializer
|
17 |
+
*/
|
18 |
+
function initialize()
|
19 |
+
{
|
20 |
+
parent::initialize();
|
21 |
+
|
22 |
+
// Provider apis end-points
|
23 |
+
$this->api->api_base_url = "https://ws3.pixelpin.co.uk/index.php/api/";
|
24 |
+
$this->api->authorize_url = "https://login.pixelpin.co.uk/OAuth2/FLogin.aspx";
|
25 |
+
$this->api->token_url = "https://ws3.pixelpin.co.uk/index.php/api/token";
|
26 |
+
|
27 |
+
$this->api->sign_token_name = "oauth_token";
|
28 |
+
}
|
29 |
+
|
30 |
+
/**
|
31 |
+
* load the user profile from the IDp api client
|
32 |
+
*/
|
33 |
+
function getUserProfile()
|
34 |
+
{
|
35 |
+
$data = $this->api->api( "userdata", "POST" );
|
36 |
+
|
37 |
+
if ( ! isset( $data->id ) ){
|
38 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
39 |
+
}
|
40 |
+
|
41 |
+
$this->user->profile->identifier = $data->id;
|
42 |
+
$this->user->profile->firstName = $data->firstName;
|
43 |
+
$this->user->profile->displayName = $data->firstName;
|
44 |
+
$this->user->profile->email = $data->email;
|
45 |
+
$this->user->profile->emailVerified = $data->email;
|
46 |
+
|
47 |
+
return $this->user->profile;
|
48 |
+
}
|
49 |
+
}
|
hybridauth/Hybrid/Providers/Reddit.php
CHANGED
@@ -1,201 +1,201 @@
|
|
1 |
-
<?php
|
2 |
-
/*!
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | https://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2014 HybridAuth authors | hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Hybrid_Providers_Reddit
|
10 |
-
*/
|
11 |
-
class Hybrid_Providers_Reddit extends Hybrid_Provider_Model_OAuth2
|
12 |
-
{
|
13 |
-
// default permissions
|
14 |
-
//full list at http://www.reddit.com/dev/api/oauth
|
15 |
-
public $scope = "identity";
|
16 |
-
|
17 |
-
/**
|
18 |
-
* IDp wrappers initializer
|
19 |
-
*/
|
20 |
-
function initialize()
|
21 |
-
{
|
22 |
-
parent::initialize();
|
23 |
-
|
24 |
-
// Provider api end-points
|
25 |
-
$this->api->api_base_url = "http://www.reddit.com/api/v1/";
|
26 |
-
$this->api->authorize_url = "https://ssl.reddit.com/api/v1/authorize";
|
27 |
-
$this->api->token_url = "https://ssl.reddit.com/api/v1/access_token";
|
28 |
-
}
|
29 |
-
|
30 |
-
/**
|
31 |
-
* begin login step
|
32 |
-
*/
|
33 |
-
function loginBegin()
|
34 |
-
{
|
35 |
-
// redirect the user to the provider authentication url
|
36 |
-
Hybrid_Auth::redirect( $this->api->authorizeUrl( array( "scope" => $this->scope, "duration" => "temporary", "state" => str_shuffle("abcdefghijkl123456789") ) ) );
|
37 |
-
|
38 |
-
}
|
39 |
-
|
40 |
-
/**
|
41 |
-
* finish login step
|
42 |
-
*/
|
43 |
-
function loginFinish()
|
44 |
-
{
|
45 |
-
$error = (array_key_exists('error',$_REQUEST))?$_REQUEST['error']:"";
|
46 |
-
|
47 |
-
// check for errors
|
48 |
-
if ( $error ){
|
49 |
-
throw new Exception( "Authentication failed! {$this->providerId} returned an error: " . htmlentities( $error ), 5 );
|
50 |
-
}
|
51 |
-
|
52 |
-
// try to authenticate user
|
53 |
-
$code = (array_key_exists('code',$_REQUEST))?$_REQUEST['code']:"";
|
54 |
-
|
55 |
-
try{
|
56 |
-
$this->authenticate( $code );
|
57 |
-
}
|
58 |
-
catch( Exception $e ){
|
59 |
-
throw new Exception( "Authentication failed! {$this->providerId} returned an error", 5 );
|
60 |
-
}
|
61 |
-
|
62 |
-
// check if authenticated
|
63 |
-
if ( ! $this->api->access_token ){
|
64 |
-
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid access_token", 5 );
|
65 |
-
}
|
66 |
-
|
67 |
-
// store tokens
|
68 |
-
$this->token( "access_token" , $this->api->access_token );
|
69 |
-
$this->token( "refresh_token", $this->api->refresh_token );
|
70 |
-
$this->token( "expires_in" , $this->api->access_token_expires_in );
|
71 |
-
$this->token( "expires_at" , $this->api->access_token_expires_at );
|
72 |
-
|
73 |
-
// set user connected locally
|
74 |
-
$this->setUserConnected();
|
75 |
-
}
|
76 |
-
|
77 |
-
function authenticate( $code )
|
78 |
-
{
|
79 |
-
$params = array(
|
80 |
-
"client_id" => $this->api->client_id,
|
81 |
-
"grant_type" => "authorization_code",
|
82 |
-
"redirect_uri" => $this->api->redirect_uri,
|
83 |
-
"code" => $code
|
84 |
-
);
|
85 |
-
|
86 |
-
$http_headers = array();
|
87 |
-
$http_headers['Authorization'] = 'Basic ' . base64_encode( $this->api->client_id . ':' . $this->api->client_secret);
|
88 |
-
|
89 |
-
$response = $this->request( $this->api->token_url, http_build_query($params, '', '&'), 'POST', $http_headers );
|
90 |
-
|
91 |
-
$response = $this->parseRequestResult( $response );
|
92 |
-
|
93 |
-
if( ! $response || ! isset( $response->access_token ) ){
|
94 |
-
throw new Exception( "The Authorization Service has return: " . $response->error );
|
95 |
-
}
|
96 |
-
|
97 |
-
if( isset( $response->access_token ) ) $this->api->access_token = $response->access_token;
|
98 |
-
if( isset( $response->refresh_token ) ) $this->api->refresh_token = $response->refresh_token;
|
99 |
-
if( isset( $response->expires_in ) ) $this->api->access_token_expires_in = $response->expires_in;
|
100 |
-
|
101 |
-
// calculate when the access token expire
|
102 |
-
if( isset( $response->expires_in ) ) {
|
103 |
-
$this->api->access_token_expires_at = time() + $response->expires_in;
|
104 |
-
}
|
105 |
-
else {
|
106 |
-
$this->api->access_token_expires_at = time() + 3600;
|
107 |
-
}
|
108 |
-
|
109 |
-
return $response;
|
110 |
-
}
|
111 |
-
|
112 |
-
private function request( $url, $params = array(), $type="GET", $http_headers = null )
|
113 |
-
{
|
114 |
-
if( $type == "GET" ){
|
115 |
-
$url = $url . ( strpos( $url, '?' ) ? '&' : '?' ) . http_build_query($params, '', '&');
|
116 |
-
}
|
117 |
-
|
118 |
-
$this->http_info = array();
|
119 |
-
$ch = curl_init();
|
120 |
-
|
121 |
-
curl_setopt($ch, CURLOPT_URL , $url );
|
122 |
-
curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1 );
|
123 |
-
curl_setopt($ch, CURLOPT_TIMEOUT , $this->api->curl_time_out );
|
124 |
-
curl_setopt($ch, CURLOPT_USERAGENT , $this->api->curl_useragent );
|
125 |
-
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT , $this->api->curl_connect_time_out );
|
126 |
-
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER , $this->api->curl_ssl_verifypeer );
|
127 |
-
curl_setopt($ch, CURLOPT_HTTPHEADER , $this->api->curl_header );
|
128 |
-
|
129 |
-
if (is_array($http_headers)) {
|
130 |
-
$header = array();
|
131 |
-
foreach($http_headers as $key => $parsed_urlvalue) {
|
132 |
-
$header[] = "$key: $parsed_urlvalue";
|
133 |
-
}
|
134 |
-
|
135 |
-
curl_setopt($ch, CURLOPT_HTTPHEADER, $header );
|
136 |
-
}
|
137 |
-
else{
|
138 |
-
curl_setopt($ch, CURLOPT_HTTPHEADER, $this->api->curl_header );
|
139 |
-
}
|
140 |
-
|
141 |
-
if($this->api->curl_proxy){
|
142 |
-
curl_setopt( $ch, CURLOPT_PROXY , $this->api->curl_proxy);
|
143 |
-
}
|
144 |
-
|
145 |
-
if( $type == "POST" ){
|
146 |
-
curl_setopt($ch, CURLOPT_POST, 1);
|
147 |
-
if($params) curl_setopt( $ch, CURLOPT_POSTFIELDS, $params );
|
148 |
-
}
|
149 |
-
|
150 |
-
$response = curl_exec($ch);
|
151 |
-
|
152 |
-
$this->http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
153 |
-
$this->http_info = array_merge($this->http_info, curl_getinfo($ch));
|
154 |
-
|
155 |
-
curl_close ($ch);
|
156 |
-
|
157 |
-
return $response;
|
158 |
-
}
|
159 |
-
|
160 |
-
private function parseRequestResult( $result )
|
161 |
-
{
|
162 |
-
if( json_decode( $result ) ) return json_decode( $result );
|
163 |
-
|
164 |
-
parse_str( $result, $output );
|
165 |
-
|
166 |
-
$result = new StdClass();
|
167 |
-
|
168 |
-
foreach( $output as $k => $v )
|
169 |
-
$result->$k = $v;
|
170 |
-
|
171 |
-
return $result;
|
172 |
-
}
|
173 |
-
|
174 |
-
/**
|
175 |
-
* load the user profile from the IDp api client
|
176 |
-
*
|
177 |
-
* https://github.com/reddit/reddit/wiki/OAuth2
|
178 |
-
* https://github.com/adoy/PHP-OAuth2/blob/master/src/OAuth2/Client.php#L315
|
179 |
-
*/
|
180 |
-
function getUserProfile()
|
181 |
-
{
|
182 |
-
$http_headers = array();
|
183 |
-
$http_headers['Authorization'] = 'Bearer ' . $this->api->access_token;
|
184 |
-
|
185 |
-
$response = $this->request( "https://oauth.reddit.com/api/v1/me.json?access_token=" . $this->api->access_token, array(), 'GET', $http_headers );
|
186 |
-
|
187 |
-
$response = $this->parseRequestResult( $response );
|
188 |
-
|
189 |
-
if ( ! $response || ! isset( $response->name ) ){
|
190 |
-
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
191 |
-
}
|
192 |
-
|
193 |
-
$this->user->profile->identifier = @ $response->name;
|
194 |
-
$this->user->profile->displayName = @ $response->name;
|
195 |
-
$this->user->profile->profileURL = "https://www.reddit.com/user/" . $this->user->profile->identifier . "/";
|
196 |
-
|
197 |
-
if( $this->user->profile->identifier ){
|
198 |
-
return $this->user->profile;
|
199 |
-
}
|
200 |
-
}
|
201 |
-
}
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | https://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2014 HybridAuth authors | hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Hybrid_Providers_Reddit
|
10 |
+
*/
|
11 |
+
class Hybrid_Providers_Reddit extends Hybrid_Provider_Model_OAuth2
|
12 |
+
{
|
13 |
+
// default permissions
|
14 |
+
//full list at http://www.reddit.com/dev/api/oauth
|
15 |
+
public $scope = "identity";
|
16 |
+
|
17 |
+
/**
|
18 |
+
* IDp wrappers initializer
|
19 |
+
*/
|
20 |
+
function initialize()
|
21 |
+
{
|
22 |
+
parent::initialize();
|
23 |
+
|
24 |
+
// Provider api end-points
|
25 |
+
$this->api->api_base_url = "http://www.reddit.com/api/v1/";
|
26 |
+
$this->api->authorize_url = "https://ssl.reddit.com/api/v1/authorize";
|
27 |
+
$this->api->token_url = "https://ssl.reddit.com/api/v1/access_token";
|
28 |
+
}
|
29 |
+
|
30 |
+
/**
|
31 |
+
* begin login step
|
32 |
+
*/
|
33 |
+
function loginBegin()
|
34 |
+
{
|
35 |
+
// redirect the user to the provider authentication url
|
36 |
+
Hybrid_Auth::redirect( $this->api->authorizeUrl( array( "scope" => $this->scope, "duration" => "temporary", "state" => str_shuffle("abcdefghijkl123456789") ) ) );
|
37 |
+
|
38 |
+
}
|
39 |
+
|
40 |
+
/**
|
41 |
+
* finish login step
|
42 |
+
*/
|
43 |
+
function loginFinish()
|
44 |
+
{
|
45 |
+
$error = (array_key_exists('error',$_REQUEST))?$_REQUEST['error']:"";
|
46 |
+
|
47 |
+
// check for errors
|
48 |
+
if ( $error ){
|
49 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an error: " . htmlentities( $error ), 5 );
|
50 |
+
}
|
51 |
+
|
52 |
+
// try to authenticate user
|
53 |
+
$code = (array_key_exists('code',$_REQUEST))?$_REQUEST['code']:"";
|
54 |
+
|
55 |
+
try{
|
56 |
+
$this->authenticate( $code );
|
57 |
+
}
|
58 |
+
catch( Exception $e ){
|
59 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an error", 5 );
|
60 |
+
}
|
61 |
+
|
62 |
+
// check if authenticated
|
63 |
+
if ( ! $this->api->access_token ){
|
64 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid access_token", 5 );
|
65 |
+
}
|
66 |
+
|
67 |
+
// store tokens
|
68 |
+
$this->token( "access_token" , $this->api->access_token );
|
69 |
+
$this->token( "refresh_token", $this->api->refresh_token );
|
70 |
+
$this->token( "expires_in" , $this->api->access_token_expires_in );
|
71 |
+
$this->token( "expires_at" , $this->api->access_token_expires_at );
|
72 |
+
|
73 |
+
// set user connected locally
|
74 |
+
$this->setUserConnected();
|
75 |
+
}
|
76 |
+
|
77 |
+
function authenticate( $code )
|
78 |
+
{
|
79 |
+
$params = array(
|
80 |
+
"client_id" => $this->api->client_id,
|
81 |
+
"grant_type" => "authorization_code",
|
82 |
+
"redirect_uri" => $this->api->redirect_uri,
|
83 |
+
"code" => $code
|
84 |
+
);
|
85 |
+
|
86 |
+
$http_headers = array();
|
87 |
+
$http_headers['Authorization'] = 'Basic ' . base64_encode( $this->api->client_id . ':' . $this->api->client_secret);
|
88 |
+
|
89 |
+
$response = $this->request( $this->api->token_url, http_build_query($params, '', '&'), 'POST', $http_headers );
|
90 |
+
|
91 |
+
$response = $this->parseRequestResult( $response );
|
92 |
+
|
93 |
+
if( ! $response || ! isset( $response->access_token ) ){
|
94 |
+
throw new Exception( "The Authorization Service has return: " . $response->error );
|
95 |
+
}
|
96 |
+
|
97 |
+
if( isset( $response->access_token ) ) $this->api->access_token = $response->access_token;
|
98 |
+
if( isset( $response->refresh_token ) ) $this->api->refresh_token = $response->refresh_token;
|
99 |
+
if( isset( $response->expires_in ) ) $this->api->access_token_expires_in = $response->expires_in;
|
100 |
+
|
101 |
+
// calculate when the access token expire
|
102 |
+
if( isset( $response->expires_in ) ) {
|
103 |
+
$this->api->access_token_expires_at = time() + $response->expires_in;
|
104 |
+
}
|
105 |
+
else {
|
106 |
+
$this->api->access_token_expires_at = time() + 3600;
|
107 |
+
}
|
108 |
+
|
109 |
+
return $response;
|
110 |
+
}
|
111 |
+
|
112 |
+
private function request( $url, $params = array(), $type="GET", $http_headers = null )
|
113 |
+
{
|
114 |
+
if( $type == "GET" ){
|
115 |
+
$url = $url . ( strpos( $url, '?' ) ? '&' : '?' ) . http_build_query($params, '', '&');
|
116 |
+
}
|
117 |
+
|
118 |
+
$this->http_info = array();
|
119 |
+
$ch = curl_init();
|
120 |
+
|
121 |
+
curl_setopt($ch, CURLOPT_URL , $url );
|
122 |
+
curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1 );
|
123 |
+
curl_setopt($ch, CURLOPT_TIMEOUT , $this->api->curl_time_out );
|
124 |
+
curl_setopt($ch, CURLOPT_USERAGENT , $this->api->curl_useragent );
|
125 |
+
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT , $this->api->curl_connect_time_out );
|
126 |
+
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER , $this->api->curl_ssl_verifypeer );
|
127 |
+
curl_setopt($ch, CURLOPT_HTTPHEADER , $this->api->curl_header );
|
128 |
+
|
129 |
+
if (is_array($http_headers)) {
|
130 |
+
$header = array();
|
131 |
+
foreach($http_headers as $key => $parsed_urlvalue) {
|
132 |
+
$header[] = "$key: $parsed_urlvalue";
|
133 |
+
}
|
134 |
+
|
135 |
+
curl_setopt($ch, CURLOPT_HTTPHEADER, $header );
|
136 |
+
}
|
137 |
+
else{
|
138 |
+
curl_setopt($ch, CURLOPT_HTTPHEADER, $this->api->curl_header );
|
139 |
+
}
|
140 |
+
|
141 |
+
if($this->api->curl_proxy){
|
142 |
+
curl_setopt( $ch, CURLOPT_PROXY , $this->api->curl_proxy);
|
143 |
+
}
|
144 |
+
|
145 |
+
if( $type == "POST" ){
|
146 |
+
curl_setopt($ch, CURLOPT_POST, 1);
|
147 |
+
if($params) curl_setopt( $ch, CURLOPT_POSTFIELDS, $params );
|
148 |
+
}
|
149 |
+
|
150 |
+
$response = curl_exec($ch);
|
151 |
+
|
152 |
+
$this->http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
153 |
+
$this->http_info = array_merge($this->http_info, curl_getinfo($ch));
|
154 |
+
|
155 |
+
curl_close ($ch);
|
156 |
+
|
157 |
+
return $response;
|
158 |
+
}
|
159 |
+
|
160 |
+
private function parseRequestResult( $result )
|
161 |
+
{
|
162 |
+
if( json_decode( $result ) ) return json_decode( $result );
|
163 |
+
|
164 |
+
parse_str( $result, $output );
|
165 |
+
|
166 |
+
$result = new StdClass();
|
167 |
+
|
168 |
+
foreach( $output as $k => $v )
|
169 |
+
$result->$k = $v;
|
170 |
+
|
171 |
+
return $result;
|
172 |
+
}
|
173 |
+
|
174 |
+
/**
|
175 |
+
* load the user profile from the IDp api client
|
176 |
+
*
|
177 |
+
* https://github.com/reddit/reddit/wiki/OAuth2
|
178 |
+
* https://github.com/adoy/PHP-OAuth2/blob/master/src/OAuth2/Client.php#L315
|
179 |
+
*/
|
180 |
+
function getUserProfile()
|
181 |
+
{
|
182 |
+
$http_headers = array();
|
183 |
+
$http_headers['Authorization'] = 'Bearer ' . $this->api->access_token;
|
184 |
+
|
185 |
+
$response = $this->request( "https://oauth.reddit.com/api/v1/me.json?access_token=" . $this->api->access_token, array(), 'GET', $http_headers );
|
186 |
+
|
187 |
+
$response = $this->parseRequestResult( $response );
|
188 |
+
|
189 |
+
if ( ! $response || ! isset( $response->name ) ){
|
190 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
191 |
+
}
|
192 |
+
|
193 |
+
$this->user->profile->identifier = @ $response->name;
|
194 |
+
$this->user->profile->displayName = @ $response->name;
|
195 |
+
$this->user->profile->profileURL = "https://www.reddit.com/user/" . $this->user->profile->identifier . "/";
|
196 |
+
|
197 |
+
if( $this->user->profile->identifier ){
|
198 |
+
return $this->user->profile;
|
199 |
+
}
|
200 |
+
}
|
201 |
+
}
|
hybridauth/Hybrid/Providers/Skyrock.php
CHANGED
@@ -1,198 +1,198 @@
|
|
1 |
-
<?php
|
2 |
-
/*!
|
3 |
-
* HybridAuth Skyrock Provider
|
4 |
-
*
|
5 |
-
*
|
6 |
-
* http://hybridauth.sourceforge.net | https://github.com/hybridauth/hybridauth
|
7 |
-
* (c) 2009-2012 HybridAuth authors | hybridauth.sourceforge.net/licenses.html
|
8 |
-
*
|
9 |
-
*
|
10 |
-
*/
|
11 |
-
|
12 |
-
/**
|
13 |
-
* Hybrid_Providers_Skyrock provider adapter based on OAuth1 protocol
|
14 |
-
*/
|
15 |
-
class Hybrid_Providers_Skyrock extends Hybrid_Provider_Model_OAuth1
|
16 |
-
{
|
17 |
-
/**
|
18 |
-
* IDp wrappers initializer
|
19 |
-
*/
|
20 |
-
function initialize()
|
21 |
-
{
|
22 |
-
parent::initialize();
|
23 |
-
|
24 |
-
// provider api end-points
|
25 |
-
$this->api->api_base_url = "https://api.skyrock.com/v2/";
|
26 |
-
$this->api->authorize_url = "https://api.skyrock.com/v2/oauth/authenticate";
|
27 |
-
$this->api->request_token_url = "https://api.skyrock.com/v2/oauth/initiate";
|
28 |
-
$this->api->access_token_url = "https://api.skyrock.com/v2/oauth/token";
|
29 |
-
|
30 |
-
$this->api->curl_auth_header = false;
|
31 |
-
}
|
32 |
-
|
33 |
-
/**
|
34 |
-
* load the user profile from the IDp api client
|
35 |
-
*/
|
36 |
-
function getUserProfile()
|
37 |
-
{
|
38 |
-
$response = $this->api->get( 'user/get.json' );
|
39 |
-
|
40 |
-
// check the last HTTP status code returned
|
41 |
-
if ( $this->api->http_code != 200 )
|
42 |
-
{
|
43 |
-
throw new Exception( "User profile request failed! {$this->providerId} returned an error: " . $this->errorMessageByStatus( $this->api->http_code ), 6 );
|
44 |
-
}
|
45 |
-
|
46 |
-
if ( ! is_object( $response ) || ! isset( $response->id_user ) ){
|
47 |
-
throw new Exception( "User profile request failed! {$this->providerId} api returned an invalid response.", 6 );
|
48 |
-
}
|
49 |
-
|
50 |
-
# store the user profile.
|
51 |
-
$this->user->profile->identifier = (property_exists($response,'id_user'))?$response->id_user:"";
|
52 |
-
$this->user->profile->displayName = (property_exists($response,'username'))?$response->username:"";
|
53 |
-
$this->user->profile->profileURL = (property_exists($response,'user_url'))?$response->user_url:"";
|
54 |
-
$this->user->profile->photoURL = (property_exists($response,'avatar_url'))?$response->avatar_url:"";
|
55 |
-
//unknown $this->user->profile->description = (property_exists($response,'description'))?$response->description:"";
|
56 |
-
$this->user->profile->firstName = (property_exists($response,'firstname'))?$response->firstname:"";
|
57 |
-
$this->user->profile->lastName = (property_exists($response,'name'))?$response->name:"";
|
58 |
-
|
59 |
-
if( property_exists($response,'gender') ) {
|
60 |
-
if( $response->gender == 1 ){
|
61 |
-
$this->user->profile->gender = "male";
|
62 |
-
}
|
63 |
-
elseif( $response->gender == 2 ){
|
64 |
-
$this->user->profile->gender = "female";
|
65 |
-
}
|
66 |
-
else{
|
67 |
-
$this->user->profile->gender = "";
|
68 |
-
}
|
69 |
-
}
|
70 |
-
|
71 |
-
$this->user->profile->language = (property_exists($response,'lang'))?$response->lang:"";
|
72 |
-
|
73 |
-
if( property_exists( $response,'birth_date' ) && $response->birth_date ) {
|
74 |
-
$birthday = date_parse($response->birth_date);
|
75 |
-
$this->user->profile->birthDay = $birthday["day"];
|
76 |
-
$this->user->profile->birthMonth = $birthday["month"];
|
77 |
-
$this->user->profile->birthYear = $birthday["year"];
|
78 |
-
}
|
79 |
-
|
80 |
-
$this->user->profile->email = (property_exists($response,'email'))?$response->email:"";
|
81 |
-
$this->user->profile->emailVerified = (property_exists($response,'email'))?$response->email:"";
|
82 |
-
|
83 |
-
//unknown $this->user->profile->phone = (property_exists($response,'unknown'))?$response->unknown:"";
|
84 |
-
$this->user->profile->address = (property_exists($response,'address1'))?$response->address1:"";
|
85 |
-
$this->user->profile->address .= (property_exists($response,'address2'))?$response->address2:"";
|
86 |
-
$this->user->profile->country = (property_exists($response,'country'))?$response->country:"";
|
87 |
-
//unknown $this->user->profile->region = (property_exists($response,'unknown'))?$response->unknown:"";
|
88 |
-
$this->user->profile->city = (property_exists($response,'city'))?$response->city:"";
|
89 |
-
$this->user->profile->zip = (property_exists($response,'postalcode'))?$response->postalcode:"";
|
90 |
-
|
91 |
-
return $this->user->profile;
|
92 |
-
}
|
93 |
-
|
94 |
-
/**
|
95 |
-
* load the current user contacts
|
96 |
-
*/
|
97 |
-
function getUserContacts()
|
98 |
-
{
|
99 |
-
$parameters = array( 'page' => 1 );
|
100 |
-
$response = $this->api->get( 'user/list_friends.json', $parameters );
|
101 |
-
|
102 |
-
// check the last HTTP status code returned
|
103 |
-
if ( $this->api->http_code != 200 ){
|
104 |
-
throw new Exception( "User contacts request failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ) );
|
105 |
-
}
|
106 |
-
|
107 |
-
if( ! $response || ! count( $response->friends ) ){
|
108 |
-
return ARRAY();
|
109 |
-
}
|
110 |
-
|
111 |
-
$max_page = (property_exists($response,'max_page'))?$response->max_page:1;
|
112 |
-
for ($i = 0; $i<$max_page; $i++) {
|
113 |
-
if( $i > 0 ) {
|
114 |
-
$parameters = array( 'page' => $i );
|
115 |
-
$response = $this->api->get( 'user/list_friends.json', $parameters );
|
116 |
-
// check the last HTTP status code returned
|
117 |
-
if ( $this->api->http_code != 200 ){
|
118 |
-
throw new Exception( "User contacts request failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ) );
|
119 |
-
}
|
120 |
-
}
|
121 |
-
|
122 |
-
if( $response && count( $response->friends ) ){
|
123 |
-
foreach( $response->friends as $item ){
|
124 |
-
$uc = new Hybrid_User_Contact();
|
125 |
-
|
126 |
-
$uc->identifier = (property_exists($item,'id_user'))?$item->id_user:"";
|
127 |
-
$uc->displayName = (property_exists($item,'username'))?$item->username:"";
|
128 |
-
$uc->profileURL = (property_exists($item,'user_url'))?$item->user_url:"";
|
129 |
-
$uc->photoURL = (property_exists($item,'avatar_url'))?$item->avatar_url:"";
|
130 |
-
//$uc->description = (property_exists($item,'description'))?$item->description:"";
|
131 |
-
|
132 |
-
$contacts[] = $uc;
|
133 |
-
}
|
134 |
-
}
|
135 |
-
}
|
136 |
-
|
137 |
-
return $contacts;
|
138 |
-
}
|
139 |
-
|
140 |
-
/**
|
141 |
-
* return the user activity stream
|
142 |
-
*/
|
143 |
-
function getUserActivity( $stream )
|
144 |
-
{
|
145 |
-
if( $stream == "me" ){
|
146 |
-
$response = $this->api->get( 'newsfeed/list_events.json?events_category=own' );
|
147 |
-
}
|
148 |
-
else{
|
149 |
-
$response = $this->api->get( 'newsfeed/list_events.json?events_category=friends' );
|
150 |
-
}
|
151 |
-
|
152 |
-
// check the last HTTP status code returned
|
153 |
-
if ( $this->api->http_code != 200 ){
|
154 |
-
throw new Exception( "User activity stream request failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ) );
|
155 |
-
}
|
156 |
-
|
157 |
-
if( ! $response ){
|
158 |
-
return ARRAY();
|
159 |
-
}
|
160 |
-
|
161 |
-
$activities = ARRAY();
|
162 |
-
|
163 |
-
foreach( $response as $item ){
|
164 |
-
$ua = new Hybrid_User_Activity();
|
165 |
-
|
166 |
-
$ua->id = (property_exists($item,'id_event'))?$item->id_event:"";
|
167 |
-
$ua->date = (property_exists($item,'timestamp'))?$item->timestamp:"";
|
168 |
-
$ua->text = (property_exists($item,'content'))?$item->content:"";
|
169 |
-
$ua->text = ($ua->text)?trim(strip_tags($ua->text)):"";
|
170 |
-
|
171 |
-
$ua->user->identifier = (property_exists($item->from,'id_user'))?$item->from->id_user:"";
|
172 |
-
$ua->user->displayName = (property_exists($item->from,'username'))?$item->from->username:"";
|
173 |
-
$ua->user->profileURL = (property_exists($item->from,'user_url'))?$item->from->user_url:"";
|
174 |
-
$ua->user->photoURL = (property_exists($item->from,'avatar_url'))?$item->from->avatar_url:"";
|
175 |
-
|
176 |
-
$activities[] = $ua;
|
177 |
-
}
|
178 |
-
|
179 |
-
return $activities;
|
180 |
-
}
|
181 |
-
|
182 |
-
|
183 |
-
/**
|
184 |
-
* update user status
|
185 |
-
*/
|
186 |
-
function setUserStatus( $status )
|
187 |
-
{
|
188 |
-
$parameters = array( 'message' => $status );
|
189 |
-
$response = $this->api->post( 'mood/set_mood.json', $parameters );
|
190 |
-
|
191 |
-
// check the last HTTP status code returned
|
192 |
-
if ( $this->api->http_code != 200 ){
|
193 |
-
throw new Exception( "Update user status failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ) );
|
194 |
-
}
|
195 |
-
}
|
196 |
-
|
197 |
-
}
|
198 |
-
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* HybridAuth Skyrock Provider
|
4 |
+
*
|
5 |
+
*
|
6 |
+
* http://hybridauth.sourceforge.net | https://github.com/hybridauth/hybridauth
|
7 |
+
* (c) 2009-2012 HybridAuth authors | hybridauth.sourceforge.net/licenses.html
|
8 |
+
*
|
9 |
+
*
|
10 |
+
*/
|
11 |
+
|
12 |
+
/**
|
13 |
+
* Hybrid_Providers_Skyrock provider adapter based on OAuth1 protocol
|
14 |
+
*/
|
15 |
+
class Hybrid_Providers_Skyrock extends Hybrid_Provider_Model_OAuth1
|
16 |
+
{
|
17 |
+
/**
|
18 |
+
* IDp wrappers initializer
|
19 |
+
*/
|
20 |
+
function initialize()
|
21 |
+
{
|
22 |
+
parent::initialize();
|
23 |
+
|
24 |
+
// provider api end-points
|
25 |
+
$this->api->api_base_url = "https://api.skyrock.com/v2/";
|
26 |
+
$this->api->authorize_url = "https://api.skyrock.com/v2/oauth/authenticate";
|
27 |
+
$this->api->request_token_url = "https://api.skyrock.com/v2/oauth/initiate";
|
28 |
+
$this->api->access_token_url = "https://api.skyrock.com/v2/oauth/token";
|
29 |
+
|
30 |
+
$this->api->curl_auth_header = false;
|
31 |
+
}
|
32 |
+
|
33 |
+
/**
|
34 |
+
* load the user profile from the IDp api client
|
35 |
+
*/
|
36 |
+
function getUserProfile()
|
37 |
+
{
|
38 |
+
$response = $this->api->get( 'user/get.json' );
|
39 |
+
|
40 |
+
// check the last HTTP status code returned
|
41 |
+
if ( $this->api->http_code != 200 )
|
42 |
+
{
|
43 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an error: " . $this->errorMessageByStatus( $this->api->http_code ), 6 );
|
44 |
+
}
|
45 |
+
|
46 |
+
if ( ! is_object( $response ) || ! isset( $response->id_user ) ){
|
47 |
+
throw new Exception( "User profile request failed! {$this->providerId} api returned an invalid response.", 6 );
|
48 |
+
}
|
49 |
+
|
50 |
+
# store the user profile.
|
51 |
+
$this->user->profile->identifier = (property_exists($response,'id_user'))?$response->id_user:"";
|
52 |
+
$this->user->profile->displayName = (property_exists($response,'username'))?$response->username:"";
|
53 |
+
$this->user->profile->profileURL = (property_exists($response,'user_url'))?$response->user_url:"";
|
54 |
+
$this->user->profile->photoURL = (property_exists($response,'avatar_url'))?$response->avatar_url:"";
|
55 |
+
//unknown $this->user->profile->description = (property_exists($response,'description'))?$response->description:"";
|
56 |
+
$this->user->profile->firstName = (property_exists($response,'firstname'))?$response->firstname:"";
|
57 |
+
$this->user->profile->lastName = (property_exists($response,'name'))?$response->name:"";
|
58 |
+
|
59 |
+
if( property_exists($response,'gender') ) {
|
60 |
+
if( $response->gender == 1 ){
|
61 |
+
$this->user->profile->gender = "male";
|
62 |
+
}
|
63 |
+
elseif( $response->gender == 2 ){
|
64 |
+
$this->user->profile->gender = "female";
|
65 |
+
}
|
66 |
+
else{
|
67 |
+
$this->user->profile->gender = "";
|
68 |
+
}
|
69 |
+
}
|
70 |
+
|
71 |
+
$this->user->profile->language = (property_exists($response,'lang'))?$response->lang:"";
|
72 |
+
|
73 |
+
if( property_exists( $response,'birth_date' ) && $response->birth_date ) {
|
74 |
+
$birthday = date_parse($response->birth_date);
|
75 |
+
$this->user->profile->birthDay = $birthday["day"];
|
76 |
+
$this->user->profile->birthMonth = $birthday["month"];
|
77 |
+
$this->user->profile->birthYear = $birthday["year"];
|
78 |
+
}
|
79 |
+
|
80 |
+
$this->user->profile->email = (property_exists($response,'email'))?$response->email:"";
|
81 |
+
$this->user->profile->emailVerified = (property_exists($response,'email'))?$response->email:"";
|
82 |
+
|
83 |
+
//unknown $this->user->profile->phone = (property_exists($response,'unknown'))?$response->unknown:"";
|
84 |
+
$this->user->profile->address = (property_exists($response,'address1'))?$response->address1:"";
|
85 |
+
$this->user->profile->address .= (property_exists($response,'address2'))?$response->address2:"";
|
86 |
+
$this->user->profile->country = (property_exists($response,'country'))?$response->country:"";
|
87 |
+
//unknown $this->user->profile->region = (property_exists($response,'unknown'))?$response->unknown:"";
|
88 |
+
$this->user->profile->city = (property_exists($response,'city'))?$response->city:"";
|
89 |
+
$this->user->profile->zip = (property_exists($response,'postalcode'))?$response->postalcode:"";
|
90 |
+
|
91 |
+
return $this->user->profile;
|
92 |
+
}
|
93 |
+
|
94 |
+
/**
|
95 |
+
* load the current user contacts
|
96 |
+
*/
|
97 |
+
function getUserContacts()
|
98 |
+
{
|
99 |
+
$parameters = array( 'page' => 1 );
|
100 |
+
$response = $this->api->get( 'user/list_friends.json', $parameters );
|
101 |
+
|
102 |
+
// check the last HTTP status code returned
|
103 |
+
if ( $this->api->http_code != 200 ){
|
104 |
+
throw new Exception( "User contacts request failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ) );
|
105 |
+
}
|
106 |
+
|
107 |
+
if( ! $response || ! count( $response->friends ) ){
|
108 |
+
return ARRAY();
|
109 |
+
}
|
110 |
+
|
111 |
+
$max_page = (property_exists($response,'max_page'))?$response->max_page:1;
|
112 |
+
for ($i = 0; $i<$max_page; $i++) {
|
113 |
+
if( $i > 0 ) {
|
114 |
+
$parameters = array( 'page' => $i );
|
115 |
+
$response = $this->api->get( 'user/list_friends.json', $parameters );
|
116 |
+
// check the last HTTP status code returned
|
117 |
+
if ( $this->api->http_code != 200 ){
|
118 |
+
throw new Exception( "User contacts request failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ) );
|
119 |
+
}
|
120 |
+
}
|
121 |
+
|
122 |
+
if( $response && count( $response->friends ) ){
|
123 |
+
foreach( $response->friends as $item ){
|
124 |
+
$uc = new Hybrid_User_Contact();
|
125 |
+
|
126 |
+
$uc->identifier = (property_exists($item,'id_user'))?$item->id_user:"";
|
127 |
+
$uc->displayName = (property_exists($item,'username'))?$item->username:"";
|
128 |
+
$uc->profileURL = (property_exists($item,'user_url'))?$item->user_url:"";
|
129 |
+
$uc->photoURL = (property_exists($item,'avatar_url'))?$item->avatar_url:"";
|
130 |
+
//$uc->description = (property_exists($item,'description'))?$item->description:"";
|
131 |
+
|
132 |
+
$contacts[] = $uc;
|
133 |
+
}
|
134 |
+
}
|
135 |
+
}
|
136 |
+
|
137 |
+
return $contacts;
|
138 |
+
}
|
139 |
+
|
140 |
+
/**
|
141 |
+
* return the user activity stream
|
142 |
+
*/
|
143 |
+
function getUserActivity( $stream )
|
144 |
+
{
|
145 |
+
if( $stream == "me" ){
|
146 |
+
$response = $this->api->get( 'newsfeed/list_events.json?events_category=own' );
|
147 |
+
}
|
148 |
+
else{
|
149 |
+
$response = $this->api->get( 'newsfeed/list_events.json?events_category=friends' );
|
150 |
+
}
|
151 |
+
|
152 |
+
// check the last HTTP status code returned
|
153 |
+
if ( $this->api->http_code != 200 ){
|
154 |
+
throw new Exception( "User activity stream request failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ) );
|
155 |
+
}
|
156 |
+
|
157 |
+
if( ! $response ){
|
158 |
+
return ARRAY();
|
159 |
+
}
|
160 |
+
|
161 |
+
$activities = ARRAY();
|
162 |
+
|
163 |
+
foreach( $response as $item ){
|
164 |
+
$ua = new Hybrid_User_Activity();
|
165 |
+
|
166 |
+
$ua->id = (property_exists($item,'id_event'))?$item->id_event:"";
|
167 |
+
$ua->date = (property_exists($item,'timestamp'))?$item->timestamp:"";
|
168 |
+
$ua->text = (property_exists($item,'content'))?$item->content:"";
|
169 |
+
$ua->text = ($ua->text)?trim(strip_tags($ua->text)):"";
|
170 |
+
|
171 |
+
$ua->user->identifier = (property_exists($item->from,'id_user'))?$item->from->id_user:"";
|
172 |
+
$ua->user->displayName = (property_exists($item->from,'username'))?$item->from->username:"";
|
173 |
+
$ua->user->profileURL = (property_exists($item->from,'user_url'))?$item->from->user_url:"";
|
174 |
+
$ua->user->photoURL = (property_exists($item->from,'avatar_url'))?$item->from->avatar_url:"";
|
175 |
+
|
176 |
+
$activities[] = $ua;
|
177 |
+
}
|
178 |
+
|
179 |
+
return $activities;
|
180 |
+
}
|
181 |
+
|
182 |
+
|
183 |
+
/**
|
184 |
+
* update user status
|
185 |
+
*/
|
186 |
+
function setUserStatus( $status )
|
187 |
+
{
|
188 |
+
$parameters = array( 'message' => $status );
|
189 |
+
$response = $this->api->post( 'mood/set_mood.json', $parameters );
|
190 |
+
|
191 |
+
// check the last HTTP status code returned
|
192 |
+
if ( $this->api->http_code != 200 ){
|
193 |
+
throw new Exception( "Update user status failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ) );
|
194 |
+
}
|
195 |
+
}
|
196 |
+
|
197 |
+
}
|
198 |
+
|
hybridauth/Hybrid/Providers/Stackoverflow.php
CHANGED
@@ -1,5 +1,5 @@
|
|
1 |
-
<?php
|
2 |
-
class Hybrid_Providers_Stackoverflow extends Hybrid_Provider_Model_OpenID
|
3 |
-
{
|
4 |
-
var $openidIdentifier = "https://openid.stackexchange.com/";
|
5 |
}
|
1 |
+
<?php
|
2 |
+
class Hybrid_Providers_Stackoverflow extends Hybrid_Provider_Model_OpenID
|
3 |
+
{
|
4 |
+
var $openidIdentifier = "https://openid.stackexchange.com/";
|
5 |
}
|
hybridauth/Hybrid/Providers/Steam.php
CHANGED
@@ -1,122 +1,122 @@
|
|
1 |
-
<?php
|
2 |
-
/*!
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Hybrid_Providers_Steam provider adapter based on OpenID protocol
|
10 |
-
*
|
11 |
-
* http://hybridauth.sourceforge.net/userguide/IDProvider_info_Steam.html
|
12 |
-
*
|
13 |
-
* This class has been entirely reworked for the new Steam API (http://steamcommunity.com/dev)
|
14 |
-
*/
|
15 |
-
class Hybrid_Providers_Steam extends Hybrid_Provider_Model_OpenID
|
16 |
-
{
|
17 |
-
var $openidIdentifier = "http://steamcommunity.com/openid";
|
18 |
-
|
19 |
-
/**
|
20 |
-
* finish login step
|
21 |
-
*/
|
22 |
-
function loginFinish()
|
23 |
-
{
|
24 |
-
parent::loginFinish();
|
25 |
-
|
26 |
-
$this->user->profile->identifier = str_ireplace( "http://steamcommunity.com/openid/id/", "", $this->user->profile->identifier );
|
27 |
-
|
28 |
-
if( ! $this->user->profile->identifier )
|
29 |
-
{
|
30 |
-
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid user ID.", 5 );
|
31 |
-
}
|
32 |
-
|
33 |
-
// if api key is provided, we attempt to use steam web api
|
34 |
-
if( isset( Hybrid_Auth::$config['providers']['Steam']['keys']['key'] ) && Hybrid_Auth::$config['providers']['Steam']['keys']['key'] )
|
35 |
-
{
|
36 |
-
$userProfile = $this->getUserProfileWebAPI( Hybrid_Auth::$config['providers']['Steam']['keys']['key'] );
|
37 |
-
}
|
38 |
-
|
39 |
-
// otherwise we fallback to community data
|
40 |
-
else
|
41 |
-
{
|
42 |
-
$userProfile = $this->getUserProfileLegacyAPI();
|
43 |
-
}
|
44 |
-
|
45 |
-
// fetch user profile
|
46 |
-
foreach( $userProfile as $k => $v )
|
47 |
-
{
|
48 |
-
$this->user->profile->$k = $v ? $v : $this->user->profile->$k;
|
49 |
-
}
|
50 |
-
|
51 |
-
// store user profile
|
52 |
-
Hybrid_Auth::storage()->set( "hauth_session.{$this->providerId}.user", $this->user );
|
53 |
-
}
|
54 |
-
|
55 |
-
function getUserProfileWebAPI( $apiKey )
|
56 |
-
{
|
57 |
-
$apiUrl = 'http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=' . $apiKey . '&steamids=' . $this->user->profile->identifier;
|
58 |
-
|
59 |
-
$data = $this->httpRequest( $apiUrl );
|
60 |
-
$data = json_decode( $data['response'] );
|
61 |
-
|
62 |
-
// not sure if correct
|
63 |
-
$data = isset( $data->response->players[0] ) ? $data->response->players[0] : null;
|
64 |
-
|
65 |
-
$userProfile = array();
|
66 |
-
|
67 |
-
$userProfile['displayName'] = property_exists( $data, 'personaname' ) ? $data->personaname : '';
|
68 |
-
$userProfile['firstName' ] = property_exists( $data, 'realname' ) ? $data->realname : '';
|
69 |
-
$userProfile['photoURL' ] = property_exists( $data, 'avatarfull' ) ? $data->avatarfull : '';
|
70 |
-
$userProfile['profileURL' ] = property_exists( $data, 'profileurl' ) ? $data->profileurl : '';
|
71 |
-
$userProfile['country' ] = property_exists( $data, 'loccountrycode') ? $data->loccountrycode : '';
|
72 |
-
|
73 |
-
return $userProfile;
|
74 |
-
}
|
75 |
-
|
76 |
-
function getUserProfileLegacyAPI()
|
77 |
-
{
|
78 |
-
$apiUrl = 'http://steamcommunity.com/profiles/' . $this->user->profile->identifier . '/?xml=1';
|
79 |
-
|
80 |
-
$data = $this->httpRequest( $apiUrl );
|
81 |
-
$data = @ new SimpleXMLElement( $data['response'] );
|
82 |
-
|
83 |
-
$userProfile = array();
|
84 |
-
|
85 |
-
$userProfile['displayName' ] = property_exists( $data, 'steamID' ) ? (string) $data->steamID : '';
|
86 |
-
$userProfile['firstName' ] = property_exists( $data, 'realname' ) ? (string) $data->realname : '';
|
87 |
-
$userProfile['photoURL' ] = property_exists( $data, 'avatarFull' ) ? (string) $data->avatarFull : '';
|
88 |
-
$userProfile['description' ] = property_exists( $data, 'summary' ) ? (string) $data->summary : '';
|
89 |
-
$userProfile['region' ] = property_exists( $data, 'location' ) ? (string) $data->location : '';
|
90 |
-
$userProfile['profileURL' ] = property_exists( $data, 'customURL' )
|
91 |
-
? "http://steamcommunity.com/id/{$data->customURL}/"
|
92 |
-
: "http://steamcommunity.com/profiles/{$this->user->profile->identifier}/";
|
93 |
-
|
94 |
-
return $userProfile;
|
95 |
-
}
|
96 |
-
|
97 |
-
function httpRequest( $url )
|
98 |
-
{
|
99 |
-
$ch = curl_init();
|
100 |
-
|
101 |
-
$curl_options = array(
|
102 |
-
CURLOPT_URL => $url,
|
103 |
-
CURLOPT_RETURNTRANSFER => true,
|
104 |
-
CURLOPT_FOLLOWLOCATION => true,
|
105 |
-
CURLOPT_SSL_VERIFYHOST => false,
|
106 |
-
CURLOPT_SSL_VERIFYPEER => false,
|
107 |
-
CURLOPT_USERAGENT => "WordPress Social Login (https://wordpress.org/plugins/wordpress-social-login/)",
|
108 |
-
CURLOPT_MAXREDIRS => 3,
|
109 |
-
CURLOPT_TIMEOUT => 30
|
110 |
-
);
|
111 |
-
|
112 |
-
curl_setopt_array($ch, $curl_options);
|
113 |
-
|
114 |
-
$data = curl_exec($ch);
|
115 |
-
|
116 |
-
return array(
|
117 |
-
'response' => $data,
|
118 |
-
'info' => curl_getinfo($ch),
|
119 |
-
'error' => curl_error($ch),
|
120 |
-
);
|
121 |
-
}
|
122 |
-
}
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Hybrid_Providers_Steam provider adapter based on OpenID protocol
|
10 |
+
*
|
11 |
+
* http://hybridauth.sourceforge.net/userguide/IDProvider_info_Steam.html
|
12 |
+
*
|
13 |
+
* This class has been entirely reworked for the new Steam API (http://steamcommunity.com/dev)
|
14 |
+
*/
|
15 |
+
class Hybrid_Providers_Steam extends Hybrid_Provider_Model_OpenID
|
16 |
+
{
|
17 |
+
var $openidIdentifier = "http://steamcommunity.com/openid";
|
18 |
+
|
19 |
+
/**
|
20 |
+
* finish login step
|
21 |
+
*/
|
22 |
+
function loginFinish()
|
23 |
+
{
|
24 |
+
parent::loginFinish();
|
25 |
+
|
26 |
+
$this->user->profile->identifier = str_ireplace( "http://steamcommunity.com/openid/id/", "", $this->user->profile->identifier );
|
27 |
+
|
28 |
+
if( ! $this->user->profile->identifier )
|
29 |
+
{
|
30 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid user ID.", 5 );
|
31 |
+
}
|
32 |
+
|
33 |
+
// if api key is provided, we attempt to use steam web api
|
34 |
+
if( isset( Hybrid_Auth::$config['providers']['Steam']['keys']['key'] ) && Hybrid_Auth::$config['providers']['Steam']['keys']['key'] )
|
35 |
+
{
|
36 |
+
$userProfile = $this->getUserProfileWebAPI( Hybrid_Auth::$config['providers']['Steam']['keys']['key'] );
|
37 |
+
}
|
38 |
+
|
39 |
+
// otherwise we fallback to community data
|
40 |
+
else
|
41 |
+
{
|
42 |
+
$userProfile = $this->getUserProfileLegacyAPI();
|
43 |
+
}
|
44 |
+
|
45 |
+
// fetch user profile
|
46 |
+
foreach( $userProfile as $k => $v )
|
47 |
+
{
|
48 |
+
$this->user->profile->$k = $v ? $v : $this->user->profile->$k;
|
49 |
+
}
|
50 |
+
|
51 |
+
// store user profile
|
52 |
+
Hybrid_Auth::storage()->set( "hauth_session.{$this->providerId}.user", $this->user );
|
53 |
+
}
|
54 |
+
|
55 |
+
function getUserProfileWebAPI( $apiKey )
|
56 |
+
{
|
57 |
+
$apiUrl = 'http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=' . $apiKey . '&steamids=' . $this->user->profile->identifier;
|
58 |
+
|
59 |
+
$data = $this->httpRequest( $apiUrl );
|
60 |
+
$data = json_decode( $data['response'] );
|
61 |
+
|
62 |
+
// not sure if correct
|
63 |
+
$data = isset( $data->response->players[0] ) ? $data->response->players[0] : null;
|
64 |
+
|
65 |
+
$userProfile = array();
|
66 |
+
|
67 |
+
$userProfile['displayName'] = property_exists( $data, 'personaname' ) ? $data->personaname : '';
|
68 |
+
$userProfile['firstName' ] = property_exists( $data, 'realname' ) ? $data->realname : '';
|
69 |
+
$userProfile['photoURL' ] = property_exists( $data, 'avatarfull' ) ? $data->avatarfull : '';
|
70 |
+
$userProfile['profileURL' ] = property_exists( $data, 'profileurl' ) ? $data->profileurl : '';
|
71 |
+
$userProfile['country' ] = property_exists( $data, 'loccountrycode') ? $data->loccountrycode : '';
|
72 |
+
|
73 |
+
return $userProfile;
|
74 |
+
}
|
75 |
+
|
76 |
+
function getUserProfileLegacyAPI()
|
77 |
+
{
|
78 |
+
$apiUrl = 'http://steamcommunity.com/profiles/' . $this->user->profile->identifier . '/?xml=1';
|
79 |
+
|
80 |
+
$data = $this->httpRequest( $apiUrl );
|
81 |
+
$data = @ new SimpleXMLElement( $data['response'] );
|
82 |
+
|
83 |
+
$userProfile = array();
|
84 |
+
|
85 |
+
$userProfile['displayName' ] = property_exists( $data, 'steamID' ) ? (string) $data->steamID : '';
|
86 |
+
$userProfile['firstName' ] = property_exists( $data, 'realname' ) ? (string) $data->realname : '';
|
87 |
+
$userProfile['photoURL' ] = property_exists( $data, 'avatarFull' ) ? (string) $data->avatarFull : '';
|
88 |
+
$userProfile['description' ] = property_exists( $data, 'summary' ) ? (string) $data->summary : '';
|
89 |
+
$userProfile['region' ] = property_exists( $data, 'location' ) ? (string) $data->location : '';
|
90 |
+
$userProfile['profileURL' ] = property_exists( $data, 'customURL' )
|
91 |
+
? "http://steamcommunity.com/id/{$data->customURL}/"
|
92 |
+
: "http://steamcommunity.com/profiles/{$this->user->profile->identifier}/";
|
93 |
+
|
94 |
+
return $userProfile;
|
95 |
+
}
|
96 |
+
|
97 |
+
function httpRequest( $url )
|
98 |
+
{
|
99 |
+
$ch = curl_init();
|
100 |
+
|
101 |
+
$curl_options = array(
|
102 |
+
CURLOPT_URL => $url,
|
103 |
+
CURLOPT_RETURNTRANSFER => true,
|
104 |
+
CURLOPT_FOLLOWLOCATION => true,
|
105 |
+
CURLOPT_SSL_VERIFYHOST => false,
|
106 |
+
CURLOPT_SSL_VERIFYPEER => false,
|
107 |
+
CURLOPT_USERAGENT => "WordPress Social Login (https://wordpress.org/plugins/wordpress-social-login/)",
|
108 |
+
CURLOPT_MAXREDIRS => 3,
|
109 |
+
CURLOPT_TIMEOUT => 30
|
110 |
+
);
|
111 |
+
|
112 |
+
curl_setopt_array($ch, $curl_options);
|
113 |
+
|
114 |
+
$data = curl_exec($ch);
|
115 |
+
|
116 |
+
return array(
|
117 |
+
'response' => $data,
|
118 |
+
'info' => curl_getinfo($ch),
|
119 |
+
'error' => curl_error($ch),
|
120 |
+
);
|
121 |
+
}
|
122 |
+
}
|
hybridauth/Hybrid/Providers/Tumblr.php
CHANGED
@@ -1,79 +1,79 @@
|
|
1 |
-
<?php
|
2 |
-
/*!
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Hybrid_Providers_Tumblr
|
10 |
-
*/
|
11 |
-
class Hybrid_Providers_Tumblr extends Hybrid_Provider_Model_OAuth1
|
12 |
-
{
|
13 |
-
/**
|
14 |
-
* IDp wrappers initializer
|
15 |
-
*/
|
16 |
-
function initialize()
|
17 |
-
{
|
18 |
-
parent::initialize();
|
19 |
-
|
20 |
-
// provider api end-points
|
21 |
-
$this->api->api_base_url = "http://api.tumblr.com/v2/";
|
22 |
-
$this->api->authorize_url = "http://www.tumblr.com/oauth/authorize";
|
23 |
-
$this->api->request_token_url = "http://www.tumblr.com/oauth/request_token";
|
24 |
-
$this->api->access_token_url = "http://www.tumblr.com/oauth/access_token";
|
25 |
-
|
26 |
-
$this->api->curl_auth_header = false;
|
27 |
-
}
|
28 |
-
|
29 |
-
|
30 |
-
/**
|
31 |
-
* load the user profile from the IDp api client
|
32 |
-
*/
|
33 |
-
function getUserProfile()
|
34 |
-
{
|
35 |
-
try{
|
36 |
-
$profile = $this->api->get( 'user/info' );
|
37 |
-
|
38 |
-
foreach ( $profile->response->user->blogs as $blog ){
|
39 |
-
if( $blog->primary ){
|
40 |
-
$bloghostname = explode( '://', $blog->url );
|
41 |
-
$bloghostname = substr( $bloghostname[1], 0, -1);
|
42 |
-
|
43 |
-
// store the user primary blog base hostname
|
44 |
-
$this->token( "primary_blog" , $bloghostname );
|
45 |
-
|
46 |
-
$this->user->profile->identifier = $blog->url;
|
47 |
-
$this->user->profile->displayName = $profile->response->user->name;
|
48 |
-
$this->user->profile->profileURL = $blog->url;
|
49 |
-
$this->user->profile->webSiteURL = $blog->url;
|
50 |
-
$this->user->profile->description = strip_tags( $blog->description );
|
51 |
-
|
52 |
-
$avatar = $this->api->get( 'blog/'. $this->token( "primary_blog" ) .'/avatar' );
|
53 |
-
|
54 |
-
$this->user->profile->photoURL = $avatar->response->avatar_url;
|
55 |
-
|
56 |
-
break;
|
57 |
-
}
|
58 |
-
}
|
59 |
-
}
|
60 |
-
catch( Exception $e ){
|
61 |
-
throw new Exception( "User profile request failed! {$this->providerId} returned an error while requesting the user profile.", 6 );
|
62 |
-
}
|
63 |
-
|
64 |
-
return $this->user->profile;
|
65 |
-
}
|
66 |
-
|
67 |
-
/**
|
68 |
-
* post to tumblr
|
69 |
-
*/
|
70 |
-
function setUserStatus( $status )
|
71 |
-
{
|
72 |
-
$parameters = array( 'type' => "text", 'body' => $status );
|
73 |
-
$response = $this->api->post( "blog/" . $this->token( "primary_blog" ) . '/post', $parameters );
|
74 |
-
|
75 |
-
if ( $response->meta->status != 201 ){
|
76 |
-
throw new Exception( "Update user status failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $response->meta->status ) );
|
77 |
-
}
|
78 |
-
}
|
79 |
-
}
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Hybrid_Providers_Tumblr
|
10 |
+
*/
|
11 |
+
class Hybrid_Providers_Tumblr extends Hybrid_Provider_Model_OAuth1
|
12 |
+
{
|
13 |
+
/**
|
14 |
+
* IDp wrappers initializer
|
15 |
+
*/
|
16 |
+
function initialize()
|
17 |
+
{
|
18 |
+
parent::initialize();
|
19 |
+
|
20 |
+
// provider api end-points
|
21 |
+
$this->api->api_base_url = "http://api.tumblr.com/v2/";
|
22 |
+
$this->api->authorize_url = "http://www.tumblr.com/oauth/authorize";
|
23 |
+
$this->api->request_token_url = "http://www.tumblr.com/oauth/request_token";
|
24 |
+
$this->api->access_token_url = "http://www.tumblr.com/oauth/access_token";
|
25 |
+
|
26 |
+
$this->api->curl_auth_header = false;
|
27 |
+
}
|
28 |
+
|
29 |
+
|
30 |
+
/**
|
31 |
+
* load the user profile from the IDp api client
|
32 |
+
*/
|
33 |
+
function getUserProfile()
|
34 |
+
{
|
35 |
+
try{
|
36 |
+
$profile = $this->api->get( 'user/info' );
|
37 |
+
|
38 |
+
foreach ( $profile->response->user->blogs as $blog ){
|
39 |
+
if( $blog->primary ){
|
40 |
+
$bloghostname = explode( '://', $blog->url );
|
41 |
+
$bloghostname = substr( $bloghostname[1], 0, -1);
|
42 |
+
|
43 |
+
// store the user primary blog base hostname
|
44 |
+
$this->token( "primary_blog" , $bloghostname );
|
45 |
+
|
46 |
+
$this->user->profile->identifier = $blog->url;
|
47 |
+
$this->user->profile->displayName = $profile->response->user->name;
|
48 |
+
$this->user->profile->profileURL = $blog->url;
|
49 |
+
$this->user->profile->webSiteURL = $blog->url;
|
50 |
+
$this->user->profile->description = strip_tags( $blog->description );
|
51 |
+
|
52 |
+
$avatar = $this->api->get( 'blog/'. $this->token( "primary_blog" ) .'/avatar' );
|
53 |
+
|
54 |
+
$this->user->profile->photoURL = $avatar->response->avatar_url;
|
55 |
+
|
56 |
+
break;
|
57 |
+
}
|
58 |
+
}
|
59 |
+
}
|
60 |
+
catch( Exception $e ){
|
61 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an error while requesting the user profile.", 6 );
|
62 |
+
}
|
63 |
+
|
64 |
+
return $this->user->profile;
|
65 |
+
}
|
66 |
+
|
67 |
+
/**
|
68 |
+
* post to tumblr
|
69 |
+
*/
|
70 |
+
function setUserStatus( $status )
|
71 |
+
{
|
72 |
+
$parameters = array( 'type' => "text", 'body' => $status );
|
73 |
+
$response = $this->api->post( "blog/" . $this->token( "primary_blog" ) . '/post', $parameters );
|
74 |
+
|
75 |
+
if ( $response->meta->status != 201 ){
|
76 |
+
throw new Exception( "Update user status failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $response->meta->status ) );
|
77 |
+
}
|
78 |
+
}
|
79 |
+
}
|
hybridauth/Hybrid/Providers/TwitchTV.php
CHANGED
@@ -1,73 +1,73 @@
|
|
1 |
-
<?php
|
2 |
-
/*!
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Hybrid_Providers_TwitchTV provider adapter based on OAuth2 protocol
|
10 |
-
*
|
11 |
-
* http://hybridauth.sourceforge.net/userguide/IDProvider_info_TwitchTV.html
|
12 |
-
*/
|
13 |
-
class Hybrid_Providers_TwitchTV extends Hybrid_Provider_Model_OAuth2
|
14 |
-
{
|
15 |
-
// default permissions
|
16 |
-
public $scope = "user_read
|
17 |
-
|
18 |
-
/**
|
19 |
-
* IDp wrappers initializer
|
20 |
-
*/
|
21 |
-
function initialize()
|
22 |
-
{
|
23 |
-
parent::initialize();
|
24 |
-
|
25 |
-
// Provider apis end-points
|
26 |
-
$this->api->api_base_url = "https://api.twitch.tv/kraken/";
|
27 |
-
$this->api->authorize_url = "https://api.twitch.tv/kraken/oauth2/authorize";
|
28 |
-
$this->api->token_url = "https://api.twitch.tv/kraken/oauth2/token";
|
29 |
-
|
30 |
-
$this->api->sign_token_name = "oauth_token";
|
31 |
-
}
|
32 |
-
|
33 |
-
/**
|
34 |
-
* begin login step
|
35 |
-
*/
|
36 |
-
function loginBegin()
|
37 |
-
{
|
38 |
-
$parameters = array( "scope" => $this->scope );
|
39 |
-
$optionals = array( "scope" );
|
40 |
-
|
41 |
-
foreach ($optionals as $parameter){
|
42 |
-
if( isset( $this->config[$parameter] ) && ! empty( $this->config[$parameter] ) ){
|
43 |
-
$parameters[$parameter] = $this->config[$parameter];
|
44 |
-
}
|
45 |
-
}
|
46 |
-
|
47 |
-
Hybrid_Auth::redirect( $this->api->authorizeUrl( $parameters ) );
|
48 |
-
}
|
49 |
-
|
50 |
-
/**
|
51 |
-
* load the user profile from the IDp api client
|
52 |
-
*/
|
53 |
-
function getUserProfile()
|
54 |
-
{
|
55 |
-
$data = $this->api->api( "user" );
|
56 |
-
|
57 |
-
if ( ! isset( $data->name ) ){
|
58 |
-
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
59 |
-
}
|
60 |
-
|
61 |
-
$this->user->profile->identifier = $data->_id;
|
62 |
-
$this->user->profile->displayName = $data->display_name;
|
63 |
-
$this->user->profile->photoURL = $data->logo;
|
64 |
-
$this->user->profile->profileURL = "http://www.twitch.tv/" . $data->name;
|
65 |
-
$this->user->profile->email = $data->email;
|
66 |
-
|
67 |
-
if( ! $this->user->profile->displayName ){
|
68 |
-
$this->user->profile->displayName = $data->name;
|
69 |
-
}
|
70 |
-
|
71 |
-
return $this->user->profile;
|
72 |
-
}
|
73 |
-
}
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Hybrid_Providers_TwitchTV provider adapter based on OAuth2 protocol
|
10 |
+
*
|
11 |
+
* http://hybridauth.sourceforge.net/userguide/IDProvider_info_TwitchTV.html
|
12 |
+
*/
|
13 |
+
class Hybrid_Providers_TwitchTV extends Hybrid_Provider_Model_OAuth2
|
14 |
+
{
|
15 |
+
// default permissions
|
16 |
+
public $scope = "user_read";
|
17 |
+
|
18 |
+
/**
|
19 |
+
* IDp wrappers initializer
|
20 |
+
*/
|
21 |
+
function initialize()
|
22 |
+
{
|
23 |
+
parent::initialize();
|
24 |
+
|
25 |
+
// Provider apis end-points
|
26 |
+
$this->api->api_base_url = "https://api.twitch.tv/kraken/";
|
27 |
+
$this->api->authorize_url = "https://api.twitch.tv/kraken/oauth2/authorize";
|
28 |
+
$this->api->token_url = "https://api.twitch.tv/kraken/oauth2/token";
|
29 |
+
|
30 |
+
$this->api->sign_token_name = "oauth_token";
|
31 |
+
}
|
32 |
+
|
33 |
+
/**
|
34 |
+
* begin login step
|
35 |
+
*/
|
36 |
+
function loginBegin()
|
37 |
+
{
|
38 |
+
$parameters = array( "scope" => $this->scope );
|
39 |
+
$optionals = array( "scope" );
|
40 |
+
|
41 |
+
foreach ($optionals as $parameter){
|
42 |
+
if( isset( $this->config[$parameter] ) && ! empty( $this->config[$parameter] ) ){
|
43 |
+
$parameters[$parameter] = $this->config[$parameter];
|
44 |
+
}
|
45 |
+
}
|
46 |
+
|
47 |
+
Hybrid_Auth::redirect( $this->api->authorizeUrl( $parameters ) );
|
48 |
+
}
|
49 |
+
|
50 |
+
/**
|
51 |
+
* load the user profile from the IDp api client
|
52 |
+
*/
|
53 |
+
function getUserProfile()
|
54 |
+
{
|
55 |
+
$data = $this->api->api( "user" );
|
56 |
+
|
57 |
+
if ( ! isset( $data->name ) ){
|
58 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
59 |
+
}
|
60 |
+
|
61 |
+
$this->user->profile->identifier = $data->_id;
|
62 |
+
$this->user->profile->displayName = $data->display_name;
|
63 |
+
$this->user->profile->photoURL = $data->logo;
|
64 |
+
$this->user->profile->profileURL = "http://www.twitch.tv/" . $data->name;
|
65 |
+
$this->user->profile->email = $data->email;
|
66 |
+
|
67 |
+
if( ! $this->user->profile->displayName ){
|
68 |
+
$this->user->profile->displayName = $data->name;
|
69 |
+
}
|
70 |
+
|
71 |
+
return $this->user->profile;
|
72 |
+
}
|
73 |
+
}
|
hybridauth/Hybrid/Providers/Twitter.php
CHANGED
@@ -1,275 +1,275 @@
|
|
1 |
-
<?php
|
2 |
-
/*!
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Hybrid_Providers_Twitter provider adapter based on OAuth1 protocol
|
10 |
-
*/
|
11 |
-
class Hybrid_Providers_Twitter extends Hybrid_Provider_Model_OAuth1
|
12 |
-
{
|
13 |
-
/**
|
14 |
-
* IDp wrappers initializer
|
15 |
-
*/
|
16 |
-
function initialize()
|
17 |
-
{
|
18 |
-
parent::initialize();
|
19 |
-
|
20 |
-
// Provider api end-points
|
21 |
-
$this->api->api_base_url = "https://api.twitter.com/1.1/";
|
22 |
-
$this->api->authorize_url = "https://api.twitter.com/oauth/authenticate";
|
23 |
-
$this->api->request_token_url = "https://api.twitter.com/oauth/request_token";
|
24 |
-
$this->api->access_token_url = "https://api.twitter.com/oauth/access_token";
|
25 |
-
|
26 |
-
if ( isset( $this->config['api_version'] ) && $this->config['api_version'] ){
|
27 |
-
$this->api->api_base_url = "https://api.twitter.com/{$this->config['api_version']}/";
|
28 |
-
}
|
29 |
-
|
30 |
-
if ( isset( $this->config['authorize'] ) && $this->config['authorize'] ){
|
31 |
-
$this->api->authorize_url = "https://api.twitter.com/oauth/authorize";
|
32 |
-
}
|
33 |
-
|
34 |
-
$this->api->curl_auth_header = false;
|
35 |
-
}
|
36 |
-
|
37 |
-
/**
|
38 |
-
* begin login step
|
39 |
-
*/
|
40 |
-
function loginBegin()
|
41 |
-
{
|
42 |
-
// Initiate the Reverse Auth flow; cf. https://dev.twitter.com/docs/ios/using-reverse-auth
|
43 |
-
if (isset($_REQUEST['reverse_auth']) && ($_REQUEST['reverse_auth'] == 'yes')){
|
44 |
-
$stage1 = $this->api->signedRequest( $this->api->request_token_url, 'POST', array( 'x_auth_mode' => 'reverse_auth' ) );
|
45 |
-
if ( $this->api->http_code != 200 ){
|
46 |
-
throw new Exception( "Authentication failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ), 5 );
|
47 |
-
}
|
48 |
-
$responseObj = array( 'x_reverse_auth_parameters' => $stage1, 'x_reverse_auth_target' => $this->config["keys"]["key"] );
|
49 |
-
$response = json_encode($responseObj);
|
50 |
-
header( "Content-Type: application/json", true, 200 ) ;
|
51 |
-
echo $response;
|
52 |
-
die();
|
53 |
-
}
|
54 |
-
$tokens = $this->api->requestToken( $this->endpoint );
|
55 |
-
|
56 |
-
// request tokens as received from provider
|
57 |
-
$this->request_tokens_raw = $tokens;
|
58 |
-
|
59 |
-
// check the last HTTP status code returned
|
60 |
-
if ( $this->api->http_code != 200 ){
|
61 |
-
if( ( time() < strtotime( $this->api->http_header['date'] )-300 || time() > strtotime( $this->api->http_header['date'] )+300 ) ){
|
62 |
-
|
63 |
-
throw new Exception( "Authentication failed! Your server time is not in sync with the {$this->providerId} servers. Acceptable timestamps: " . $this->api->http_header['date'], 5 );
|
64 |
-
}
|
65 |
-
|
66 |
-
throw new Exception( "Authentication failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ), 5 );
|
67 |
-
}
|
68 |
-
|
69 |
-
if ( ! isset( $tokens["oauth_token"] ) ){
|
70 |
-
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid oauth_token.", 5 );
|
71 |
-
}
|
72 |
-
|
73 |
-
$this->token( "request_token" , $tokens["oauth_token"] );
|
74 |
-
$this->token( "request_token_secret", $tokens["oauth_token_secret"] );
|
75 |
-
|
76 |
-
// redirect the user to the provider authentication url with force_login
|
77 |
-
if ( ( isset( $this->config['force_login'] ) && $this->config['force_login'] ) || ( isset( $this->config[ 'force' ] ) && $this->config[ 'force' ] === true ) ){
|
78 |
-
Hybrid_Auth::redirect( $this->api->authorizeUrl( $tokens, array( 'force_login' => true ) ) );
|
79 |
-
}
|
80 |
-
|
81 |
-
// else, redirect the user to the provider authentication url
|
82 |
-
Hybrid_Auth::redirect( $this->api->authorizeUrl( $tokens ) );
|
83 |
-
}
|
84 |
-
|
85 |
-
/**
|
86 |
-
* finish login step
|
87 |
-
*/
|
88 |
-
function loginFinish()
|
89 |
-
{
|
90 |
-
// in case we are completing a Reverse Auth flow; cf. https://dev.twitter.com/docs/ios/using-reverse-auth
|
91 |
-
if(isset($_REQUEST['oauth_token_secret'])){
|
92 |
-
$tokens = $_REQUEST;
|
93 |
-
$this->access_tokens_raw = $tokens;
|
94 |
-
|
95 |
-
// we should have an access_token unless something has gone wrong
|
96 |
-
if ( ! isset( $tokens["oauth_token"] ) ){
|
97 |
-
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid oauth_token.", 5 );
|
98 |
-
}
|
99 |
-
|
100 |
-
// Get rid of tokens we don't need
|
101 |
-
$this->deleteToken( "request_token" );
|
102 |
-
$this->deleteToken( "request_token_secret" );
|
103 |
-
|
104 |
-
// Store access_token and secret for later use
|
105 |
-
$this->token( "access_token" , $tokens['oauth_token'] );
|
106 |
-
$this->token( "access_token_secret" , $tokens['oauth_token_secret'] );
|
107 |
-
|
108 |
-
// set user as logged in to the current provider
|
109 |
-
$this->setUserConnected();
|
110 |
-
return;
|
111 |
-
}
|
112 |
-
parent::loginFinish();
|
113 |
-
}
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
$this->user->profile->
|
134 |
-
$this->user->profile->
|
135 |
-
$this->user->profile->
|
136 |
-
$this->user->profile->
|
137 |
-
$this->user->profile->
|
138 |
-
$this->user->profile->
|
139 |
-
$this->user->profile->
|
140 |
-
|
141 |
-
|
142 |
-
return $this->user->profile;
|
143 |
-
}
|
144 |
-
|
145 |
-
/**
|
146 |
-
* load the user contacts
|
147 |
-
*/
|
148 |
-
function getUserContacts()
|
149 |
-
{
|
150 |
-
$parameters = array( 'cursor' => '-1' );
|
151 |
-
$response = $this->api->get( 'friends/ids.json', $parameters );
|
152 |
-
|
153 |
-
// check the last HTTP status code returned
|
154 |
-
if ( $this->api->http_code != 200 ){
|
155 |
-
throw new Exception( "User contacts request failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ) );
|
156 |
-
}
|
157 |
-
|
158 |
-
if( ! $response || ! count( $response->ids ) ){
|
159 |
-
return ARRAY();
|
160 |
-
}
|
161 |
-
|
162 |
-
// 75 id per time should be okey
|
163 |
-
$contactsids = array_chunk ( $response->ids, 75 );
|
164 |
-
|
165 |
-
$contacts = ARRAY();
|
166 |
-
|
167 |
-
foreach( $contactsids as $chunk ){
|
168 |
-
$parameters = array( 'user_id' => implode( ",", $chunk ) );
|
169 |
-
$response = $this->api->get( 'users/lookup.json', $parameters );
|
170 |
-
|
171 |
-
// check the last HTTP status code returned
|
172 |
-
if ( $this->api->http_code != 200 ){
|
173 |
-
throw new Exception( "User contacts request failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ) );
|
174 |
-
}
|
175 |
-
|
176 |
-
if( $response && count( $response ) ){
|
177 |
-
foreach( $response as $item ){
|
178 |
-
$uc = new Hybrid_User_Contact();
|
179 |
-
|
180 |
-
$uc->identifier = (property_exists($item,'id'))?$item->id:"";
|
181 |
-
$uc->displayName = (property_exists($item,'name'))?$item->name:"";
|
182 |
-
$uc->profileURL = (property_exists($item,'screen_name'))?("http://twitter.com/".$item->screen_name):"";
|
183 |
-
$uc->photoURL = (property_exists($item,'profile_image_url'))?$item->profile_image_url:"";
|
184 |
-
$uc->description = (property_exists($item,'description'))?$item->description:"";
|
185 |
-
|
186 |
-
$contacts[] = $uc;
|
187 |
-
}
|
188 |
-
}
|
189 |
-
}
|
190 |
-
|
191 |
-
return $contacts;
|
192 |
-
}
|
193 |
-
|
194 |
-
/**
|
195 |
-
* update user status
|
196 |
-
*/
|
197 |
-
function setUserStatus( $status )
|
198 |
-
{
|
199 |
-
|
200 |
-
if( is_array( $status ) && isset( $status[ 'message' ] ) && isset( $status[ 'picture' ] ) ){
|
201 |
-
$response = $this->api->post( 'statuses/update_with_media.json', array( 'status' => $status[ 'message' ], 'media[]' => file_get_contents( $status[ 'picture' ] ) ), null, null, true );
|
202 |
-
}else{
|
203 |
-
$response = $this->api->post( 'statuses/update.json', array( 'status' => $status ) );
|
204 |
-
}
|
205 |
-
|
206 |
-
// check the last HTTP status code returned
|
207 |
-
if ( $this->api->http_code != 200 ){
|
208 |
-
throw new Exception( "Update user status failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ) );
|
209 |
-
}
|
210 |
-
|
211 |
-
return $response;
|
212 |
-
}
|
213 |
-
|
214 |
-
|
215 |
-
/**
|
216 |
-
* get user status
|
217 |
-
*/
|
218 |
-
function getUserStatus( $tweetid )
|
219 |
-
{
|
220 |
-
$info = $this->api->get( 'statuses/show.json?id=' . $tweetid . '&include_entities=true' );
|
221 |
-
|
222 |
-
// check the last HTTP status code returned
|
223 |
-
if ( $this->api->http_code != 200 || !isset( $info->id ) ){
|
224 |
-
throw new Exception( "Cannot retrieve user status! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ) );
|
225 |
-
}
|
226 |
-
|
227 |
-
return $info;
|
228 |
-
}
|
229 |
-
|
230 |
-
|
231 |
-
/**
|
232 |
-
* load the user latest activity
|
233 |
-
* - timeline : all the stream
|
234 |
-
* - me : the user activity only
|
235 |
-
*
|
236 |
-
* by default return the timeline
|
237 |
-
*/
|
238 |
-
function getUserActivity( $stream )
|
239 |
-
{
|
240 |
-
if( $stream == "me" ){
|
241 |
-
$response = $this->api->get( 'statuses/user_timeline.json' );
|
242 |
-
}
|
243 |
-
else{
|
244 |
-
$response = $this->api->get( 'statuses/home_timeline.json' );
|
245 |
-
}
|
246 |
-
|
247 |
-
// check the last HTTP status code returned
|
248 |
-
if ( $this->api->http_code != 200 ){
|
249 |
-
throw new Exception( "User activity stream request failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ) );
|
250 |
-
}
|
251 |
-
|
252 |
-
if( ! $response ){
|
253 |
-
return ARRAY();
|
254 |
-
}
|
255 |
-
|
256 |
-
$activities = ARRAY();
|
257 |
-
|
258 |
-
foreach( $response as $item ){
|
259 |
-
$ua = new Hybrid_User_Activity();
|
260 |
-
|
261 |
-
$ua->id = (property_exists($item,'id'))?$item->id:"";
|
262 |
-
$ua->date = (property_exists($item,'created_at'))?strtotime($item->created_at):"";
|
263 |
-
$ua->text = (property_exists($item,'text'))?$item->text:"";
|
264 |
-
|
265 |
-
$ua->user->identifier = (property_exists($item->user,'id'))?$item->user->id:"";
|
266 |
-
$ua->user->displayName = (property_exists($item->user,'name'))?$item->user->name:"";
|
267 |
-
$ua->user->profileURL = (property_exists($item->user,'screen_name'))?("http://twitter.com/".$item->user->screen_name):"";
|
268 |
-
$ua->user->photoURL = (property_exists($item->user,'profile_image_url'))?$item->user->profile_image_url:"";
|
269 |
-
|
270 |
-
$activities[] = $ua;
|
271 |
-
}
|
272 |
-
|
273 |
-
return $activities;
|
274 |
-
}
|
275 |
-
}
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Hybrid_Providers_Twitter provider adapter based on OAuth1 protocol
|
10 |
+
*/
|
11 |
+
class Hybrid_Providers_Twitter extends Hybrid_Provider_Model_OAuth1
|
12 |
+
{
|
13 |
+
/**
|
14 |
+
* IDp wrappers initializer
|
15 |
+
*/
|
16 |
+
function initialize()
|
17 |
+
{
|
18 |
+
parent::initialize();
|
19 |
+
|
20 |
+
// Provider api end-points
|
21 |
+
$this->api->api_base_url = "https://api.twitter.com/1.1/";
|
22 |
+
$this->api->authorize_url = "https://api.twitter.com/oauth/authenticate";
|
23 |
+
$this->api->request_token_url = "https://api.twitter.com/oauth/request_token";
|
24 |
+
$this->api->access_token_url = "https://api.twitter.com/oauth/access_token";
|
25 |
+
|
26 |
+
if ( isset( $this->config['api_version'] ) && $this->config['api_version'] ){
|
27 |
+
$this->api->api_base_url = "https://api.twitter.com/{$this->config['api_version']}/";
|
28 |
+
}
|
29 |
+
|
30 |
+
if ( isset( $this->config['authorize'] ) && $this->config['authorize'] ){
|
31 |
+
$this->api->authorize_url = "https://api.twitter.com/oauth/authorize";
|
32 |
+
}
|
33 |
+
|
34 |
+
$this->api->curl_auth_header = false;
|
35 |
+
}
|
36 |
+
|
37 |
+
/**
|
38 |
+
* begin login step
|
39 |
+
*/
|
40 |
+
function loginBegin()
|
41 |
+
{
|
42 |
+
// Initiate the Reverse Auth flow; cf. https://dev.twitter.com/docs/ios/using-reverse-auth
|
43 |
+
if (isset($_REQUEST['reverse_auth']) && ($_REQUEST['reverse_auth'] == 'yes')){
|
44 |
+
$stage1 = $this->api->signedRequest( $this->api->request_token_url, 'POST', array( 'x_auth_mode' => 'reverse_auth' ) );
|
45 |
+
if ( $this->api->http_code != 200 ){
|
46 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ), 5 );
|
47 |
+
}
|
48 |
+
$responseObj = array( 'x_reverse_auth_parameters' => $stage1, 'x_reverse_auth_target' => $this->config["keys"]["key"] );
|
49 |
+
$response = json_encode($responseObj);
|
50 |
+
header( "Content-Type: application/json", true, 200 ) ;
|
51 |
+
echo $response;
|
52 |
+
die();
|
53 |
+
}
|
54 |
+
$tokens = $this->api->requestToken( $this->endpoint );
|
55 |
+
|
56 |
+
// request tokens as received from provider
|
57 |
+
$this->request_tokens_raw = $tokens;
|
58 |
+
|
59 |
+
// check the last HTTP status code returned
|
60 |
+
if ( $this->api->http_code != 200 ){
|
61 |
+
if( ( time() < strtotime( $this->api->http_header['date'] )-300 || time() > strtotime( $this->api->http_header['date'] )+300 ) ){
|
62 |
+
|
63 |
+
throw new Exception( "Authentication failed! Your server time is not in sync with the {$this->providerId} servers. Acceptable timestamps: " . $this->api->http_header['date'], 5 );
|
64 |
+
}
|
65 |
+
|
66 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ), 5 );
|
67 |
+
}
|
68 |
+
|
69 |
+
if ( ! isset( $tokens["oauth_token"] ) ){
|
70 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid oauth_token.", 5 );
|
71 |
+
}
|
72 |
+
|
73 |
+
$this->token( "request_token" , $tokens["oauth_token"] );
|
74 |
+
$this->token( "request_token_secret", $tokens["oauth_token_secret"] );
|
75 |
+
|
76 |
+
// redirect the user to the provider authentication url with force_login
|
77 |
+
if ( ( isset( $this->config['force_login'] ) && $this->config['force_login'] ) || ( isset( $this->config[ 'force' ] ) && $this->config[ 'force' ] === true ) ){
|
78 |
+
Hybrid_Auth::redirect( $this->api->authorizeUrl( $tokens, array( 'force_login' => true ) ) );
|
79 |
+
}
|
80 |
+
|
81 |
+
// else, redirect the user to the provider authentication url
|
82 |
+
Hybrid_Auth::redirect( $this->api->authorizeUrl( $tokens ) );
|
83 |
+
}
|
84 |
+
|
85 |
+
/**
|
86 |
+
* finish login step
|
87 |
+
*/
|
88 |
+
function loginFinish()
|
89 |
+
{
|
90 |
+
// in case we are completing a Reverse Auth flow; cf. https://dev.twitter.com/docs/ios/using-reverse-auth
|
91 |
+
if(isset($_REQUEST['oauth_token_secret'])){
|
92 |
+
$tokens = $_REQUEST;
|
93 |
+
$this->access_tokens_raw = $tokens;
|
94 |
+
|
95 |
+
// we should have an access_token unless something has gone wrong
|
96 |
+
if ( ! isset( $tokens["oauth_token"] ) ){
|
97 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid oauth_token.", 5 );
|
98 |
+
}
|
99 |
+
|
100 |
+
// Get rid of tokens we don't need
|
101 |
+
$this->deleteToken( "request_token" );
|
102 |
+
$this->deleteToken( "request_token_secret" );
|
103 |
+
|
104 |
+
// Store access_token and secret for later use
|
105 |
+
$this->token( "access_token" , $tokens['oauth_token'] );
|
106 |
+
$this->token( "access_token_secret" , $tokens['oauth_token_secret'] );
|
107 |
+
|
108 |
+
// set user as logged in to the current provider
|
109 |
+
$this->setUserConnected();
|
110 |
+
return;
|
111 |
+
}
|
112 |
+
parent::loginFinish();
|
113 |
+
}
|
114 |
+
|
115 |
+
/**
|
116 |
+
* load the user profile from the IDp api client
|
117 |
+
*/
|
118 |
+
function getUserProfile()
|
119 |
+
{
|
120 |
+
$response = $this->api->get( 'account/verify_credentials.json?include_email=true' );
|
121 |
+
|
122 |
+
// check the last HTTP status code returned
|
123 |
+
if ( $this->api->http_code != 200 ){
|
124 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ), 6 );
|
125 |
+
}
|
126 |
+
|
127 |
+
if ( ! is_object( $response ) || ! isset( $response->id ) ){
|
128 |
+
throw new Exception( "User profile request failed! {$this->providerId} api returned an invalid response.", 6 );
|
129 |
+
}
|
130 |
+
|
131 |
+
# store the user profile.
|
132 |
+
$this->user->profile->identifier = (property_exists($response,'id'))?$response->id:"";
|
133 |
+
$this->user->profile->displayName = (property_exists($response,'screen_name'))?$response->screen_name:"";
|
134 |
+
$this->user->profile->description = (property_exists($response,'description'))?$response->description:"";
|
135 |
+
$this->user->profile->firstName = (property_exists($response,'name'))?$response->name:"";
|
136 |
+
$this->user->profile->photoURL = (property_exists($response,'profile_image_url'))?(str_replace('_normal', '', $response->profile_image_url)):"";
|
137 |
+
$this->user->profile->profileURL = (property_exists($response,'screen_name'))?("http://twitter.com/".$response->screen_name):"";
|
138 |
+
$this->user->profile->webSiteURL = (property_exists($response,'url'))?$response->url:"";
|
139 |
+
$this->user->profile->region = (property_exists($response,'location'))?$response->location:"";
|
140 |
+
$this->user->profile->email = (property_exists($response,'email'))?$response->email:"";
|
141 |
+
|
142 |
+
return $this->user->profile;
|
143 |
+
}
|
144 |
+
|
145 |
+
/**
|
146 |
+
* load the user contacts
|
147 |
+
*/
|
148 |
+
function getUserContacts()
|
149 |
+
{
|
150 |
+
$parameters = array( 'cursor' => '-1' );
|
151 |
+
$response = $this->api->get( 'friends/ids.json', $parameters );
|
152 |
+
|
153 |
+
// check the last HTTP status code returned
|
154 |
+
if ( $this->api->http_code != 200 ){
|
155 |
+
throw new Exception( "User contacts request failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ) );
|
156 |
+
}
|
157 |
+
|
158 |
+
if( ! $response || ! count( $response->ids ) ){
|
159 |
+
return ARRAY();
|
160 |
+
}
|
161 |
+
|
162 |
+
// 75 id per time should be okey
|
163 |
+
$contactsids = array_chunk ( $response->ids, 75 );
|
164 |
+
|
165 |
+
$contacts = ARRAY();
|
166 |
+
|
167 |
+
foreach( $contactsids as $chunk ){
|
168 |
+
$parameters = array( 'user_id' => implode( ",", $chunk ) );
|
169 |
+
$response = $this->api->get( 'users/lookup.json', $parameters );
|
170 |
+
|
171 |
+
// check the last HTTP status code returned
|
172 |
+
if ( $this->api->http_code != 200 ){
|
173 |
+
throw new Exception( "User contacts request failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ) );
|
174 |
+
}
|
175 |
+
|
176 |
+
if( $response && count( $response ) ){
|
177 |
+
foreach( $response as $item ){
|
178 |
+
$uc = new Hybrid_User_Contact();
|
179 |
+
|
180 |
+
$uc->identifier = (property_exists($item,'id'))?$item->id:"";
|
181 |
+
$uc->displayName = (property_exists($item,'name'))?$item->name:"";
|
182 |
+
$uc->profileURL = (property_exists($item,'screen_name'))?("http://twitter.com/".$item->screen_name):"";
|
183 |
+
$uc->photoURL = (property_exists($item,'profile_image_url'))?$item->profile_image_url:"";
|
184 |
+
$uc->description = (property_exists($item,'description'))?$item->description:"";
|
185 |
+
|
186 |
+
$contacts[] = $uc;
|
187 |
+
}
|
188 |
+
}
|
189 |
+
}
|
190 |
+
|
191 |
+
return $contacts;
|
192 |
+
}
|
193 |
+
|
194 |
+
/**
|
195 |
+
* update user status
|
196 |
+
*/
|
197 |
+
function setUserStatus( $status )
|
198 |
+
{
|
199 |
+
|
200 |
+
if( is_array( $status ) && isset( $status[ 'message' ] ) && isset( $status[ 'picture' ] ) ){
|
201 |
+
$response = $this->api->post( 'statuses/update_with_media.json', array( 'status' => $status[ 'message' ], 'media[]' => file_get_contents( $status[ 'picture' ] ) ), null, null, true );
|
202 |
+
}else{
|
203 |
+
$response = $this->api->post( 'statuses/update.json', array( 'status' => $status ) );
|
204 |
+
}
|
205 |
+
|
206 |
+
// check the last HTTP status code returned
|
207 |
+
if ( $this->api->http_code != 200 ){
|
208 |
+
throw new Exception( "Update user status failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ) );
|
209 |
+
}
|
210 |
+
|
211 |
+
return $response;
|
212 |
+
}
|
213 |
+
|
214 |
+
|
215 |
+
/**
|
216 |
+
* get user status
|
217 |
+
*/
|
218 |
+
function getUserStatus( $tweetid )
|
219 |
+
{
|
220 |
+
$info = $this->api->get( 'statuses/show.json?id=' . $tweetid . '&include_entities=true' );
|
221 |
+
|
222 |
+
// check the last HTTP status code returned
|
223 |
+
if ( $this->api->http_code != 200 || !isset( $info->id ) ){
|
224 |
+
throw new Exception( "Cannot retrieve user status! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ) );
|
225 |
+
}
|
226 |
+
|
227 |
+
return $info;
|
228 |
+
}
|
229 |
+
|
230 |
+
|
231 |
+
/**
|
232 |
+
* load the user latest activity
|
233 |
+
* - timeline : all the stream
|
234 |
+
* - me : the user activity only
|
235 |
+
*
|
236 |
+
* by default return the timeline
|
237 |
+
*/
|
238 |
+
function getUserActivity( $stream )
|
239 |
+
{
|
240 |
+
if( $stream == "me" ){
|
241 |
+
$response = $this->api->get( 'statuses/user_timeline.json' );
|
242 |
+
}
|
243 |
+
else{
|
244 |
+
$response = $this->api->get( 'statuses/home_timeline.json' );
|
245 |
+
}
|
246 |
+
|
247 |
+
// check the last HTTP status code returned
|
248 |
+
if ( $this->api->http_code != 200 ){
|
249 |
+
throw new Exception( "User activity stream request failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus( $this->api->http_code ) );
|
250 |
+
}
|
251 |
+
|
252 |
+
if( ! $response ){
|
253 |
+
return ARRAY();
|
254 |
+
}
|
255 |
+
|
256 |
+
$activities = ARRAY();
|
257 |
+
|
258 |
+
foreach( $response as $item ){
|
259 |
+
$ua = new Hybrid_User_Activity();
|
260 |
+
|
261 |
+
$ua->id = (property_exists($item,'id'))?$item->id:"";
|
262 |
+
$ua->date = (property_exists($item,'created_at'))?strtotime($item->created_at):"";
|
263 |
+
$ua->text = (property_exists($item,'text'))?$item->text:"";
|
264 |
+
|
265 |
+
$ua->user->identifier = (property_exists($item->user,'id'))?$item->user->id:"";
|
266 |
+
$ua->user->displayName = (property_exists($item->user,'name'))?$item->user->name:"";
|
267 |
+
$ua->user->profileURL = (property_exists($item->user,'screen_name'))?("http://twitter.com/".$item->user->screen_name):"";
|
268 |
+
$ua->user->photoURL = (property_exists($item->user,'profile_image_url'))?$item->user->profile_image_url:"";
|
269 |
+
|
270 |
+
$activities[] = $ua;
|
271 |
+
}
|
272 |
+
|
273 |
+
return $activities;
|
274 |
+
}
|
275 |
+
}
|
hybridauth/Hybrid/Providers/Vkontakte.php
CHANGED
@@ -1,151 +1,220 @@
|
|
1 |
-
<?php
|
2 |
-
/*!
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | https://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Hybrid_Providers_Vkontakte provider adapter based on OAuth2 protocol
|
10 |
-
*
|
11 |
-
* added by guiltar | https://github.com/guiltar
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
//
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
//
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
$
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
$this->
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
$this->
|
119 |
-
}
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | https://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2015 HybridAuth authors | hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Hybrid_Providers_Vkontakte provider adapter based on OAuth2 protocol
|
10 |
+
*
|
11 |
+
* added by guiltar | https://github.com/guiltar
|
12 |
+
*
|
13 |
+
* @property OAuth2Client $api
|
14 |
+
*/
|
15 |
+
|
16 |
+
class Hybrid_Providers_Vkontakte extends Hybrid_Provider_Model_OAuth2
|
17 |
+
{
|
18 |
+
// default permissions
|
19 |
+
public $scope = "email";
|
20 |
+
|
21 |
+
// default user fields map
|
22 |
+
public $fields = array(
|
23 |
+
// Old that saved for backward-compability
|
24 |
+
'identifier' => 'uid',
|
25 |
+
'firstName' => 'first_name',
|
26 |
+
'lastName' => 'last_name',
|
27 |
+
'displayName' => 'screen_name',
|
28 |
+
'gender' => 'sex',
|
29 |
+
'photoURL' => 'photo_200',
|
30 |
+
'home_town' => 'home_town',
|
31 |
+
'profileURL' => 'domain', // Will be converted in getUserByResponse()
|
32 |
+
// New
|
33 |
+
'nickname' => 'nickname',
|
34 |
+
'bdate' => 'bdate',
|
35 |
+
'timezone' => 'timezone',
|
36 |
+
'photo_rec' => 'photo_rec',
|
37 |
+
'domain' => 'domain',
|
38 |
+
'photo_max' => 'photo_max',
|
39 |
+
'home_phone' => 'home_phone',
|
40 |
+
'city' => 'city', // Will be converted in getUserByResponse()
|
41 |
+
'country' => 'country', // Will be converted in getUserByResponse()
|
42 |
+
);
|
43 |
+
|
44 |
+
/**
|
45 |
+
* IDp wrappers initializer
|
46 |
+
*/
|
47 |
+
function initialize()
|
48 |
+
{
|
49 |
+
parent::initialize();
|
50 |
+
|
51 |
+
// Provider api end-points
|
52 |
+
$this->api->api_base_url = 'https://api.vk.com/method/';
|
53 |
+
$this->api->authorize_url = "https://api.vk.com/oauth/authorize";
|
54 |
+
$this->api->token_url = "https://api.vk.com/oauth/token";
|
55 |
+
if (!empty($this->config['fields']))
|
56 |
+
$this->fields = $this->config['fields'];
|
57 |
+
}
|
58 |
+
|
59 |
+
function loginFinish()
|
60 |
+
{
|
61 |
+
$error = (array_key_exists('error',$_REQUEST))?$_REQUEST['error']:"";
|
62 |
+
|
63 |
+
// check for errors
|
64 |
+
if ( $error ){
|
65 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an error: $error", 5 );
|
66 |
+
}
|
67 |
+
|
68 |
+
// try to authenticate user
|
69 |
+
$code = (array_key_exists('code',$_REQUEST))?$_REQUEST['code']:"";
|
70 |
+
|
71 |
+
try{
|
72 |
+
$response = $this->api->authenticate( $code );
|
73 |
+
}
|
74 |
+
catch( Exception $e ){
|
75 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an error: $e", 6 );
|
76 |
+
}
|
77 |
+
|
78 |
+
// check if authenticated
|
79 |
+
if ( !property_exists($response,'user_id') || ! $this->api->access_token ){
|
80 |
+
throw new Exception( "Authentication failed! {$this->providerId} returned an invalid access token.", 5 );
|
81 |
+
}
|
82 |
+
|
83 |
+
// store tokens
|
84 |
+
$this->token( "access_token" , $this->api->access_token );
|
85 |
+
$this->token( "refresh_token", $this->api->refresh_token );
|
86 |
+
$this->token( "expires_in" , $this->api->access_token_expires_in );
|
87 |
+
$this->token( "expires_at" , $this->api->access_token_expires_at );
|
88 |
+
|
89 |
+
// store user id. it is required for api access to Vkontakte
|
90 |
+
Hybrid_Auth::storage()->set( "hauth_session.{$this->providerId}.user_id", $response->user_id );
|
91 |
+
Hybrid_Auth::storage()->set(
|
92 |
+
"hauth_session.{$this->providerId}.user_email",
|
93 |
+
property_exists($response, 'email')
|
94 |
+
? $response->email
|
95 |
+
: null
|
96 |
+
);
|
97 |
+
|
98 |
+
// set user connected locally
|
99 |
+
$this->setUserConnected();
|
100 |
+
}
|
101 |
+
|
102 |
+
/**
|
103 |
+
* load the user profile from the IDp api client
|
104 |
+
*/
|
105 |
+
function getUserProfile()
|
106 |
+
{
|
107 |
+
// refresh tokens if needed
|
108 |
+
$this->refreshToken();
|
109 |
+
|
110 |
+
// Vkontakte requires user id, not just token for api access
|
111 |
+
$params['uid'] = Hybrid_Auth::storage()->get( "hauth_session.{$this->providerId}.user_id" );
|
112 |
+
$params['fields'] = implode(',', $this->fields);
|
113 |
+
// ask vkontakte api for user infos
|
114 |
+
|
115 |
+
$response = $this->api->api( 'getProfiles' , 'GET', $params);
|
116 |
+
|
117 |
+
if (!isset( $response->response[0] ) || !isset( $response->response[0]->uid ) || isset( $response->error ) ){
|
118 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
119 |
+
}
|
120 |
+
|
121 |
+
// Fill datas
|
122 |
+
$response = reset($response->response);
|
123 |
+
foreach ($this->getUserByResponse($response, true) as $k => $v)
|
124 |
+
$this->user->profile->$k = $v;
|
125 |
+
|
126 |
+
// Additional data
|
127 |
+
$this->user->profile->email = Hybrid_Auth::storage()->get( "hauth_session.{$this->providerId}.user_email" );
|
128 |
+
$this->user->profile->emailVerified = $this->user->profile->email;
|
129 |
+
|
130 |
+
return $this->user->profile;
|
131 |
+
}
|
132 |
+
|
133 |
+
/**
|
134 |
+
* load the user contacts
|
135 |
+
*/
|
136 |
+
function getUserContacts()
|
137 |
+
{
|
138 |
+
$params=array(
|
139 |
+
'fields' => implode(',', $this->fields),
|
140 |
+
);
|
141 |
+
|
142 |
+
$response = $this->api->api('friends.get','GET',$params);
|
143 |
+
|
144 |
+
if(empty($response) || empty($response->response)){
|
145 |
+
return array();
|
146 |
+
}
|
147 |
+
|
148 |
+
$contacts = array();
|
149 |
+
foreach( $response->response as $item ) {
|
150 |
+
$contacts[] = $this->getUserByResponse($item);
|
151 |
+
}
|
152 |
+
|
153 |
+
return $contacts;
|
154 |
+
}
|
155 |
+
|
156 |
+
/**
|
157 |
+
* @param object $response
|
158 |
+
* @param bool $withAdditionalRequests True to get some full fields like 'city' or 'country'
|
159 |
+
* (requires additional responses to vk api!)
|
160 |
+
*
|
161 |
+
* @return \Hybrid_User_Contact
|
162 |
+
*/
|
163 |
+
function getUserByResponse($response, $withAdditionalRequests = false)
|
164 |
+
{
|
165 |
+
$user = new Hybrid_User_Contact();
|
166 |
+
|
167 |
+
foreach ($this->fields as $field => $map)
|
168 |
+
$user->$field = (property_exists($response,$map)) ? $response->$map : null;
|
169 |
+
|
170 |
+
if (property_exists($user, 'profileURL') && !empty($user->profileURL)) {
|
171 |
+
$user->profileURL = 'http://vk.com/' . $user->profileURL;
|
172 |
+
}
|
173 |
+
|
174 |
+
if (property_exists($user, 'gender')) {
|
175 |
+
switch ($user->gender) {
|
176 |
+
case 1: $user->gender = 'female'; break;
|
177 |
+
case 2: $user->gender = 'male'; break;
|
178 |
+
default: $user->gender = null; break;
|
179 |
+
}
|
180 |
+
}
|
181 |
+
|
182 |
+
if (property_exists($user, 'bdate')) {
|
183 |
+
$birthday = explode('.', $user->bdate);
|
184 |
+
switch (count($birthday)) {
|
185 |
+
case 3:
|
186 |
+
$user->birthDay = (int) $birthday[0];
|
187 |
+
$user->birthMonth = (int) $birthday[1];
|
188 |
+
$user->birthYear = (int) $birthday[2];
|
189 |
+
break;
|
190 |
+
|
191 |
+
case 2:
|
192 |
+
$user->birthDay = (int) $birthday[0];
|
193 |
+
$user->birthMonth = (int) $birthday[1];
|
194 |
+
break;
|
195 |
+
}
|
196 |
+
}
|
197 |
+
|
198 |
+
if (property_exists($user, 'city') && $withAdditionalRequests) {
|
199 |
+
$params = array(
|
200 |
+
'city_ids' => $user->city,
|
201 |
+
);
|
202 |
+
$cities = $this->api->api( 'database.getCitiesById' , 'GET', $params);
|
203 |
+
$city = reset($cities);
|
204 |
+
if (is_array($city)) $city = reset($city);
|
205 |
+
$user->city = property_exists($city, 'name') ? $city->name : null;
|
206 |
+
}
|
207 |
+
|
208 |
+
if (property_exists($user, 'country') && $withAdditionalRequests) {
|
209 |
+
$params = array(
|
210 |
+
'country_ids' => $user->country,
|
211 |
+
);
|
212 |
+
$countries = $this->api->api( 'database.getCountriesById' , 'GET', $params);
|
213 |
+
$country = reset($countries);
|
214 |
+
if (is_array($country)) $country = reset($country);
|
215 |
+
$user->country = property_exists($country, 'name') ? $country->name : null;
|
216 |
+
}
|
217 |
+
|
218 |
+
return $user;
|
219 |
+
}
|
220 |
+
}
|
hybridauth/Hybrid/Providers/WordPress.php
CHANGED
@@ -1,85 +1,85 @@
|
|
1 |
-
<?php
|
2 |
-
/*!
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | https://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2011 HybridAuth authors | hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Hybrid_Providers_WordPress
|
10 |
-
*/
|
11 |
-
class Hybrid_Providers_WordPress extends Hybrid_Provider_Model_OAuth2
|
12 |
-
{
|
13 |
-
// default permissions
|
14 |
-
public $scope = "";
|
15 |
-
|
16 |
-
/**
|
17 |
-
* IDp wrappers initializer
|
18 |
-
*/
|
19 |
-
function initialize()
|
20 |
-
{
|
21 |
-
parent::initialize();
|
22 |
-
|
23 |
-
// Provider api end-points
|
24 |
-
$this->api->api_base_url = "https://public-api.wordpress.com/rest/v1/";
|
25 |
-
$this->api->authorize_url = "https://public-api.wordpress.com/oauth2/authenticate";
|
26 |
-
$this->api->token_url = "https://public-api.wordpress.com/oauth2/token";
|
27 |
-
|
28 |
-
if( $this->token( "access_token" ) )
|
29 |
-
{
|
30 |
-
$this->api->curl_header = array( 'Authorization: Bearer ' . $this->token( "access_token" ) );
|
31 |
-
}
|
32 |
-
}
|
33 |
-
|
34 |
-
// --------------------------------------------------------------------
|
35 |
-
|
36 |
-
/**
|
37 |
-
* begin login step
|
38 |
-
*/
|
39 |
-
function loginBegin()
|
40 |
-
{
|
41 |
-
// redirect the user to the provider authentication url
|
42 |
-
Hybrid_Auth::redirect( $this->api->authorizeUrl( array( "scope" => $this->scope, "state" => md5( mt_rand() ) ) ) );
|
43 |
-
}
|
44 |
-
|
45 |
-
// --------------------------------------------------------------------
|
46 |
-
|
47 |
-
/**
|
48 |
-
* load the user profile from the IDp api client
|
49 |
-
*/
|
50 |
-
function getUserProfile()
|
51 |
-
{
|
52 |
-
$response = $this->api->api( "me/" );
|
53 |
-
|
54 |
-
if ( ! isset( $response->ID ) ){
|
55 |
-
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
56 |
-
}
|
57 |
-
|
58 |
-
$this->user->profile->identifier = (property_exists($response,'ID'))?$response->ID:"";
|
59 |
-
$this->user->profile->displayName = (property_exists($response,'display_name'))?$response->display_name:"";
|
60 |
-
$this->user->profile->photoURL = (property_exists($response,'avatar_URL'))?$response->avatar_URL:"";
|
61 |
-
$this->user->profile->profileURL = (property_exists($response,'profile_URL'))?$response->profile_URL:"";
|
62 |
-
$this->user->profile->email = (property_exists($response,'email'))?$response->email:"";
|
63 |
-
$this->user->profile->language = (property_exists($response,'language'))?$response->language:"";
|
64 |
-
|
65 |
-
if( ! $this->user->profile->displayName ){
|
66 |
-
$this->user->profile->displayName = (property_exists($response,'username'))?$response->username:"";
|
67 |
-
}
|
68 |
-
|
69 |
-
if( property_exists($response,'email_verified') && property_exists($response,'email') && $response->email_verified == 1 ){
|
70 |
-
$this->user->profile->emailVerified = $response->email;
|
71 |
-
}
|
72 |
-
|
73 |
-
if( property_exists($response,'primary_blog') ){
|
74 |
-
$primary_blog = $response->primary_blog;
|
75 |
-
|
76 |
-
$response = $this->api->api( 'sites/' . $primary_blog );
|
77 |
-
|
78 |
-
if( isset( $response->URL ) ){
|
79 |
-
$this->user->profile->webSiteURL = $response->URL;
|
80 |
-
}
|
81 |
-
}
|
82 |
-
|
83 |
-
return $this->user->profile;
|
84 |
-
}
|
85 |
-
}
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | https://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2011 HybridAuth authors | hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Hybrid_Providers_WordPress
|
10 |
+
*/
|
11 |
+
class Hybrid_Providers_WordPress extends Hybrid_Provider_Model_OAuth2
|
12 |
+
{
|
13 |
+
// default permissions
|
14 |
+
public $scope = "";
|
15 |
+
|
16 |
+
/**
|
17 |
+
* IDp wrappers initializer
|
18 |
+
*/
|
19 |
+
function initialize()
|
20 |
+
{
|
21 |
+
parent::initialize();
|
22 |
+
|
23 |
+
// Provider api end-points
|
24 |
+
$this->api->api_base_url = "https://public-api.wordpress.com/rest/v1/";
|
25 |
+
$this->api->authorize_url = "https://public-api.wordpress.com/oauth2/authenticate";
|
26 |
+
$this->api->token_url = "https://public-api.wordpress.com/oauth2/token";
|
27 |
+
|
28 |
+
if( $this->token( "access_token" ) )
|
29 |
+
{
|
30 |
+
$this->api->curl_header = array( 'Authorization: Bearer ' . $this->token( "access_token" ) );
|
31 |
+
}
|
32 |
+
}
|
33 |
+
|
34 |
+
// --------------------------------------------------------------------
|
35 |
+
|
36 |
+
/**
|
37 |
+
* begin login step
|
38 |
+
*/
|
39 |
+
function loginBegin()
|
40 |
+
{
|
41 |
+
// redirect the user to the provider authentication url
|
42 |
+
Hybrid_Auth::redirect( $this->api->authorizeUrl( array( "scope" => $this->scope, "state" => md5( mt_rand() ) ) ) );
|
43 |
+
}
|
44 |
+
|
45 |
+
// --------------------------------------------------------------------
|
46 |
+
|
47 |
+
/**
|
48 |
+
* load the user profile from the IDp api client
|
49 |
+
*/
|
50 |
+
function getUserProfile()
|
51 |
+
{
|
52 |
+
$response = $this->api->api( "me/" );
|
53 |
+
|
54 |
+
if ( ! isset( $response->ID ) ){
|
55 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
56 |
+
}
|
57 |
+
|
58 |
+
$this->user->profile->identifier = (property_exists($response,'ID'))?$response->ID:"";
|
59 |
+
$this->user->profile->displayName = (property_exists($response,'display_name'))?$response->display_name:"";
|
60 |
+
$this->user->profile->photoURL = (property_exists($response,'avatar_URL'))?$response->avatar_URL:"";
|
61 |
+
$this->user->profile->profileURL = (property_exists($response,'profile_URL'))?$response->profile_URL:"";
|
62 |
+
$this->user->profile->email = (property_exists($response,'email'))?$response->email:"";
|
63 |
+
$this->user->profile->language = (property_exists($response,'language'))?$response->language:"";
|
64 |
+
|
65 |
+
if( ! $this->user->profile->displayName ){
|
66 |
+
$this->user->profile->displayName = (property_exists($response,'username'))?$response->username:"";
|
67 |
+
}
|
68 |
+
|
69 |
+
if( property_exists($response,'email_verified') && property_exists($response,'email') && $response->email_verified == 1 ){
|
70 |
+
$this->user->profile->emailVerified = $response->email;
|
71 |
+
}
|
72 |
+
|
73 |
+
if( property_exists($response,'primary_blog') ){
|
74 |
+
$primary_blog = $response->primary_blog;
|
75 |
+
|
76 |
+
$response = $this->api->api( 'sites/' . $primary_blog );
|
77 |
+
|
78 |
+
if( isset( $response->URL ) ){
|
79 |
+
$this->user->profile->webSiteURL = $response->URL;
|
80 |
+
}
|
81 |
+
}
|
82 |
+
|
83 |
+
return $this->user->profile;
|
84 |
+
}
|
85 |
+
}
|
hybridauth/Hybrid/Providers/Yahoo.php
CHANGED
@@ -1,32 +1,32 @@
|
|
1 |
-
<?php
|
2 |
-
//!! planned to be replaced Y! openid by the oauth1 adapter soon
|
3 |
-
|
4 |
-
/*!
|
5 |
-
* HybridAuth
|
6 |
-
* http://hybridauth.sourceforge.net | https://github.com/hybridauth/hybridauth
|
7 |
-
* (c) 2009-2011 HybridAuth authors | hybridauth.sourceforge.net/licenses.html
|
8 |
-
*/
|
9 |
-
|
10 |
-
/**
|
11 |
-
* Hybrid_Providers_Yahoo provider adapter based on OAuth1 protocol
|
12 |
-
*
|
13 |
-
* http://hybridauth.sourceforge.net/userguide/IDProvider_info_Yahoo.html
|
14 |
-
*/
|
15 |
-
class Hybrid_Providers_Yahoo extends Hybrid_Provider_Model_OpenID
|
16 |
-
{
|
17 |
-
var $openidIdentifier = "https://open.login.yahooapis.com/openid20/www.yahoo.com/xrds";
|
18 |
-
|
19 |
-
/**
|
20 |
-
* finish login step
|
21 |
-
*/
|
22 |
-
function loginFinish()
|
23 |
-
{
|
24 |
-
parent::loginFinish();
|
25 |
-
|
26 |
-
$this->user->profile->identifier = $this->user->profile->email;
|
27 |
-
$this->user->profile->emailVerified = $this->user->profile->email;
|
28 |
-
|
29 |
-
// restore the user profile
|
30 |
-
Hybrid_Auth::storage()->set( "hauth_session.{$this->providerId}.user", $this->user );
|
31 |
-
}
|
32 |
-
}
|
1 |
+
<?php
|
2 |
+
//!! planned to be replaced Y! openid by the oauth1 adapter soon
|
3 |
+
|
4 |
+
/*!
|
5 |
+
* HybridAuth
|
6 |
+
* http://hybridauth.sourceforge.net | https://github.com/hybridauth/hybridauth
|
7 |
+
* (c) 2009-2011 HybridAuth authors | hybridauth.sourceforge.net/licenses.html
|
8 |
+
*/
|
9 |
+
|
10 |
+
/**
|
11 |
+
* Hybrid_Providers_Yahoo provider adapter based on OAuth1 protocol
|
12 |
+
*
|
13 |
+
* http://hybridauth.sourceforge.net/userguide/IDProvider_info_Yahoo.html
|
14 |
+
*/
|
15 |
+
class Hybrid_Providers_Yahoo extends Hybrid_Provider_Model_OpenID
|
16 |
+
{
|
17 |
+
var $openidIdentifier = "https://open.login.yahooapis.com/openid20/www.yahoo.com/xrds";
|
18 |
+
|
19 |
+
/**
|
20 |
+
* finish login step
|
21 |
+
*/
|
22 |
+
function loginFinish()
|
23 |
+
{
|
24 |
+
parent::loginFinish();
|
25 |
+
|
26 |
+
$this->user->profile->identifier = $this->user->profile->email;
|
27 |
+
$this->user->profile->emailVerified = $this->user->profile->email;
|
28 |
+
|
29 |
+
// restore the user profile
|
30 |
+
Hybrid_Auth::storage()->set( "hauth_session.{$this->providerId}.user", $this->user );
|
31 |
+
}
|
32 |
+
}
|
hybridauth/Hybrid/Providers/Yandex.php
CHANGED
@@ -1,61 +1,61 @@
|
|
1 |
-
<?php
|
2 |
-
/*!
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*
|
7 |
-
* Provider writed by xbreaker | https://github.com/xbreaker/hybridauth
|
8 |
-
*/
|
9 |
-
|
10 |
-
/**
|
11 |
-
* Hybrid_Providers_Yandex provider adapter based on OAuth2 protocol
|
12 |
-
*
|
13 |
-
*/
|
14 |
-
class Hybrid_Providers_Yandex extends Hybrid_Provider_Model_OAuth2
|
15 |
-
{
|
16 |
-
/**
|
17 |
-
* IDp wrappers initializer
|
18 |
-
*/
|
19 |
-
function initialize()
|
20 |
-
{
|
21 |
-
parent::initialize();
|
22 |
-
|
23 |
-
// Provider apis end-points
|
24 |
-
$this->api->api_base_url = "https://login.yandex.ru/info";
|
25 |
-
$this->api->authorize_url = "https://oauth.yandex.ru/authorize";
|
26 |
-
$this->api->token_url = "https://oauth.yandex.ru/token";
|
27 |
-
|
28 |
-
$this->api->sign_token_name = "oauth_token";
|
29 |
-
}
|
30 |
-
|
31 |
-
/**
|
32 |
-
* load the user profile from the IDp api client
|
33 |
-
*/
|
34 |
-
function getUserProfile()
|
35 |
-
{
|
36 |
-
$response = $this->api->api( "?format=json" );
|
37 |
-
if ( ! isset( $response->id ) ){
|
38 |
-
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
39 |
-
}
|
40 |
-
|
41 |
-
$this->user->profile->identifier = (property_exists($response,'id'))?$response->id:"";
|
42 |
-
$this->user->profile->firstName = (property_exists($response,'real_name'))?$response->real_name:"";
|
43 |
-
$this->user->profile->lastName = (property_exists($response,'family_name'))?$response->family_name:"";
|
44 |
-
$this->user->profile->displayName = (property_exists($response,'display_name'))?$response->display_name:"";
|
45 |
-
$this->user->profile->photoURL = 'http://upics.yandex.net/'. $this->user->profile->identifier .'/normal';
|
46 |
-
$this->user->profile->profileURL = "";
|
47 |
-
$this->user->profile->gender = (property_exists($response,'sex'))?$response->sex:"";
|
48 |
-
$this->user->profile->email = (property_exists($response,'default_email'))?$response->default_email:"";
|
49 |
-
$this->user->profile->emailVerified = (property_exists($response,'default_email'))?$response->default_email:"";
|
50 |
-
|
51 |
-
if( property_exists($response,'birthday') && ! empty($response->birthday) ){
|
52 |
-
list($birthday_year, $birthday_month, $birthday_day) = explode( '-', $response->birthday );
|
53 |
-
|
54 |
-
$this->user->profile->birthDay = (int) $birthday_day;
|
55 |
-
$this->user->profile->birthMonth = (int) $birthday_month;
|
56 |
-
$this->user->profile->birthYear = (int) $birthday_year;
|
57 |
-
}
|
58 |
-
|
59 |
-
return $this->user->profile;
|
60 |
-
}
|
61 |
-
}
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*
|
7 |
+
* Provider writed by xbreaker | https://github.com/xbreaker/hybridauth
|
8 |
+
*/
|
9 |
+
|
10 |
+
/**
|
11 |
+
* Hybrid_Providers_Yandex provider adapter based on OAuth2 protocol
|
12 |
+
*
|
13 |
+
*/
|
14 |
+
class Hybrid_Providers_Yandex extends Hybrid_Provider_Model_OAuth2
|
15 |
+
{
|
16 |
+
/**
|
17 |
+
* IDp wrappers initializer
|
18 |
+
*/
|
19 |
+
function initialize()
|
20 |
+
{
|
21 |
+
parent::initialize();
|
22 |
+
|
23 |
+
// Provider apis end-points
|
24 |
+
$this->api->api_base_url = "https://login.yandex.ru/info";
|
25 |
+
$this->api->authorize_url = "https://oauth.yandex.ru/authorize";
|
26 |
+
$this->api->token_url = "https://oauth.yandex.ru/token";
|
27 |
+
|
28 |
+
$this->api->sign_token_name = "oauth_token";
|
29 |
+
}
|
30 |
+
|
31 |
+
/**
|
32 |
+
* load the user profile from the IDp api client
|
33 |
+
*/
|
34 |
+
function getUserProfile()
|
35 |
+
{
|
36 |
+
$response = $this->api->api( "?format=json" );
|
37 |
+
if ( ! isset( $response->id ) ){
|
38 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an invalid response.", 6 );
|
39 |
+
}
|
40 |
+
|
41 |
+
$this->user->profile->identifier = (property_exists($response,'id'))?$response->id:"";
|
42 |
+
$this->user->profile->firstName = (property_exists($response,'real_name'))?$response->real_name:"";
|
43 |
+
$this->user->profile->lastName = (property_exists($response,'family_name'))?$response->family_name:"";
|
44 |
+
$this->user->profile->displayName = (property_exists($response,'display_name'))?$response->display_name:"";
|
45 |
+
$this->user->profile->photoURL = 'http://upics.yandex.net/'. $this->user->profile->identifier .'/normal';
|
46 |
+
$this->user->profile->profileURL = "";
|
47 |
+
$this->user->profile->gender = (property_exists($response,'sex'))?$response->sex:"";
|
48 |
+
$this->user->profile->email = (property_exists($response,'default_email'))?$response->default_email:"";
|
49 |
+
$this->user->profile->emailVerified = (property_exists($response,'default_email'))?$response->default_email:"";
|
50 |
+
|
51 |
+
if( property_exists($response,'birthday') && ! empty($response->birthday) ){
|
52 |
+
list($birthday_year, $birthday_month, $birthday_day) = explode( '-', $response->birthday );
|
53 |
+
|
54 |
+
$this->user->profile->birthDay = (int) $birthday_day;
|
55 |
+
$this->user->profile->birthMonth = (int) $birthday_month;
|
56 |
+
$this->user->profile->birthYear = (int) $birthday_year;
|
57 |
+
}
|
58 |
+
|
59 |
+
return $this->user->profile;
|
60 |
+
}
|
61 |
+
}
|
hybridauth/Hybrid/Providers/px500.php
CHANGED
@@ -1,96 +1,96 @@
|
|
1 |
-
<?php
|
2 |
-
/*!
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Hybrid_Providers_px500 (500px.com)
|
10 |
-
*/
|
11 |
-
class Hybrid_Providers_px500 extends Hybrid_Provider_Model_OAuth1
|
12 |
-
{
|
13 |
-
/**
|
14 |
-
* IDp wrappers initializer
|
15 |
-
*/
|
16 |
-
function initialize()
|
17 |
-
{
|
18 |
-
parent::initialize();
|
19 |
-
|
20 |
-
// provider api end-points
|
21 |
-
$this->api->api_base_url = "https://api.500px.com/v1/";
|
22 |
-
$this->api->authorize_url = "https://api.500px.com/v1/oauth/authorize";
|
23 |
-
$this->api->request_token_url = "https://api.500px.com/v1/oauth/request_token";
|
24 |
-
$this->api->access_token_url = "https://api.500px.com/v1/oauth/access_token";
|
25 |
-
|
26 |
-
$this->api->curl_auth_header = false;
|
27 |
-
}
|
28 |
-
|
29 |
-
|
30 |
-
/**
|
31 |
-
* load the user profile from the IDp api client
|
32 |
-
*/
|
33 |
-
function getUserProfile()
|
34 |
-
{
|
35 |
-
try{
|
36 |
-
$response = $this->api->get( 'users' );
|
37 |
-
}
|
38 |
-
catch( Exception $e ){
|
39 |
-
throw new Exception( "User profile request failed! {$this->providerId} returned an error while requesting the user profile.", 6 );
|
40 |
-
}
|
41 |
-
|
42 |
-
$this->user->profile->identifier = (property_exists($response->user,'id'))?$response->user->id:"";
|
43 |
-
$this->user->profile->displayName = (property_exists($response->user,'username'))?$response->user->username:"";
|
44 |
-
$this->user->profile->description = (property_exists($response->user,'about'))?$response->user->about:"";
|
45 |
-
$this->user->profile->firstName = (property_exists($response->user,'firstname'))?$response->user->firstname:"";
|
46 |
-
$this->user->profile->lastName = (property_exists($response->user,'lastname'))?$response->user->lastname:"";
|
47 |
-
$this->user->profile->photoURL = (property_exists($response->user,'userpic_url'))?$response->user->userpic_url:"";
|
48 |
-
$this->user->profile->profileURL = (property_exists($response->user,'domain'))?("http://".$response->user->domain):"";
|
49 |
-
$this->user->profile->webSiteURL = (property_exists($response->user->contacts,'website'))?$response->user->contacts->website:"";
|
50 |
-
$this->user->profile->city = (property_exists($response->user,'city'))?$response->user->city:"";
|
51 |
-
$this->user->profile->region = (property_exists($response->user,'state'))?$response->user->state:"";
|
52 |
-
$this->user->profile->country = (property_exists($response->user,'country'))?$response->user->country:"";
|
53 |
-
|
54 |
-
if(property_exists($response->user,'sex')){
|
55 |
-
if($response->user->sex>0){
|
56 |
-
$this->user->profile->gender = ($response->user->sex==1)?"male":"female";
|
57 |
-
}
|
58 |
-
}
|
59 |
-
|
60 |
-
return $this->user->profile;
|
61 |
-
}
|
62 |
-
|
63 |
-
/**
|
64 |
-
* post to 500px
|
65 |
-
*/
|
66 |
-
function setUserStatus( $status )
|
67 |
-
{
|
68 |
-
// README : posting to a 500px.com blog requires the post's TITLE to be set somehow
|
69 |
-
// So it is strongly recommended that you submit status as an ARRAY, like :
|
70 |
-
|
71 |
-
// setUserStatus( array( 'title'=>'YOUR TITLE HERE', 'body'=>'YOUR MESSAGE HERE' ) )
|
72 |
-
|
73 |
-
|
74 |
-
if(is_array($status) && isset($status['title']) && isset($status['body'])){
|
75 |
-
$t = $status['title'];
|
76 |
-
$b = $status['body'];
|
77 |
-
} else {
|
78 |
-
$t = '...';
|
79 |
-
$b = $status;
|
80 |
-
}
|
81 |
-
|
82 |
-
$parameters = array( 'title' => $t, 'body' => $b );
|
83 |
-
$response = $this->api->post( 'blogs', $parameters );
|
84 |
-
|
85 |
-
if ( property_exists($response,'id') ){
|
86 |
-
return $response->id;
|
87 |
-
} else {
|
88 |
-
throw new Exception( "Update user status failed! {$this->providerId} returned an error. " );
|
89 |
-
}
|
90 |
-
|
91 |
-
// this function is for 'plain' blog posting only :
|
92 |
-
// we will commit photo upload soon in an extra function, called setUpload -
|
93 |
-
// because 500px users can also get an additional Upload Key to upload pictures
|
94 |
-
// refer to http://developers.500px.com/docs/upload-post for now
|
95 |
-
}
|
96 |
-
}
|
1 |
+
<?php
|
2 |
+
/*!
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Hybrid_Providers_px500 (500px.com)
|
10 |
+
*/
|
11 |
+
class Hybrid_Providers_px500 extends Hybrid_Provider_Model_OAuth1
|
12 |
+
{
|
13 |
+
/**
|
14 |
+
* IDp wrappers initializer
|
15 |
+
*/
|
16 |
+
function initialize()
|
17 |
+
{
|
18 |
+
parent::initialize();
|
19 |
+
|
20 |
+
// provider api end-points
|
21 |
+
$this->api->api_base_url = "https://api.500px.com/v1/";
|
22 |
+
$this->api->authorize_url = "https://api.500px.com/v1/oauth/authorize";
|
23 |
+
$this->api->request_token_url = "https://api.500px.com/v1/oauth/request_token";
|
24 |
+
$this->api->access_token_url = "https://api.500px.com/v1/oauth/access_token";
|
25 |
+
|
26 |
+
$this->api->curl_auth_header = false;
|
27 |
+
}
|
28 |
+
|
29 |
+
|
30 |
+
/**
|
31 |
+
* load the user profile from the IDp api client
|
32 |
+
*/
|
33 |
+
function getUserProfile()
|
34 |
+
{
|
35 |
+
try{
|
36 |
+
$response = $this->api->get( 'users' );
|
37 |
+
}
|
38 |
+
catch( Exception $e ){
|
39 |
+
throw new Exception( "User profile request failed! {$this->providerId} returned an error while requesting the user profile.", 6 );
|
40 |
+
}
|
41 |
+
|
42 |
+
$this->user->profile->identifier = (property_exists($response->user,'id'))?$response->user->id:"";
|
43 |
+
$this->user->profile->displayName = (property_exists($response->user,'username'))?$response->user->username:"";
|
44 |
+
$this->user->profile->description = (property_exists($response->user,'about'))?$response->user->about:"";
|
45 |
+
$this->user->profile->firstName = (property_exists($response->user,'firstname'))?$response->user->firstname:"";
|
46 |
+
$this->user->profile->lastName = (property_exists($response->user,'lastname'))?$response->user->lastname:"";
|
47 |
+
$this->user->profile->photoURL = (property_exists($response->user,'userpic_url'))?$response->user->userpic_url:"";
|
48 |
+
$this->user->profile->profileURL = (property_exists($response->user,'domain'))?("http://".$response->user->domain):"";
|
49 |
+
$this->user->profile->webSiteURL = (property_exists($response->user->contacts,'website'))?$response->user->contacts->website:"";
|
50 |
+
$this->user->profile->city = (property_exists($response->user,'city'))?$response->user->city:"";
|
51 |
+
$this->user->profile->region = (property_exists($response->user,'state'))?$response->user->state:"";
|
52 |
+
$this->user->profile->country = (property_exists($response->user,'country'))?$response->user->country:"";
|
53 |
+
|
54 |
+
if(property_exists($response->user,'sex')){
|
55 |
+
if($response->user->sex>0){
|
56 |
+
$this->user->profile->gender = ($response->user->sex==1)?"male":"female";
|
57 |
+
}
|
58 |
+
}
|
59 |
+
|
60 |
+
return $this->user->profile;
|
61 |
+
}
|
62 |
+
|
63 |
+
/**
|
64 |
+
* post to 500px
|
65 |
+
*/
|
66 |
+
function setUserStatus( $status )
|
67 |
+
{
|
68 |
+
// README : posting to a 500px.com blog requires the post's TITLE to be set somehow
|
69 |
+
// So it is strongly recommended that you submit status as an ARRAY, like :
|
70 |
+
|
71 |
+
// setUserStatus( array( 'title'=>'YOUR TITLE HERE', 'body'=>'YOUR MESSAGE HERE' ) )
|
72 |
+
|
73 |
+
|
74 |
+
if(is_array($status) && isset($status['title']) && isset($status['body'])){
|
75 |
+
$t = $status['title'];
|
76 |
+
$b = $status['body'];
|
77 |
+
} else {
|
78 |
+
$t = '...';
|
79 |
+
$b = $status;
|
80 |
+
}
|
81 |
+
|
82 |
+
$parameters = array( 'title' => $t, 'body' => $b );
|
83 |
+
$response = $this->api->post( 'blogs', $parameters );
|
84 |
+
|
85 |
+
if ( property_exists($response,'id') ){
|
86 |
+
return $response->id;
|
87 |
+
} else {
|
88 |
+
throw new Exception( "Update user status failed! {$this->providerId} returned an error. " );
|
89 |
+
}
|
90 |
+
|
91 |
+
// this function is for 'plain' blog posting only :
|
92 |
+
// we will commit photo upload soon in an extra function, called setUpload -
|
93 |
+
// because 500px users can also get an additional Upload Key to upload pictures
|
94 |
+
// refer to http://developers.500px.com/docs/upload-post for now
|
95 |
+
}
|
96 |
+
}
|
hybridauth/Hybrid/Storage.php
CHANGED
@@ -1,137 +1,137 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2014, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* HybridAuth storage manager
|
10 |
-
*/
|
11 |
-
class Hybrid_Storage
|
12 |
-
{
|
13 |
-
/**
|
14 |
-
* Constructor
|
15 |
-
*/
|
16 |
-
function __construct()
|
17 |
-
{
|
18 |
-
if ( ! session_id() ){
|
19 |
-
if( ! session_start() ){
|
20 |
-
throw new Exception( "Hybridauth requires the use of 'session_start()' at the start of your script, which appears to be disabled.", 1 );
|
21 |
-
}
|
22 |
-
}
|
23 |
-
|
24 |
-
$this->config( "version", Hybrid_Auth::$version );
|
25 |
-
}
|
26 |
-
|
27 |
-
/**
|
28 |
-
* Config
|
29 |
-
* @param String $key
|
30 |
-
* @param String $value
|
31 |
-
*/
|
32 |
-
public function config($key, $value = null)
|
33 |
-
{
|
34 |
-
$key = strtolower( $key );
|
35 |
-
|
36 |
-
if( $value ){
|
37 |
-
$_SESSION["HA::CONFIG"][$key] = serialize( $value );
|
38 |
-
}
|
39 |
-
elseif( isset( $_SESSION["HA::CONFIG"][$key] ) ){
|
40 |
-
return unserialize( $_SESSION["HA::CONFIG"][$key] );
|
41 |
-
}
|
42 |
-
|
43 |
-
return NULL;
|
44 |
-
}
|
45 |
-
|
46 |
-
/**
|
47 |
-
* Get a key
|
48 |
-
* @param String $key
|
49 |
-
*/
|
50 |
-
public function get($key)
|
51 |
-
{
|
52 |
-
$key = strtolower( $key );
|
53 |
-
|
54 |
-
if( isset( $_SESSION["HA::STORE"], $_SESSION["HA::STORE"][$key] ) ){
|
55 |
-
return unserialize( $_SESSION["HA::STORE"][$key] );
|
56 |
-
}
|
57 |
-
|
58 |
-
return NULL;
|
59 |
-
}
|
60 |
-
|
61 |
-
/**
|
62 |
-
* GEt a set of key and value
|
63 |
-
* @param String $key
|
64 |
-
* @param String $value
|
65 |
-
*/
|
66 |
-
public function set( $key, $value )
|
67 |
-
{
|
68 |
-
$key = strtolower( $key );
|
69 |
-
|
70 |
-
$_SESSION["HA::STORE"][$key] = serialize( $value );
|
71 |
-
}
|
72 |
-
|
73 |
-
/**
|
74 |
-
* Clear session storage
|
75 |
-
*/
|
76 |
-
function clear()
|
77 |
-
{
|
78 |
-
$_SESSION["HA::STORE"] = ARRAY();
|
79 |
-
}
|
80 |
-
|
81 |
-
/**
|
82 |
-
* Delete a specific key
|
83 |
-
* @param String $key
|
84 |
-
*/
|
85 |
-
function delete($key)
|
86 |
-
{
|
87 |
-
$key = strtolower( $key );
|
88 |
-
|
89 |
-
if( isset( $_SESSION["HA::STORE"], $_SESSION["HA::STORE"][$key] ) ){
|
90 |
-
$f = $_SESSION['HA::STORE'];
|
91 |
-
unset($f[$key]);
|
92 |
-
$_SESSION["HA::STORE"] = $f;
|
93 |
-
}
|
94 |
-
}
|
95 |
-
|
96 |
-
/**
|
97 |
-
* Delete a set
|
98 |
-
* @param String $key
|
99 |
-
*/
|
100 |
-
function deleteMatch($key)
|
101 |
-
{
|
102 |
-
$key = strtolower( $key );
|
103 |
-
|
104 |
-
if( isset( $_SESSION["HA::STORE"] ) && count( $_SESSION["HA::STORE"] ) ) {
|
105 |
-
$f = $_SESSION['HA::STORE'];
|
106 |
-
foreach( $f as $k => $v ){
|
107 |
-
if( strstr( $k, $key ) ){
|
108 |
-
unset( $f[ $k ] );
|
109 |
-
}
|
110 |
-
}
|
111 |
-
$_SESSION["HA::STORE"] = $f;
|
112 |
-
|
113 |
-
}
|
114 |
-
}
|
115 |
-
|
116 |
-
/**
|
117 |
-
* Get the storage session data into an array
|
118 |
-
* @return Array
|
119 |
-
*/
|
120 |
-
function getSessionData()
|
121 |
-
{
|
122 |
-
if( isset( $_SESSION["HA::STORE"] ) ){
|
123 |
-
return serialize( $_SESSION["HA::STORE"] );
|
124 |
-
}
|
125 |
-
|
126 |
-
return NULL;
|
127 |
-
}
|
128 |
-
|
129 |
-
/**
|
130 |
-
* Restore the storage back into session from an array
|
131 |
-
* @param Array $sessiondata
|
132 |
-
*/
|
133 |
-
function restoreSessionData( $sessiondata = NULL )
|
134 |
-
{
|
135 |
-
$_SESSION["HA::STORE"] = unserialize( $sessiondata );
|
136 |
-
}
|
137 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2014, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* HybridAuth storage manager
|
10 |
+
*/
|
11 |
+
class Hybrid_Storage
|
12 |
+
{
|
13 |
+
/**
|
14 |
+
* Constructor
|
15 |
+
*/
|
16 |
+
function __construct()
|
17 |
+
{
|
18 |
+
if ( ! session_id() ){
|
19 |
+
if( ! session_start() ){
|
20 |
+
throw new Exception( "Hybridauth requires the use of 'session_start()' at the start of your script, which appears to be disabled.", 1 );
|
21 |
+
}
|
22 |
+
}
|
23 |
+
|
24 |
+
$this->config( "version", Hybrid_Auth::$version );
|
25 |
+
}
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Config
|
29 |
+
* @param String $key
|
30 |
+
* @param String $value
|
31 |
+
*/
|
32 |
+
public function config($key, $value = null)
|
33 |
+
{
|
34 |
+
$key = strtolower( $key );
|
35 |
+
|
36 |
+
if( $value ){
|
37 |
+
$_SESSION["HA::CONFIG"][$key] = serialize( $value );
|
38 |
+
}
|
39 |
+
elseif( isset( $_SESSION["HA::CONFIG"][$key] ) ){
|
40 |
+
return unserialize( $_SESSION["HA::CONFIG"][$key] );
|
41 |
+
}
|
42 |
+
|
43 |
+
return NULL;
|
44 |
+
}
|
45 |
+
|
46 |
+
/**
|
47 |
+
* Get a key
|
48 |
+
* @param String $key
|
49 |
+
*/
|
50 |
+
public function get($key)
|
51 |
+
{
|
52 |
+
$key = strtolower( $key );
|
53 |
+
|
54 |
+
if( isset( $_SESSION["HA::STORE"], $_SESSION["HA::STORE"][$key] ) ){
|
55 |
+
return unserialize( $_SESSION["HA::STORE"][$key] );
|
56 |
+
}
|
57 |
+
|
58 |
+
return NULL;
|
59 |
+
}
|
60 |
+
|
61 |
+
/**
|
62 |
+
* GEt a set of key and value
|
63 |
+
* @param String $key
|
64 |
+
* @param String $value
|
65 |
+
*/
|
66 |
+
public function set( $key, $value )
|
67 |
+
{
|
68 |
+
$key = strtolower( $key );
|
69 |
+
|
70 |
+
$_SESSION["HA::STORE"][$key] = serialize( $value );
|
71 |
+
}
|
72 |
+
|
73 |
+
/**
|
74 |
+
* Clear session storage
|
75 |
+
*/
|
76 |
+
function clear()
|
77 |
+
{
|
78 |
+
$_SESSION["HA::STORE"] = ARRAY();
|
79 |
+
}
|
80 |
+
|
81 |
+
/**
|
82 |
+
* Delete a specific key
|
83 |
+
* @param String $key
|
84 |
+
*/
|
85 |
+
function delete($key)
|
86 |
+
{
|
87 |
+
$key = strtolower( $key );
|
88 |
+
|
89 |
+
if( isset( $_SESSION["HA::STORE"], $_SESSION["HA::STORE"][$key] ) ){
|
90 |
+
$f = $_SESSION['HA::STORE'];
|
91 |
+
unset($f[$key]);
|
92 |
+
$_SESSION["HA::STORE"] = $f;
|
93 |
+
}
|
94 |
+
}
|
95 |
+
|
96 |
+
/**
|
97 |
+
* Delete a set
|
98 |
+
* @param String $key
|
99 |
+
*/
|
100 |
+
function deleteMatch($key)
|
101 |
+
{
|
102 |
+
$key = strtolower( $key );
|
103 |
+
|
104 |
+
if( isset( $_SESSION["HA::STORE"] ) && count( $_SESSION["HA::STORE"] ) ) {
|
105 |
+
$f = $_SESSION['HA::STORE'];
|
106 |
+
foreach( $f as $k => $v ){
|
107 |
+
if( strstr( $k, $key ) ){
|
108 |
+
unset( $f[ $k ] );
|
109 |
+
}
|
110 |
+
}
|
111 |
+
$_SESSION["HA::STORE"] = $f;
|
112 |
+
|
113 |
+
}
|
114 |
+
}
|
115 |
+
|
116 |
+
/**
|
117 |
+
* Get the storage session data into an array
|
118 |
+
* @return Array
|
119 |
+
*/
|
120 |
+
function getSessionData()
|
121 |
+
{
|
122 |
+
if( isset( $_SESSION["HA::STORE"] ) ){
|
123 |
+
return serialize( $_SESSION["HA::STORE"] );
|
124 |
+
}
|
125 |
+
|
126 |
+
return NULL;
|
127 |
+
}
|
128 |
+
|
129 |
+
/**
|
130 |
+
* Restore the storage back into session from an array
|
131 |
+
* @param Array $sessiondata
|
132 |
+
*/
|
133 |
+
function restoreSessionData( $sessiondata = NULL )
|
134 |
+
{
|
135 |
+
$_SESSION["HA::STORE"] = unserialize( $sessiondata );
|
136 |
+
}
|
137 |
+
}
|
hybridauth/Hybrid/User.php
CHANGED
@@ -1,40 +1,40 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2014, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* The Hybrid_User class represents the current logged in user
|
10 |
-
*/
|
11 |
-
class Hybrid_User
|
12 |
-
{
|
13 |
-
/**
|
14 |
-
* The ID (name) of the connected provider
|
15 |
-
* @var Numeric/String
|
16 |
-
*/
|
17 |
-
public $providerId = NULL;
|
18 |
-
|
19 |
-
/**
|
20 |
-
* timestamp connection to the provider
|
21 |
-
* @var timestamp
|
22 |
-
*/
|
23 |
-
public $timestamp = NULL;
|
24 |
-
|
25 |
-
/**
|
26 |
-
* User profile, contains the list of fields available in the normalized user profile structure used by HybridAuth.
|
27 |
-
* @var object
|
28 |
-
*/
|
29 |
-
public $profile = NULL;
|
30 |
-
|
31 |
-
/**
|
32 |
-
* Initialize the user object.
|
33 |
-
*/
|
34 |
-
function __construct()
|
35 |
-
{
|
36 |
-
$this->timestamp = time();
|
37 |
-
|
38 |
-
$this->profile = new Hybrid_User_Profile();
|
39 |
-
}
|
40 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2014, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* The Hybrid_User class represents the current logged in user
|
10 |
+
*/
|
11 |
+
class Hybrid_User
|
12 |
+
{
|
13 |
+
/**
|
14 |
+
* The ID (name) of the connected provider
|
15 |
+
* @var Numeric/String
|
16 |
+
*/
|
17 |
+
public $providerId = NULL;
|
18 |
+
|
19 |
+
/**
|
20 |
+
* timestamp connection to the provider
|
21 |
+
* @var timestamp
|
22 |
+
*/
|
23 |
+
public $timestamp = NULL;
|
24 |
+
|
25 |
+
/**
|
26 |
+
* User profile, contains the list of fields available in the normalized user profile structure used by HybridAuth.
|
27 |
+
* @var object
|
28 |
+
*/
|
29 |
+
public $profile = NULL;
|
30 |
+
|
31 |
+
/**
|
32 |
+
* Initialize the user object.
|
33 |
+
*/
|
34 |
+
function __construct()
|
35 |
+
{
|
36 |
+
$this->timestamp = time();
|
37 |
+
|
38 |
+
$this->profile = new Hybrid_User_Profile();
|
39 |
+
}
|
40 |
+
}
|
hybridauth/Hybrid/User_Activity.php
CHANGED
@@ -1,54 +1,54 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2014, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Hybrid_User_Activity
|
10 |
-
*
|
11 |
-
* used to provider the connected user activity stream on a standardized structure across supported social apis.
|
12 |
-
*
|
13 |
-
* http://hybridauth.sourceforge.net/userguide/Profile_Data_User_Activity.html
|
14 |
-
*/
|
15 |
-
class Hybrid_User_Activity
|
16 |
-
{
|
17 |
-
/**
|
18 |
-
* activity id on the provider side, usually given as integer
|
19 |
-
* @var Numeric/String
|
20 |
-
*/
|
21 |
-
public $id = NULL;
|
22 |
-
|
23 |
-
/**
|
24 |
-
* activity date of creation
|
25 |
-
* @var timestamp
|
26 |
-
*/
|
27 |
-
public $date = NULL;
|
28 |
-
|
29 |
-
/**
|
30 |
-
* activity content as a string
|
31 |
-
* @var String
|
32 |
-
*/
|
33 |
-
public $text = NULL;
|
34 |
-
|
35 |
-
/**
|
36 |
-
* user who created the activity
|
37 |
-
* @var object
|
38 |
-
*/
|
39 |
-
public $user = NULL;
|
40 |
-
|
41 |
-
/**
|
42 |
-
* Constructor
|
43 |
-
*/
|
44 |
-
public function __construct()
|
45 |
-
{
|
46 |
-
$this->user = new stdClass();
|
47 |
-
|
48 |
-
// typically, we should have a few information about the user who created the event from social apis
|
49 |
-
$this->user->identifier = NULL;
|
50 |
-
$this->user->displayName = NULL;
|
51 |
-
$this->user->profileURL = NULL;
|
52 |
-
$this->user->photoURL = NULL;
|
53 |
-
}
|
54 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2014, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Hybrid_User_Activity
|
10 |
+
*
|
11 |
+
* used to provider the connected user activity stream on a standardized structure across supported social apis.
|
12 |
+
*
|
13 |
+
* http://hybridauth.sourceforge.net/userguide/Profile_Data_User_Activity.html
|
14 |
+
*/
|
15 |
+
class Hybrid_User_Activity
|
16 |
+
{
|
17 |
+
/**
|
18 |
+
* activity id on the provider side, usually given as integer
|
19 |
+
* @var Numeric/String
|
20 |
+
*/
|
21 |
+
public $id = NULL;
|
22 |
+
|
23 |
+
/**
|
24 |
+
* activity date of creation
|
25 |
+
* @var timestamp
|
26 |
+
*/
|
27 |
+
public $date = NULL;
|
28 |
+
|
29 |
+
/**
|
30 |
+
* activity content as a string
|
31 |
+
* @var String
|
32 |
+
*/
|
33 |
+
public $text = NULL;
|
34 |
+
|
35 |
+
/**
|
36 |
+
* user who created the activity
|
37 |
+
* @var object
|
38 |
+
*/
|
39 |
+
public $user = NULL;
|
40 |
+
|
41 |
+
/**
|
42 |
+
* Constructor
|
43 |
+
*/
|
44 |
+
public function __construct()
|
45 |
+
{
|
46 |
+
$this->user = new stdClass();
|
47 |
+
|
48 |
+
// typically, we should have a few information about the user who created the event from social apis
|
49 |
+
$this->user->identifier = NULL;
|
50 |
+
$this->user->displayName = NULL;
|
51 |
+
$this->user->profileURL = NULL;
|
52 |
+
$this->user->photoURL = NULL;
|
53 |
+
}
|
54 |
+
}
|
hybridauth/Hybrid/User_Contact.php
CHANGED
@@ -1,58 +1,58 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2014, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Hybrid_User_Contact
|
10 |
-
*
|
11 |
-
* used to provider the connected user contacts list on a standardized structure across supported social apis.
|
12 |
-
*
|
13 |
-
* http://hybridauth.sourceforge.net/userguide/Profile_Data_User_Contacts.html
|
14 |
-
*/
|
15 |
-
class Hybrid_User_Contact
|
16 |
-
{
|
17 |
-
/**
|
18 |
-
* The Unique contact user ID
|
19 |
-
* @var Numeric
|
20 |
-
*/
|
21 |
-
public $identifier = NULL;
|
22 |
-
|
23 |
-
/**
|
24 |
-
* User website, blog, web page
|
25 |
-
* @var String
|
26 |
-
*/
|
27 |
-
public $webSiteURL = NULL;
|
28 |
-
|
29 |
-
/**
|
30 |
-
* URL link to profile page on the IDp web site
|
31 |
-
* @var String
|
32 |
-
*/
|
33 |
-
public $profileURL = NULL;
|
34 |
-
|
35 |
-
/**
|
36 |
-
* URL link to user photo or avatar
|
37 |
-
* @var String
|
38 |
-
*/
|
39 |
-
public $photoURL = NULL;
|
40 |
-
|
41 |
-
/**
|
42 |
-
* User displayName provided by the IDp or a concatenation of first and last name
|
43 |
-
* @var String
|
44 |
-
*/
|
45 |
-
public $displayName = NULL;
|
46 |
-
|
47 |
-
/**
|
48 |
-
* A short about_me
|
49 |
-
* @var String
|
50 |
-
*/
|
51 |
-
public $description = NULL;
|
52 |
-
|
53 |
-
/**
|
54 |
-
* User email. Not all of IDp grant access to the user email
|
55 |
-
* @var String
|
56 |
-
*/
|
57 |
-
public $email = NULL;
|
58 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2014, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Hybrid_User_Contact
|
10 |
+
*
|
11 |
+
* used to provider the connected user contacts list on a standardized structure across supported social apis.
|
12 |
+
*
|
13 |
+
* http://hybridauth.sourceforge.net/userguide/Profile_Data_User_Contacts.html
|
14 |
+
*/
|
15 |
+
class Hybrid_User_Contact
|
16 |
+
{
|
17 |
+
/**
|
18 |
+
* The Unique contact user ID
|
19 |
+
* @var Numeric
|
20 |
+
*/
|
21 |
+
public $identifier = NULL;
|
22 |
+
|
23 |
+
/**
|
24 |
+
* User website, blog, web page
|
25 |
+
* @var String
|
26 |
+
*/
|
27 |
+
public $webSiteURL = NULL;
|
28 |
+
|
29 |
+
/**
|
30 |
+
* URL link to profile page on the IDp web site
|
31 |
+
* @var String
|
32 |
+
*/
|
33 |
+
public $profileURL = NULL;
|
34 |
+
|
35 |
+
/**
|
36 |
+
* URL link to user photo or avatar
|
37 |
+
* @var String
|
38 |
+
*/
|
39 |
+
public $photoURL = NULL;
|
40 |
+
|
41 |
+
/**
|
42 |
+
* User displayName provided by the IDp or a concatenation of first and last name
|
43 |
+
* @var String
|
44 |
+
*/
|
45 |
+
public $displayName = NULL;
|
46 |
+
|
47 |
+
/**
|
48 |
+
* A short about_me
|
49 |
+
* @var String
|
50 |
+
*/
|
51 |
+
public $description = NULL;
|
52 |
+
|
53 |
+
/**
|
54 |
+
* User email. Not all of IDp grant access to the user email
|
55 |
+
* @var String
|
56 |
+
*/
|
57 |
+
public $email = NULL;
|
58 |
+
}
|
hybridauth/Hybrid/User_Profile.php
CHANGED
@@ -1,150 +1,150 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* HybridAuth
|
4 |
-
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
-
* (c) 2009-2014, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
-
*/
|
7 |
-
|
8 |
-
/**
|
9 |
-
* Hybrid_User_Profile object represents the current logged in user profile.
|
10 |
-
* The list of fields available in the normalized user profile structure used by HybridAuth.
|
11 |
-
*
|
12 |
-
* The Hybrid_User_Profile object is populated with as much information about the user as
|
13 |
-
* HybridAuth was able to pull from the given API or authentication provider.
|
14 |
-
*
|
15 |
-
* http://hybridauth.sourceforge.net/userguide/Profile_Data_User_Profile.html
|
16 |
-
*/
|
17 |
-
class Hybrid_User_Profile
|
18 |
-
{
|
19 |
-
/**
|
20 |
-
* The Unique user's ID on the connected provider
|
21 |
-
* @var Numeric
|
22 |
-
*/
|
23 |
-
public $identifier = NULL;
|
24 |
-
|
25 |
-
/**
|
26 |
-
* User website, blog, web page
|
27 |
-
* @var String
|
28 |
-
*/
|
29 |
-
public $webSiteURL = NULL;
|
30 |
-
|
31 |
-
/**
|
32 |
-
* URL link to profile page on the IDp web site
|
33 |
-
* @var String
|
34 |
-
*/
|
35 |
-
public $profileURL = NULL;
|
36 |
-
|
37 |
-
/**
|
38 |
-
* URL link to user photo or avatar
|
39 |
-
* @var String
|
40 |
-
*/
|
41 |
-
public $photoURL = NULL;
|
42 |
-
|
43 |
-
/**
|
44 |
-
* User displayName provided by the IDp or a concatenation of first and last name.
|
45 |
-
* @var String
|
46 |
-
*/
|
47 |
-
public $displayName = NULL;
|
48 |
-
|
49 |
-
/**
|
50 |
-
* A short about_me
|
51 |
-
* @var String
|
52 |
-
*/
|
53 |
-
public $description = NULL;
|
54 |
-
|
55 |
-
/**
|
56 |
-
* User's first name
|
57 |
-
* @var String
|
58 |
-
*/
|
59 |
-
public $firstName = NULL;
|
60 |
-
|
61 |
-
/**
|
62 |
-
* User's last name
|
63 |
-
* @var String
|
64 |
-
*/
|
65 |
-
public $lastName = NULL;
|
66 |
-
|
67 |
-
/**
|
68 |
-
* male or female
|
69 |
-
* @var String
|
70 |
-
*/
|
71 |
-
public $gender = NULL;
|
72 |
-
|
73 |
-
/**
|
74 |
-
* Language
|
75 |
-
* @var String
|
76 |
-
*/
|
77 |
-
public $language = NULL;
|
78 |
-
|
79 |
-
/**
|
80 |
-
* User age, we don't calculate it. we return it as is if the IDp provide it.
|
81 |
-
* @var Numeric
|
82 |
-
*/
|
83 |
-
public $age = NULL;
|
84 |
-
|
85 |
-
/**
|
86 |
-
* User birth Day
|
87 |
-
* @var Numeric
|
88 |
-
*/
|
89 |
-
public $birthDay = NULL;
|
90 |
-
|
91 |
-
/**
|
92 |
-
* User birth Month
|
93 |
-
* @var Numeric/String
|
94 |
-
*/
|
95 |
-
public $birthMonth = NULL;
|
96 |
-
|
97 |
-
/**
|
98 |
-
* User birth Year
|
99 |
-
* @var Numeric
|
100 |
-
*/
|
101 |
-
public $birthYear = NULL;
|
102 |
-
|
103 |
-
/**
|
104 |
-
* User email. Note: not all of IDp grant access to the user email
|
105 |
-
* @var String
|
106 |
-
*/
|
107 |
-
public $email = NULL;
|
108 |
-
|
109 |
-
/**
|
110 |
-
* Verified user email. Note: not all of IDp grant access to verified user email
|
111 |
-
* @var String
|
112 |
-
*/
|
113 |
-
public $emailVerified = NULL;
|
114 |
-
|
115 |
-
/**
|
116 |
-
* Phone number
|
117 |
-
* @var String
|
118 |
-
*/
|
119 |
-
public $phone = NULL;
|
120 |
-
|
121 |
-
/**
|
122 |
-
* Complete user address
|
123 |
-
* @var String
|
124 |
-
*/
|
125 |
-
public $address = NULL;
|
126 |
-
|
127 |
-
/**
|
128 |
-
* User country
|
129 |
-
* @var String
|
130 |
-
*/
|
131 |
-
public $country = NULL;
|
132 |
-
|
133 |
-
/**
|
134 |
-
* Region
|
135 |
-
* @var String
|
136 |
-
*/
|
137 |
-
public $region = NULL;
|
138 |
-
|
139 |
-
/**
|
140 |
-
* City
|
141 |
-
* @var String
|
142 |
-
*/
|
143 |
-
public $city = NULL;
|
144 |
-
|
145 |
-
/**
|
146 |
-
* Postal code
|
147 |
-
* @var String
|
148 |
-
*/
|
149 |
-
public $zip = NULL;
|
150 |
-
}
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* HybridAuth
|
4 |
+
* http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth
|
5 |
+
* (c) 2009-2014, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html
|
6 |
+
*/
|
7 |
+
|
8 |
+
/**
|
9 |
+
* Hybrid_User_Profile object represents the current logged in user profile.
|
10 |
+
* The list of fields available in the normalized user profile structure used by HybridAuth.
|
11 |
+
*
|
12 |
+
* The Hybrid_User_Profile object is populated with as much information about the user as
|
13 |
+
* HybridAuth was able to pull from the given API or authentication provider.
|
14 |
+
*
|
15 |
+
* http://hybridauth.sourceforge.net/userguide/Profile_Data_User_Profile.html
|
16 |
+
*/
|
17 |
+
class Hybrid_User_Profile
|
18 |
+
{
|
19 |
+
/**
|
20 |
+
* The Unique user's ID on the connected provider
|
21 |
+
* @var Numeric
|
22 |
+
*/
|
23 |
+
public $identifier = NULL;
|
24 |
+
|
25 |
+
/**
|
26 |
+
* User website, blog, web page
|
27 |
+
* @var String
|
28 |
+
*/
|
29 |
+
public $webSiteURL = NULL;
|
30 |
+
|
31 |
+
/**
|
32 |
+
* URL link to profile page on the IDp web site
|
33 |
+
* @var String
|
34 |
+
*/
|
35 |
+
public $profileURL = NULL;
|
36 |
+
|
37 |
+
/**
|
38 |
+
* URL link to user photo or avatar
|
39 |
+
* @var String
|
40 |
+
*/
|
41 |
+
public $photoURL = NULL;
|
42 |
+
|
43 |
+
/**
|
44 |
+
* User displayName provided by the IDp or a concatenation of first and last name.
|
45 |
+
* @var String
|
46 |
+
*/
|
47 |
+
public $displayName = NULL;
|
48 |
+
|
49 |
+
/**
|
50 |
+
* A short about_me
|
51 |
+
* @var String
|
52 |
+
*/
|
53 |
+
public $description = NULL;
|
54 |
+
|
55 |
+
/**
|
56 |
+
* User's first name
|
57 |
+
* @var String
|
58 |
+
*/
|
59 |
+
public $firstName = NULL;
|
60 |
+
|
61 |
+
/**
|
62 |
+
* User's last name
|
63 |
+
* @var String
|
64 |
+
*/
|
65 |
+
public $lastName = NULL;
|
66 |
+
|
67 |
+
/**
|
68 |
+
* male or female
|
69 |
+
* @var String
|
70 |
+
*/
|
71 |
+
public $gender = NULL;
|
72 |
+
|
73 |
+
/**
|
74 |
+
* Language
|
75 |
+
* @var String
|
76 |
+
*/
|
77 |
+
public $language = NULL;
|
78 |
+
|
79 |
+
/**
|
80 |
+
* User age, we don't calculate it. we return it as is if the IDp provide it.
|
81 |
+
* @var Numeric
|
82 |
+
*/
|
83 |
+
public $age = NULL;
|
84 |
+
|
85 |
+
/**
|
86 |
+
* User birth Day
|
87 |
+
* @var Numeric
|
88 |
+
*/
|
89 |
+
public $birthDay = NULL;
|
90 |
+
|
91 |
+
/**
|
92 |
+
* User birth Month
|
93 |
+
* @var Numeric/String
|
94 |
+
*/
|
95 |
+
public $birthMonth = NULL;
|
96 |
+
|
97 |
+
/**
|
98 |
+
* User birth Year
|
99 |
+
* @var Numeric
|
100 |
+
*/
|
101 |
+
public $birthYear = NULL;
|
102 |
+
|
103 |
+
/**
|
104 |
+
* User email. Note: not all of IDp grant access to the user email
|
105 |
+
* @var String
|
106 |
+
*/
|
107 |
+
public $email = NULL;
|
108 |
+
|
109 |
+
/**
|
110 |
+
* Verified user email. Note: not all of IDp grant access to verified user email
|
111 |
+
* @var String
|
112 |
+
*/
|
113 |
+
public $emailVerified = NULL;
|
114 |
+
|
115 |
+
/**
|
116 |
+
* Phone number
|
117 |
+
* @var String
|
118 |
+
*/
|
119 |
+
public $phone = NULL;
|
120 |
+
|
121 |
+
/**
|
122 |
+
* Complete user address
|
123 |
+
* @var String
|
124 |
+
*/
|
125 |
+
public $address = NULL;
|
126 |
+
|
127 |
+
/**
|
128 |
+
* User country
|
129 |
+
* @var String
|
130 |
+
*/
|
131 |
+
public $country = NULL;
|
132 |
+
|
133 |
+
/**
|
134 |
+
* Region
|
135 |
+
* @var String
|
136 |
+
*/
|
137 |
+
public $region = NULL;
|
138 |
+
|
139 |
+
/**
|
140 |
+
* City
|
141 |
+
* @var String
|
142 |
+
*/
|
143 |
+
public $city = NULL;
|
144 |
+
|
145 |
+
/**
|
146 |
+
* Postal code
|
147 |
+
* @var String
|
148 |
+
*/
|
149 |
+
public $zip = NULL;
|
150 |
+
}
|
hybridauth/Hybrid/index.html
CHANGED
@@ -1,10 +1,10 @@
|
|
1 |
-
<html>
|
2 |
-
<head>
|
3 |
-
<title>403 Forbidden</title>
|
4 |
-
</head>
|
5 |
-
<body>
|
6 |
-
|
7 |
-
<p>Directory access is forbidden.</p>
|
8 |
-
|
9 |
-
</body>
|
10 |
</html>
|
1 |
+
<html>
|
2 |
+
<head>
|
3 |
+
<title>403 Forbidden</title>
|
4 |
+
</head>
|
5 |
+
<body>
|
6 |
+
|
7 |
+
<p>Directory access is forbidden.</p>
|
8 |
+
|
9 |
+
</body>
|
10 |
</html>
|
hybridauth/Hybrid/resources/index.html
CHANGED
@@ -1,10 +1,10 @@
|
|
1 |
-
<html>
|
2 |
-
<head>
|
3 |
-
<title>403 Forbidden</title>
|
4 |
-
</head>
|
5 |
-
<body>
|
6 |
-
|
7 |
-
<p>Directory access is forbidden.</p>
|
8 |
-
|
9 |
-
</body>
|
10 |
</html>
|
1 |
+
<html>
|
2 |
+
<head>
|
3 |
+
<title>403 Forbidden</title>
|
4 |
+
</head>
|
5 |
+
<body>
|
6 |
+
|
7 |
+
<p>Directory access is forbidden.</p>
|
8 |
+
|
9 |
+
</body>
|
10 |
</html>
|
hybridauth/Hybrid/resources/openid_policy.html
CHANGED
@@ -1,10 +1,10 @@
|
|
1 |
-
<html>
|
2 |
-
<head>
|
3 |
-
<title>OpenID Policy</title>
|
4 |
-
</head>
|
5 |
-
<body>
|
6 |
-
<!--
|
7 |
-
Set here your OpenID Policy,
|
8 |
-
-->
|
9 |
-
</body>
|
10 |
</html>
|
1 |
+
<html>
|
2 |
+
<head>
|
3 |
+
<title>OpenID Policy</title>
|
4 |
+
</head>
|
5 |
+
<body>
|
6 |
+
<!--
|
7 |
+
Set here your OpenID Policy,
|
8 |
+
-->
|
9 |
+
</body>
|
10 |
</html>
|
hybridauth/Hybrid/resources/openid_realm.html
CHANGED
@@ -1,31 +1,31 @@
|
|
1 |
-
<html>
|
2 |
-
<head>
|
3 |
-
<meta name="robots" content="noindex, nofollow">
|
4 |
-
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
5 |
-
<title>WordPress Social Login Endpoint</title>
|
6 |
-
<style type="text/css">
|
7 |
-
* {
|
8 |
-
margin: 0;
|
9 |
-
padding: 0;
|
10 |
-
}
|
11 |
-
body {
|
12 |
-
background: #333;
|
13 |
-
}
|
14 |
-
h1 {
|
15 |
-
color: white;
|
16 |
-
font: 45px 'Open Sans';
|
17 |
-
padding: 30px;
|
18 |
-
}
|
19 |
-
p {
|
20 |
-
color: white;
|
21 |
-
font: 15px 'Open Sans';
|
22 |
-
padding: 0 30px;
|
23 |
-
}
|
24 |
-
</style>
|
25 |
-
</head>
|
26 |
-
<body>
|
27 |
-
<h1>WordPress Social Login Endpoint.</h1>
|
28 |
-
|
29 |
-
<p>200. Thanks for stopping by!</p>
|
30 |
-
</body>
|
31 |
-
</html>
|
1 |
+
<html>
|
2 |
+
<head>
|
3 |
+
<meta name="robots" content="noindex, nofollow">
|
4 |
+
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
5 |
+
<title>WordPress Social Login Endpoint</title>
|
6 |
+
<style type="text/css">
|
7 |
+
* {
|
8 |
+
margin: 0;
|
9 |
+
padding: 0;
|
10 |
+
}
|
11 |
+
body {
|
12 |
+
background: #333;
|
13 |
+
}
|
14 |
+
h1 {
|
15 |
+
color: white;
|
16 |
+
font: 45px 'Open Sans';
|
17 |
+
padding: 30px;
|
18 |
+
}
|
19 |
+
p {
|
20 |
+
color: white;
|
21 |
+
font: 15px 'Open Sans';
|
22 |
+
padding: 0 30px;
|
23 |
+
}
|
24 |
+
</style>
|
25 |
+
</head>
|
26 |
+
<body>
|
27 |
+
<h1>WordPress Social Login Endpoint.</h1>
|
28 |
+
|
29 |
+
<p>200. Thanks for stopping by!</p>
|
30 |
+
</body>
|
31 |
+
</html>
|
hybridauth/Hybrid/resources/openid_xrds.xml
CHANGED
@@ -1,12 +1,12 @@
|
|
1 |
-
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
-
<xrds:XRDS
|
3 |
-
xmlns:xrds="xri://$xrds"
|
4 |
-
xmlns:openid="http://openid.net/xmlns/1.0"
|
5 |
-
xmlns="xri://$xrd*($v*2.0)">
|
6 |
-
<XRD>
|
7 |
-
<Service priority="1">
|
8 |
-
<Type>http://specs.openid.net/auth/2.0/return_to</Type>
|
9 |
-
<URI>{RETURN_TO_URL}</URI>
|
10 |
-
</Service>
|
11 |
-
</XRD>
|
12 |
</xrds:XRDS>
|
1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
+
<xrds:XRDS
|
3 |
+
xmlns:xrds="xri://$xrds"
|
4 |
+
xmlns:openid="http://openid.net/xmlns/1.0"
|
5 |
+
xmlns="xri://$xrd*($v*2.0)">
|
6 |
+
<XRD>
|
7 |
+
<Service priority="1">
|
8 |
+
<Type>http://specs.openid.net/auth/2.0/return_to</Type>
|
9 |
+
<URI>{RETURN_TO_URL}</URI>
|
10 |
+
</Service>
|
11 |
+
</XRD>
|
12 |
</xrds:XRDS>
|
hybridauth/Hybrid/thirdparty/Facebook/Authentication/AccessToken.php
ADDED
@@ -0,0 +1,160 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\Authentication;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class AccessToken
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
class AccessToken
|
32 |
+
{
|
33 |
+
/**
|
34 |
+
* The access token value.
|
35 |
+
*
|
36 |
+
* @var string
|
37 |
+
*/
|
38 |
+
protected $value = '';
|
39 |
+
|
40 |
+
/**
|
41 |
+
* Date when token expires.
|
42 |
+
*
|
43 |
+
* @var \DateTime|null
|
44 |
+
*/
|
45 |
+
protected $expiresAt;
|
46 |
+
|
47 |
+
/**
|
48 |
+
* Create a new access token entity.
|
49 |
+
*
|
50 |
+
* @param string $accessToken
|
51 |
+
* @param int $expiresAt
|
52 |
+
*/
|
53 |
+
public function __construct($accessToken, $expiresAt = 0)
|
54 |
+
{
|
55 |
+
$this->value = $accessToken;
|
56 |
+
if ($expiresAt) {
|
57 |
+
$this->setExpiresAtFromTimeStamp($expiresAt);
|
58 |
+
}
|
59 |
+
}
|
60 |
+
|
61 |
+
/**
|
62 |
+
* Generate an app secret proof to sign a request to Graph.
|
63 |
+
*
|
64 |
+
* @param string $appSecret The app secret.
|
65 |
+
*
|
66 |
+
* @return string
|
67 |
+
*/
|
68 |
+
public function getAppSecretProof($appSecret)
|
69 |
+
{
|
70 |
+
return hash_hmac('sha256', $this->value, $appSecret);
|
71 |
+
}
|
72 |
+
|
73 |
+
/**
|
74 |
+
* Getter for expiresAt.
|
75 |
+
*
|
76 |
+
* @return \DateTime|null
|
77 |
+
*/
|
78 |
+
public function getExpiresAt()
|
79 |
+
{
|
80 |
+
return $this->expiresAt;
|
81 |
+
}
|
82 |
+
|
83 |
+
/**
|
84 |
+
* Determines whether or not this is an app access token.
|
85 |
+
*
|
86 |
+
* @return bool
|
87 |
+
*/
|
88 |
+
public function isAppAccessToken()
|
89 |
+
{
|
90 |
+
return strpos($this->value, '|') !== false;
|
91 |
+
}
|
92 |
+
|
93 |
+
/**
|
94 |
+
* Determines whether or not this is a long-lived token.
|
95 |
+
*
|
96 |
+
* @return bool
|
97 |
+
*/
|
98 |
+
public function isLongLived()
|
99 |
+
{
|
100 |
+
if ($this->expiresAt) {
|
101 |
+
return $this->expiresAt->getTimestamp() > time() + (60 * 60 * 2);
|
102 |
+
}
|
103 |
+
|
104 |
+
if ($this->isAppAccessToken()) {
|
105 |
+
return true;
|
106 |
+
}
|
107 |
+
|
108 |
+
return false;
|
109 |
+
}
|
110 |
+
|
111 |
+
/**
|
112 |
+
* Checks the expiration of the access token.
|
113 |
+
*
|
114 |
+
* @return boolean|null
|
115 |
+
*/
|
116 |
+
public function isExpired()
|
117 |
+
{
|
118 |
+
if ($this->getExpiresAt() instanceof \DateTime) {
|
119 |
+
return $this->getExpiresAt()->getTimestamp() < time();
|
120 |
+
}
|
121 |
+
|
122 |
+
if ($this->isAppAccessToken()) {
|
123 |
+
return false;
|
124 |
+
}
|
125 |
+
|
126 |
+
return null;
|
127 |
+
}
|
128 |
+
|
129 |
+
/**
|
130 |
+
* Returns the access token as a string.
|
131 |
+
*
|
132 |
+
* @return string
|
133 |
+
*/
|
134 |
+
public function getValue()
|
135 |
+
{
|
136 |
+
return $this->value;
|
137 |
+
}
|
138 |
+
|
139 |
+
/**
|
140 |
+
* Returns the access token as a string.
|
141 |
+
*
|
142 |
+
* @return string
|
143 |
+
*/
|
144 |
+
public function __toString()
|
145 |
+
{
|
146 |
+
return $this->getValue();
|
147 |
+
}
|
148 |
+
|
149 |
+
/**
|
150 |
+
* Setter for expires_at.
|
151 |
+
*
|
152 |
+
* @param int $timeStamp
|
153 |
+
*/
|
154 |
+
protected function setExpiresAtFromTimeStamp($timeStamp)
|
155 |
+
{
|
156 |
+
$dt = new \DateTime();
|
157 |
+
$dt->setTimestamp($timeStamp);
|
158 |
+
$this->expiresAt = $dt;
|
159 |
+
}
|
160 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/Authentication/AccessTokenMetadata.php
ADDED
@@ -0,0 +1,390 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\Authentication;
|
25 |
+
|
26 |
+
use Facebook\Exceptions\FacebookSDKException;
|
27 |
+
|
28 |
+
/**
|
29 |
+
* Class AccessTokenMetadata
|
30 |
+
*
|
31 |
+
* Represents metadata from an access token.
|
32 |
+
*
|
33 |
+
* @package Facebook
|
34 |
+
* @see https://developers.facebook.com/docs/graph-api/reference/debug_token
|
35 |
+
*/
|
36 |
+
class AccessTokenMetadata
|
37 |
+
{
|
38 |
+
/**
|
39 |
+
* The access token metadata.
|
40 |
+
*
|
41 |
+
* @var array
|
42 |
+
*/
|
43 |
+
protected $metadata = [];
|
44 |
+
|
45 |
+
/**
|
46 |
+
* Properties that should be cast as DateTime objects.
|
47 |
+
*
|
48 |
+
* @var array
|
49 |
+
*/
|
50 |
+
protected static $dateProperties = ['expires_at', 'issued_at'];
|
51 |
+
|
52 |
+
/**
|
53 |
+
* @param array $metadata
|
54 |
+
*
|
55 |
+
* @throws FacebookSDKException
|
56 |
+
*/
|
57 |
+
public function __construct(array $metadata)
|
58 |
+
{
|
59 |
+
if (!isset($metadata['data'])) {
|
60 |
+
throw new FacebookSDKException('Unexpected debug token response data.', 401);
|
61 |
+
}
|
62 |
+
|
63 |
+
$this->metadata = $metadata['data'];
|
64 |
+
|
65 |
+
$this->castTimestampsToDateTime();
|
66 |
+
}
|
67 |
+
|
68 |
+
/**
|
69 |
+
* Returns a value from the metadata.
|
70 |
+
*
|
71 |
+
* @param string $field The property to retrieve.
|
72 |
+
* @param mixed $default The default to return if the property doesn't exist.
|
73 |
+
*
|
74 |
+
* @return mixed
|
75 |
+
*/
|
76 |
+
public function getField($field, $default = null)
|
77 |
+
{
|
78 |
+
if (isset($this->metadata[$field])) {
|
79 |
+
return $this->metadata[$field];
|
80 |
+
}
|
81 |
+
|
82 |
+
return $default;
|
83 |
+
}
|
84 |
+
|
85 |
+
/**
|
86 |
+
* Returns a value from the metadata.
|
87 |
+
*
|
88 |
+
* @param string $field The property to retrieve.
|
89 |
+
* @param mixed $default The default to return if the property doesn't exist.
|
90 |
+
*
|
91 |
+
* @return mixed
|
92 |
+
*
|
93 |
+
* @deprecated 5.0.0 getProperty() has been renamed to getField()
|
94 |
+
* @todo v6: Remove this method
|
95 |
+
*/
|
96 |
+
public function getProperty($field, $default = null)
|
97 |
+
{
|
98 |
+
return $this->getField($field, $default);
|
99 |
+
}
|
100 |
+
|
101 |
+
/**
|
102 |
+
* Returns a value from a child property in the metadata.
|
103 |
+
*
|
104 |
+
* @param string $parentField The parent property.
|
105 |
+
* @param string $field The property to retrieve.
|
106 |
+
* @param mixed $default The default to return if the property doesn't exist.
|
107 |
+
*
|
108 |
+
* @return mixed
|
109 |
+
*/
|
110 |
+
public function getChildProperty($parentField, $field, $default = null)
|
111 |
+
{
|
112 |
+
if (!isset($this->metadata[$parentField])) {
|
113 |
+
return $default;
|
114 |
+
}
|
115 |
+
|
116 |
+
if (!isset($this->metadata[$parentField][$field])) {
|
117 |
+
return $default;
|
118 |
+
}
|
119 |
+
|
120 |
+
return $this->metadata[$parentField][$field];
|
121 |
+
}
|
122 |
+
|
123 |
+
/**
|
124 |
+
* Returns a value from the error metadata.
|
125 |
+
*
|
126 |
+
* @param string $field The property to retrieve.
|
127 |
+
* @param mixed $default The default to return if the property doesn't exist.
|
128 |
+
*
|
129 |
+
* @return mixed
|
130 |
+
*/
|
131 |
+
public function getErrorProperty($field, $default = null)
|
132 |
+
{
|
133 |
+
return $this->getChildProperty('error', $field, $default);
|
134 |
+
}
|
135 |
+
|
136 |
+
/**
|
137 |
+
* Returns a value from the "metadata" metadata. *Brain explodes*
|
138 |
+
*
|
139 |
+
* @param string $field The property to retrieve.
|
140 |
+
* @param mixed $default The default to return if the property doesn't exist.
|
141 |
+
*
|
142 |
+
* @return mixed
|
143 |
+
*/
|
144 |
+
public function getMetadataProperty($field, $default = null)
|
145 |
+
{
|
146 |
+
return $this->getChildProperty('metadata', $field, $default);
|
147 |
+
}
|
148 |
+
|
149 |
+
/**
|
150 |
+
* The ID of the application this access token is for.
|
151 |
+
*
|
152 |
+
* @return string|null
|
153 |
+
*/
|
154 |
+
public function getAppId()
|
155 |
+
{
|
156 |
+
return $this->getField('app_id');
|
157 |
+
}
|
158 |
+
|
159 |
+
/**
|
160 |
+
* Name of the application this access token is for.
|
161 |
+
*
|
162 |
+
* @return string|null
|
163 |
+
*/
|
164 |
+
public function getApplication()
|
165 |
+
{
|
166 |
+
return $this->getField('application');
|
167 |
+
}
|
168 |
+
|
169 |
+
/**
|
170 |
+
* Any error that a request to the graph api
|
171 |
+
* would return due to the access token.
|
172 |
+
*
|
173 |
+
* @return bool|null
|
174 |
+
*/
|
175 |
+
public function isError()
|
176 |
+
{
|
177 |
+
return $this->getField('error') !== null;
|
178 |
+
}
|
179 |
+
|
180 |
+
/**
|
181 |
+
* The error code for the error.
|
182 |
+
*
|
183 |
+
* @return int|null
|
184 |
+
*/
|
185 |
+
public function getErrorCode()
|
186 |
+
{
|
187 |
+
return $this->getErrorProperty('code');
|
188 |
+
}
|
189 |
+
|
190 |
+
/**
|
191 |
+
* The error message for the error.
|
192 |
+
*
|
193 |
+
* @return string|null
|
194 |
+
*/
|
195 |
+
public function getErrorMessage()
|
196 |
+
{
|
197 |
+
return $this->getErrorProperty('message');
|
198 |
+
}
|
199 |
+
|
200 |
+
/**
|
201 |
+
* The error subcode for the error.
|
202 |
+
*
|
203 |
+
* @return int|null
|
204 |
+
*/
|
205 |
+
public function getErrorSubcode()
|
206 |
+
{
|
207 |
+
return $this->getErrorProperty('subcode');
|
208 |
+
}
|
209 |
+
|
210 |
+
/**
|
211 |
+
* DateTime when this access token expires.
|
212 |
+
*
|
213 |
+
* @return \DateTime|null
|
214 |
+
*/
|
215 |
+
public function getExpiresAt()
|
216 |
+
{
|
217 |
+
return $this->getField('expires_at');
|
218 |
+
}
|
219 |
+
|
220 |
+
/**
|
221 |
+
* Whether the access token is still valid or not.
|
222 |
+
*
|
223 |
+
* @return boolean|null
|
224 |
+
*/
|
225 |
+
public function getIsValid()
|
226 |
+
{
|
227 |
+
return $this->getField('is_valid');
|
228 |
+
}
|
229 |
+
|
230 |
+
/**
|
231 |
+
* DateTime when this access token was issued.
|
232 |
+
*
|
233 |
+
* Note that the issued_at field is not returned
|
234 |
+
* for short-lived access tokens.
|
235 |
+
*
|
236 |
+
* @see https://developers.facebook.com/docs/facebook-login/access-tokens#debug
|
237 |
+
*
|
238 |
+
* @return \DateTime|null
|
239 |
+
*/
|
240 |
+
public function getIssuedAt()
|
241 |
+
{
|
242 |
+
return $this->getField('issued_at');
|
243 |
+
}
|
244 |
+
|
245 |
+
/**
|
246 |
+
* General metadata associated with the access token.
|
247 |
+
* Can contain data like 'sso', 'auth_type', 'auth_nonce'.
|
248 |
+
*
|
249 |
+
* @return array|null
|
250 |
+
*/
|
251 |
+
public function getMetadata()
|
252 |
+
{
|
253 |
+
return $this->getField('metadata');
|
254 |
+
}
|
255 |
+
|
256 |
+
/**
|
257 |
+
* The 'sso' child property from the 'metadata' parent property.
|
258 |
+
*
|
259 |
+
* @return string|null
|
260 |
+
*/
|
261 |
+
public function getSso()
|
262 |
+
{
|
263 |
+
return $this->getMetadataProperty('sso');
|
264 |
+
}
|
265 |
+
|
266 |
+
/**
|
267 |
+
* The 'auth_type' child property from the 'metadata' parent property.
|
268 |
+
*
|
269 |
+
* @return string|null
|
270 |
+
*/
|
271 |
+
public function getAuthType()
|
272 |
+
{
|
273 |
+
return $this->getMetadataProperty('auth_type');
|
274 |
+
}
|
275 |
+
|
276 |
+
/**
|
277 |
+
* The 'auth_nonce' child property from the 'metadata' parent property.
|
278 |
+
*
|
279 |
+
* @return string|null
|
280 |
+
*/
|
281 |
+
public function getAuthNonce()
|
282 |
+
{
|
283 |
+
return $this->getMetadataProperty('auth_nonce');
|
284 |
+
}
|
285 |
+
|
286 |
+
/**
|
287 |
+
* For impersonated access tokens, the ID of
|
288 |
+
* the page this token contains.
|
289 |
+
*
|
290 |
+
* @return string|null
|
291 |
+
*/
|
292 |
+
public function getProfileId()
|
293 |
+
{
|
294 |
+
return $this->getField('profile_id');
|
295 |
+
}
|
296 |
+
|
297 |
+
/**
|
298 |
+
* List of permissions that the user has granted for
|
299 |
+
* the app in this access token.
|
300 |
+
*
|
301 |
+
* @return array
|
302 |
+
*/
|
303 |
+
public function getScopes()
|
304 |
+
{
|
305 |
+
return $this->getField('scopes');
|
306 |
+
}
|
307 |
+
|
308 |
+
/**
|
309 |
+
* The ID of the user this access token is for.
|
310 |
+
*
|
311 |
+
* @return string|null
|
312 |
+
*/
|
313 |
+
public function getUserId()
|
314 |
+
{
|
315 |
+
return $this->getField('user_id');
|
316 |
+
}
|
317 |
+
|
318 |
+
/**
|
319 |
+
* Ensures the app ID from the access token
|
320 |
+
* metadata is what we expect.
|
321 |
+
*
|
322 |
+
* @param string $appId
|
323 |
+
*
|
324 |
+
* @throws FacebookSDKException
|
325 |
+
*/
|
326 |
+
public function validateAppId($appId)
|
327 |
+
{
|
328 |
+
if ($this->getAppId() !== $appId) {
|
329 |
+
throw new FacebookSDKException('Access token metadata contains unexpected app ID.', 401);
|
330 |
+
}
|
331 |
+
}
|
332 |
+
|
333 |
+
/**
|
334 |
+
* Ensures the user ID from the access token
|
335 |
+
* metadata is what we expect.
|
336 |
+
*
|
337 |
+
* @param string $userId
|
338 |
+
*
|
339 |
+
* @throws FacebookSDKException
|
340 |
+
*/
|
341 |
+
public function validateUserId($userId)
|
342 |
+
{
|
343 |
+
if ($this->getUserId() !== $userId) {
|
344 |
+
throw new FacebookSDKException('Access token metadata contains unexpected user ID.', 401);
|
345 |
+
}
|
346 |
+
}
|
347 |
+
|
348 |
+
/**
|
349 |
+
* Ensures the access token has not expired yet.
|
350 |
+
*
|
351 |
+
* @throws FacebookSDKException
|
352 |
+
*/
|
353 |
+
public function validateExpiration()
|
354 |
+
{
|
355 |
+
if (!$this->getExpiresAt() instanceof \DateTime) {
|
356 |
+
return;
|
357 |
+
}
|
358 |
+
|
359 |
+
if ($this->getExpiresAt()->getTimestamp() < time()) {
|
360 |
+
throw new FacebookSDKException('Inspection of access token metadata shows that the access token has expired.', 401);
|
361 |
+
}
|
362 |
+
}
|
363 |
+
|
364 |
+
/**
|
365 |
+
* Converts a unix timestamp into a DateTime entity.
|
366 |
+
*
|
367 |
+
* @param int $timestamp
|
368 |
+
*
|
369 |
+
* @return \DateTime
|
370 |
+
*/
|
371 |
+
private function convertTimestampToDateTime($timestamp)
|
372 |
+
{
|
373 |
+
$dt = new \DateTime();
|
374 |
+
$dt->setTimestamp($timestamp);
|
375 |
+
|
376 |
+
return $dt;
|
377 |
+
}
|
378 |
+
|
379 |
+
/**
|
380 |
+
* Casts the unix timestamps as DateTime entities.
|
381 |
+
*/
|
382 |
+
private function castTimestampsToDateTime()
|
383 |
+
{
|
384 |
+
foreach (static::$dateProperties as $key) {
|
385 |
+
if (isset($this->metadata[$key]) && $this->metadata[$key] !== 0) {
|
386 |
+
$this->metadata[$key] = $this->convertTimestampToDateTime($this->metadata[$key]);
|
387 |
+
}
|
388 |
+
}
|
389 |
+
}
|
390 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/Authentication/OAuth2Client.php
ADDED
@@ -0,0 +1,292 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\Authentication;
|
25 |
+
|
26 |
+
use Facebook\Facebook;
|
27 |
+
use Facebook\FacebookApp;
|
28 |
+
use Facebook\FacebookRequest;
|
29 |
+
use Facebook\FacebookResponse;
|
30 |
+
use Facebook\FacebookClient;
|
31 |
+
use Facebook\Exceptions\FacebookResponseException;
|
32 |
+
use Facebook\Exceptions\FacebookSDKException;
|
33 |
+
|
34 |
+
/**
|
35 |
+
* Class OAuth2Client
|
36 |
+
*
|
37 |
+
* @package Facebook
|
38 |
+
*/
|
39 |
+
class OAuth2Client
|
40 |
+
{
|
41 |
+
/**
|
42 |
+
* @const string The base authorization URL.
|
43 |
+
*/
|
44 |
+
const BASE_AUTHORIZATION_URL = 'https://www.facebook.com';
|
45 |
+
|
46 |
+
/**
|
47 |
+
* The FacebookApp entity.
|
48 |
+
*
|
49 |
+
* @var FacebookApp
|
50 |
+
*/
|
51 |
+
protected $app;
|
52 |
+
|
53 |
+
/**
|
54 |
+
* The Facebook client.
|
55 |
+
*
|
56 |
+
* @var FacebookClient
|
57 |
+
*/
|
58 |
+
protected $client;
|
59 |
+
|
60 |
+
/**
|
61 |
+
* The version of the Graph API to use.
|
62 |
+
*
|
63 |
+
* @var string
|
64 |
+
*/
|
65 |
+
protected $graphVersion;
|
66 |
+
|
67 |
+
/**
|
68 |
+
* The last request sent to Graph.
|
69 |
+
*
|
70 |
+
* @var FacebookRequest|null
|
71 |
+
*/
|
72 |
+
protected $lastRequest;
|
73 |
+
|
74 |
+
/**
|
75 |
+
* @param FacebookApp $app
|
76 |
+
* @param FacebookClient $client
|
77 |
+
* @param string|null $graphVersion The version of the Graph API to use.
|
78 |
+
*/
|
79 |
+
public function __construct(FacebookApp $app, FacebookClient $client, $graphVersion = null)
|
80 |
+
{
|
81 |
+
$this->app = $app;
|
82 |
+
$this->client = $client;
|
83 |
+
$this->graphVersion = $graphVersion ?: Facebook::DEFAULT_GRAPH_VERSION;
|
84 |
+
}
|
85 |
+
|
86 |
+
/**
|
87 |
+
* Returns the last FacebookRequest that was sent.
|
88 |
+
* Useful for debugging and testing.
|
89 |
+
*
|
90 |
+
* @return FacebookRequest|null
|
91 |
+
*/
|
92 |
+
public function getLastRequest()
|
93 |
+
{
|
94 |
+
return $this->lastRequest;
|
95 |
+
}
|
96 |
+
|
97 |
+
/**
|
98 |
+
* Get the metadata associated with the access token.
|
99 |
+
*
|
100 |
+
* @param AccessToken|string $accessToken The access token to debug.
|
101 |
+
*
|
102 |
+
* @return AccessTokenMetadata
|
103 |
+
*/
|
104 |
+
public function debugToken($accessToken)
|
105 |
+
{
|
106 |
+
$accessToken = $accessToken instanceof AccessToken ? $accessToken->getValue() : $accessToken;
|
107 |
+
$params = ['input_token' => $accessToken];
|
108 |
+
|
109 |
+
$this->lastRequest = new FacebookRequest(
|
110 |
+
$this->app,
|
111 |
+
$this->app->getAccessToken(),
|
112 |
+
'GET',
|
113 |
+
'/debug_token',
|
114 |
+
$params,
|
115 |
+
null,
|
116 |
+
$this->graphVersion
|
117 |
+
);
|
118 |
+
$response = $this->client->sendRequest($this->lastRequest);
|
119 |
+
$metadata = $response->getDecodedBody();
|
120 |
+
|
121 |
+
return new AccessTokenMetadata($metadata);
|
122 |
+
}
|
123 |
+
|
124 |
+
/**
|
125 |
+
* Generates an authorization URL to begin the process of authenticating a user.
|
126 |
+
*
|
127 |
+
* @param string $redirectUrl The callback URL to redirect to.
|
128 |
+
* @param array $scope An array of permissions to request.
|
129 |
+
* @param string $state The CSPRNG-generated CSRF value.
|
130 |
+
* @param array $params An array of parameters to generate URL.
|
131 |
+
* @param string $separator The separator to use in http_build_query().
|
132 |
+
*
|
133 |
+
* @return string
|
134 |
+
*/
|
135 |
+
public function getAuthorizationUrl($redirectUrl, $state, array $scope = [], array $params = [], $separator = '&')
|
136 |
+
{
|
137 |
+
$params += [
|
138 |
+
'client_id' => $this->app->getId(),
|
139 |
+
'state' => $state,
|
140 |
+
'response_type' => 'code',
|
141 |
+
'sdk' => 'php-sdk-' . Facebook::VERSION,
|
142 |
+
'redirect_uri' => $redirectUrl,
|
143 |
+
'scope' => implode(',', $scope)
|
144 |
+
];
|
145 |
+
|
146 |
+
return static::BASE_AUTHORIZATION_URL . '/' . $this->graphVersion . '/dialog/oauth?' . http_build_query($params, null, $separator);
|
147 |
+
}
|
148 |
+
|
149 |
+
/**
|
150 |
+
* Get a valid access token from a code.
|
151 |
+
*
|
152 |
+
* @param string $code
|
153 |
+
* @param string $redirectUri
|
154 |
+
*
|
155 |
+
* @return AccessToken
|
156 |
+
*
|
157 |
+
* @throws FacebookSDKException
|
158 |
+
*/
|
159 |
+
public function getAccessTokenFromCode($code, $redirectUri = '')
|
160 |
+
{
|
161 |
+
$params = [
|
162 |
+
'code' => $code,
|
163 |
+
'redirect_uri' => $redirectUri,
|
164 |
+
];
|
165 |
+
|
166 |
+
return $this->requestAnAccessToken($params);
|
167 |
+
}
|
168 |
+
|
169 |
+
/**
|
170 |
+
* Exchanges a short-lived access token with a long-lived access token.
|
171 |
+
*
|
172 |
+
* @param AccessToken|string $accessToken
|
173 |
+
*
|
174 |
+
* @return AccessToken
|
175 |
+
*
|
176 |
+
* @throws FacebookSDKException
|
177 |
+
*/
|
178 |
+
public function getLongLivedAccessToken($accessToken)
|
179 |
+
{
|
180 |
+
$accessToken = $accessToken instanceof AccessToken ? $accessToken->getValue() : $accessToken;
|
181 |
+
$params = [
|
182 |
+
'grant_type' => 'fb_exchange_token',
|
183 |
+
'fb_exchange_token' => $accessToken,
|
184 |
+
];
|
185 |
+
|
186 |
+
return $this->requestAnAccessToken($params);
|
187 |
+
}
|
188 |
+
|
189 |
+
/**
|
190 |
+
* Get a valid code from an access token.
|
191 |
+
*
|
192 |
+
* @param AccessToken|string $accessToken
|
193 |
+
* @param string $redirectUri
|
194 |
+
*
|
195 |
+
* @return AccessToken
|
196 |
+
*
|
197 |
+
* @throws FacebookSDKException
|
198 |
+
*/
|
199 |
+
public function getCodeFromLongLivedAccessToken($accessToken, $redirectUri = '')
|
200 |
+
{
|
201 |
+
$params = [
|
202 |
+
'redirect_uri' => $redirectUri,
|
203 |
+
];
|
204 |
+
|
205 |
+
$response = $this->sendRequestWithClientParams('/oauth/client_code', $params, $accessToken);
|
206 |
+
$data = $response->getDecodedBody();
|
207 |
+
|
208 |
+
if (!isset($data['code'])) {
|
209 |
+
throw new FacebookSDKException('Code was not returned from Graph.', 401);
|
210 |
+
}
|
211 |
+
|
212 |
+
return $data['code'];
|
213 |
+
}
|
214 |
+
|
215 |
+
/**
|
216 |
+
* Send a request to the OAuth endpoint.
|
217 |
+
*
|
218 |
+
* @param array $params
|
219 |
+
*
|
220 |
+
* @return AccessToken
|
221 |
+
*
|
222 |
+
* @throws FacebookSDKException
|
223 |
+
*/
|
224 |
+
protected function requestAnAccessToken(array $params)
|
225 |
+
{
|
226 |
+
$response = $this->sendRequestWithClientParams('/oauth/access_token', $params);
|
227 |
+
$data = $response->getDecodedBody();
|
228 |
+
|
229 |
+
if (!isset($data['access_token'])) {
|
230 |
+
throw new FacebookSDKException('Access token was not returned from Graph.', 401);
|
231 |
+
}
|
232 |
+
|
233 |
+
// Graph returns two different key names for expiration time
|
234 |
+
// on the same endpoint. Doh! :/
|
235 |
+
$expiresAt = 0;
|
236 |
+
if (isset($data['expires'])) {
|
237 |
+
// For exchanging a short lived token with a long lived token.
|
238 |
+
// The expiration time in seconds will be returned as "expires".
|
239 |
+
$expiresAt = time() + $data['expires'];
|
240 |
+
} elseif (isset($data['expires_in'])) {
|
241 |
+
// For exchanging a code for a short lived access token.
|
242 |
+
// The expiration time in seconds will be returned as "expires_in".
|
243 |
+
// See: https://developers.facebook.com/docs/facebook-login/access-tokens#long-via-code
|
244 |
+
$expiresAt = time() + $data['expires_in'];
|
245 |
+
}
|
246 |
+
|
247 |
+
return new AccessToken($data['access_token'], $expiresAt);
|
248 |
+
}
|
249 |
+
|
250 |
+
/**
|
251 |
+
* Send a request to Graph with an app access token.
|
252 |
+
*
|
253 |
+
* @param string $endpoint
|
254 |
+
* @param array $params
|
255 |
+
* @param AccessToken|string|null $accessToken
|
256 |
+
*
|
257 |
+
* @return FacebookResponse
|
258 |
+
*
|
259 |
+
* @throws FacebookResponseException
|
260 |
+
*/
|
261 |
+
protected function sendRequestWithClientParams($endpoint, array $params, $accessToken = null)
|
262 |
+
{
|
263 |
+
$params += $this->getClientParams();
|
264 |
+
|
265 |
+
$accessToken = $accessToken ?: $this->app->getAccessToken();
|
266 |
+
|
267 |
+
$this->lastRequest = new FacebookRequest(
|
268 |
+
$this->app,
|
269 |
+
$accessToken,
|
270 |
+
'GET',
|
271 |
+
$endpoint,
|
272 |
+
$params,
|
273 |
+
null,
|
274 |
+
$this->graphVersion
|
275 |
+
);
|
276 |
+
|
277 |
+
return $this->client->sendRequest($this->lastRequest);
|
278 |
+
}
|
279 |
+
|
280 |
+
/**
|
281 |
+
* Returns the client_* params for OAuth requests.
|
282 |
+
*
|
283 |
+
* @return array
|
284 |
+
*/
|
285 |
+
protected function getClientParams()
|
286 |
+
{
|
287 |
+
return [
|
288 |
+
'client_id' => $this->app->getId(),
|
289 |
+
'client_secret' => $this->app->getSecret(),
|
290 |
+
];
|
291 |
+
}
|
292 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/Exceptions/FacebookAuthenticationException.php
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\Exceptions;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class FacebookAuthenticationException
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
class FacebookAuthenticationException extends FacebookSDKException
|
32 |
+
{
|
33 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/Exceptions/FacebookAuthorizationException.php
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\Exceptions;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class FacebookAuthorizationException
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
class FacebookAuthorizationException extends FacebookSDKException
|
32 |
+
{
|
33 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/Exceptions/FacebookClientException.php
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\Exceptions;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class FacebookClientException
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
class FacebookClientException extends FacebookSDKException
|
32 |
+
{
|
33 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/Exceptions/FacebookOtherException.php
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\Exceptions;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class FacebookOtherException
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
class FacebookOtherException extends FacebookSDKException
|
32 |
+
{
|
33 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/Exceptions/FacebookResponseException.php
ADDED
@@ -0,0 +1,214 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\Exceptions;
|
25 |
+
|
26 |
+
use Facebook\FacebookResponse;
|
27 |
+
|
28 |
+
/**
|
29 |
+
* Class FacebookResponseException
|
30 |
+
*
|
31 |
+
* @package Facebook
|
32 |
+
*/
|
33 |
+
class FacebookResponseException extends FacebookSDKException
|
34 |
+
{
|
35 |
+
/**
|
36 |
+
* @var FacebookResponse The response that threw the exception.
|
37 |
+
*/
|
38 |
+
protected $response;
|
39 |
+
|
40 |
+
/**
|
41 |
+
* @var array Decoded response.
|
42 |
+
*/
|
43 |
+
protected $responseData;
|
44 |
+
|
45 |
+
/**
|
46 |
+
* Creates a FacebookResponseException.
|
47 |
+
*
|
48 |
+
* @param FacebookResponse $response The response that threw the exception.
|
49 |
+
* @param FacebookSDKException $previousException The more detailed exception.
|
50 |
+
*/
|
51 |
+
public function __construct(FacebookResponse $response, FacebookSDKException $previousException = null)
|
52 |
+
{
|
53 |
+
$this->response = $response;
|
54 |
+
$this->responseData = $response->getDecodedBody();
|
55 |
+
|
56 |
+
$errorMessage = $this->get('message', 'Unknown error from Graph.');
|
57 |
+
$errorCode = $this->get('code', -1);
|
58 |
+
|
59 |
+
parent::__construct($errorMessage, $errorCode, $previousException);
|
60 |
+
}
|
61 |
+
|
62 |
+
/**
|
63 |
+
* A factory for creating the appropriate exception based on the response from Graph.
|
64 |
+
*
|
65 |
+
* @param FacebookResponse $response The response that threw the exception.
|
66 |
+
*
|
67 |
+
* @return FacebookResponseException
|
68 |
+
*/
|
69 |
+
public static function create(FacebookResponse $response)
|
70 |
+
{
|
71 |
+
$data = $response->getDecodedBody();
|
72 |
+
|
73 |
+
if (!isset($data['error']['code']) && isset($data['code'])) {
|
74 |
+
$data = ['error' => $data];
|
75 |
+
}
|
76 |
+
|
77 |
+
$code = isset($data['error']['code']) ? $data['error']['code'] : null;
|
78 |
+
$message = isset($data['error']['message']) ? $data['error']['message'] : 'Unknown error from Graph.';
|
79 |
+
|
80 |
+
if (isset($data['error']['error_subcode'])) {
|
81 |
+
switch ($data['error']['error_subcode']) {
|
82 |
+
// Other authentication issues
|
83 |
+
case 458:
|
84 |
+
case 459:
|
85 |
+
case 460:
|
86 |
+
case 463:
|
87 |
+
case 464:
|
88 |
+
case 467:
|
89 |
+
return new static($response, new FacebookAuthenticationException($message, $code));
|
90 |
+
// Video upload resumable error
|
91 |
+
case 1363030:
|
92 |
+
case 1363019:
|
93 |
+
case 1363037:
|
94 |
+
case 1363033:
|
95 |
+
case 1363021:
|
96 |
+
case 1363041:
|
97 |
+
return new static($response, new FacebookResumableUploadException($message, $code));
|
98 |
+
}
|
99 |
+
}
|
100 |
+
|
101 |
+
switch ($code) {
|
102 |
+
// Login status or token expired, revoked, or invalid
|
103 |
+
case 100:
|
104 |
+
case 102:
|
105 |
+
case 190:
|
106 |
+
return new static($response, new FacebookAuthenticationException($message, $code));
|
107 |
+
|
108 |
+
// Server issue, possible downtime
|
109 |
+
case 1:
|
110 |
+
case 2:
|
111 |
+
return new static($response, new FacebookServerException($message, $code));
|
112 |
+
|
113 |
+
// API Throttling
|
114 |
+
case 4:
|
115 |
+
case 17:
|
116 |
+
case 341:
|
117 |
+
return new static($response, new FacebookThrottleException($message, $code));
|
118 |
+
|
119 |
+
// Duplicate Post
|
120 |
+
case 506:
|
121 |
+
return new static($response, new FacebookClientException($message, $code));
|
122 |
+
}
|
123 |
+
|
124 |
+
// Missing Permissions
|
125 |
+
if ($code == 10 || ($code >= 200 && $code <= 299)) {
|
126 |
+
return new static($response, new FacebookAuthorizationException($message, $code));
|
127 |
+
}
|
128 |
+
|
129 |
+
// OAuth authentication error
|
130 |
+
if (isset($data['error']['type']) && $data['error']['type'] === 'OAuthException') {
|
131 |
+
return new static($response, new FacebookAuthenticationException($message, $code));
|
132 |
+
}
|
133 |
+
|
134 |
+
// All others
|
135 |
+
return new static($response, new FacebookOtherException($message, $code));
|
136 |
+
}
|
137 |
+
|
138 |
+
/**
|
139 |
+
* Checks isset and returns that or a default value.
|
140 |
+
*
|
141 |
+
* @param string $key
|
142 |
+
* @param mixed $default
|
143 |
+
*
|
144 |
+
* @return mixed
|
145 |
+
*/
|
146 |
+
private function get($key, $default = null)
|
147 |
+
{
|
148 |
+
if (isset($this->responseData['error'][$key])) {
|
149 |
+
return $this->responseData['error'][$key];
|
150 |
+
}
|
151 |
+
|
152 |
+
return $default;
|
153 |
+
}
|
154 |
+
|
155 |
+
/**
|
156 |
+
* Returns the HTTP status code
|
157 |
+
*
|
158 |
+
* @return int
|
159 |
+
*/
|
160 |
+
public function getHttpStatusCode()
|
161 |
+
{
|
162 |
+
return $this->response->getHttpStatusCode();
|
163 |
+
}
|
164 |
+
|
165 |
+
/**
|
166 |
+
* Returns the sub-error code
|
167 |
+
*
|
168 |
+
* @return int
|
169 |
+
*/
|
170 |
+
public function getSubErrorCode()
|
171 |
+
{
|
172 |
+
return $this->get('error_subcode', -1);
|
173 |
+
}
|
174 |
+
|
175 |
+
/**
|
176 |
+
* Returns the error type
|
177 |
+
*
|
178 |
+
* @return string
|
179 |
+
*/
|
180 |
+
public function getErrorType()
|
181 |
+
{
|
182 |
+
return $this->get('type', '');
|
183 |
+
}
|
184 |
+
|
185 |
+
/**
|
186 |
+
* Returns the raw response used to create the exception.
|
187 |
+
*
|
188 |
+
* @return string
|
189 |
+
*/
|
190 |
+
public function getRawResponse()
|
191 |
+
{
|
192 |
+
return $this->response->getBody();
|
193 |
+
}
|
194 |
+
|
195 |
+
/**
|
196 |
+
* Returns the decoded response used to create the exception.
|
197 |
+
*
|
198 |
+
* @return array
|
199 |
+
*/
|
200 |
+
public function getResponseData()
|
201 |
+
{
|
202 |
+
return $this->responseData;
|
203 |
+
}
|
204 |
+
|
205 |
+
/**
|
206 |
+
* Returns the response entity used to create the exception.
|
207 |
+
*
|
208 |
+
* @return FacebookResponse
|
209 |
+
*/
|
210 |
+
public function getResponse()
|
211 |
+
{
|
212 |
+
return $this->response;
|
213 |
+
}
|
214 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/Exceptions/FacebookResumableUploadException.php
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\Exceptions;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class FacebookResumableUploadException
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
class FacebookResumableUploadException extends FacebookSDKException
|
32 |
+
{
|
33 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/Exceptions/FacebookSDKException.php
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\Exceptions;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class FacebookSDKException
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
class FacebookSDKException extends \Exception
|
32 |
+
{
|
33 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/Exceptions/FacebookServerException.php
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\Exceptions;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class FacebookServerException
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
class FacebookServerException extends FacebookSDKException
|
32 |
+
{
|
33 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/Exceptions/FacebookThrottleException.php
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\Exceptions;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class FacebookThrottleException
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
class FacebookThrottleException extends FacebookSDKException
|
32 |
+
{
|
33 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/FacebookApp.php
ADDED
@@ -0,0 +1,110 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook;
|
25 |
+
|
26 |
+
use Facebook\Authentication\AccessToken;
|
27 |
+
use Facebook\Exceptions\FacebookSDKException;
|
28 |
+
|
29 |
+
class FacebookApp implements \Serializable
|
30 |
+
{
|
31 |
+
/**
|
32 |
+
* @var string The app ID.
|
33 |
+
*/
|
34 |
+
protected $id;
|
35 |
+
|
36 |
+
/**
|
37 |
+
* @var string The app secret.
|
38 |
+
*/
|
39 |
+
protected $secret;
|
40 |
+
|
41 |
+
/**
|
42 |
+
* @param string $id
|
43 |
+
* @param string $secret
|
44 |
+
*
|
45 |
+
* @throws FacebookSDKException
|
46 |
+
*/
|
47 |
+
public function __construct($id, $secret)
|
48 |
+
{
|
49 |
+
if (!is_string($id)
|
50 |
+
// Keeping this for BC. Integers greater than PHP_INT_MAX will make is_int() return false
|
51 |
+
&& !is_int($id)) {
|
52 |
+
throw new FacebookSDKException('The "app_id" must be formatted as a string since many app ID\'s are greater than PHP_INT_MAX on some systems.');
|
53 |
+
}
|
54 |
+
// We cast as a string in case a valid int was set on a 64-bit system and this is unserialised on a 32-bit system
|
55 |
+
$this->id = (string) $id;
|
56 |
+
$this->secret = $secret;
|
57 |
+
}
|
58 |
+
|
59 |
+
/**
|
60 |
+
* Returns the app ID.
|
61 |
+
*
|
62 |
+
* @return string
|
63 |
+
*/
|
64 |
+
public function getId()
|
65 |
+
{
|
66 |
+
return $this->id;
|
67 |
+
}
|
68 |
+
|
69 |
+
/**
|
70 |
+
* Returns the app secret.
|
71 |
+
*
|
72 |
+
* @return string
|
73 |
+
*/
|
74 |
+
public function getSecret()
|
75 |
+
{
|
76 |
+
return $this->secret;
|
77 |
+
}
|
78 |
+
|
79 |
+
/**
|
80 |
+
* Returns an app access token.
|
81 |
+
*
|
82 |
+
* @return AccessToken
|
83 |
+
*/
|
84 |
+
public function getAccessToken()
|
85 |
+
{
|
86 |
+
return new AccessToken($this->id . '|' . $this->secret);
|
87 |
+
}
|
88 |
+
|
89 |
+
/**
|
90 |
+
* Serializes the FacebookApp entity as a string.
|
91 |
+
*
|
92 |
+
* @return string
|
93 |
+
*/
|
94 |
+
public function serialize()
|
95 |
+
{
|
96 |
+
return implode('|', [$this->id, $this->secret]);
|
97 |
+
}
|
98 |
+
|
99 |
+
/**
|
100 |
+
* Unserializes a string as a FacebookApp entity.
|
101 |
+
*
|
102 |
+
* @param string $serialized
|
103 |
+
*/
|
104 |
+
public function unserialize($serialized)
|
105 |
+
{
|
106 |
+
list($id, $secret) = explode('|', $serialized);
|
107 |
+
|
108 |
+
$this->__construct($id, $secret);
|
109 |
+
}
|
110 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/FacebookBatchRequest.php
ADDED
@@ -0,0 +1,301 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook;
|
25 |
+
|
26 |
+
use ArrayIterator;
|
27 |
+
use IteratorAggregate;
|
28 |
+
use ArrayAccess;
|
29 |
+
use Facebook\Authentication\AccessToken;
|
30 |
+
use Facebook\Exceptions\FacebookSDKException;
|
31 |
+
|
32 |
+
/**
|
33 |
+
* Class BatchRequest
|
34 |
+
*
|
35 |
+
* @package Facebook
|
36 |
+
*/
|
37 |
+
class FacebookBatchRequest extends FacebookRequest implements IteratorAggregate, ArrayAccess
|
38 |
+
{
|
39 |
+
/**
|
40 |
+
* @var array An array of FacebookRequest entities to send.
|
41 |
+
*/
|
42 |
+
protected $requests;
|
43 |
+
|
44 |
+
/**
|
45 |
+
* @var array An array of files to upload.
|
46 |
+
*/
|
47 |
+
protected $attachedFiles;
|
48 |
+
|
49 |
+
/**
|
50 |
+
* Creates a new Request entity.
|
51 |
+
*
|
52 |
+
* @param FacebookApp|null $app
|
53 |
+
* @param array $requests
|
54 |
+
* @param AccessToken|string|null $accessToken
|
55 |
+
* @param string|null $graphVersion
|
56 |
+
*/
|
57 |
+
public function __construct(FacebookApp $app = null, array $requests = [], $accessToken = null, $graphVersion = null)
|
58 |
+
{
|
59 |
+
parent::__construct($app, $accessToken, 'POST', '', [], null, $graphVersion);
|
60 |
+
|
61 |
+
$this->add($requests);
|
62 |
+
}
|
63 |
+
|
64 |
+
/**
|
65 |
+
* A a new request to the array.
|
66 |
+
*
|
67 |
+
* @param FacebookRequest|array $request
|
68 |
+
* @param string|null $name
|
69 |
+
*
|
70 |
+
* @return FacebookBatchRequest
|
71 |
+
*
|
72 |
+
* @throws \InvalidArgumentException
|
73 |
+
*/
|
74 |
+
public function add($request, $name = null)
|
75 |
+
{
|
76 |
+
if (is_array($request)) {
|
77 |
+
foreach ($request as $key => $req) {
|
78 |
+
$this->add($req, $key);
|
79 |
+
}
|
80 |
+
|
81 |
+
return $this;
|
82 |
+
}
|
83 |
+
|
84 |
+
if (!$request instanceof FacebookRequest) {
|
85 |
+
throw new \InvalidArgumentException('Argument for add() must be of type array or FacebookRequest.');
|
86 |
+
}
|
87 |
+
|
88 |
+
$this->addFallbackDefaults($request);
|
89 |
+
$requestToAdd = [
|
90 |
+
'name' => $name,
|
91 |
+
'request' => $request,
|
92 |
+
];
|
93 |
+
|
94 |
+
// File uploads
|
95 |
+
$attachedFiles = $this->extractFileAttachments($request);
|
96 |
+
if ($attachedFiles) {
|
97 |
+
$requestToAdd['attached_files'] = $attachedFiles;
|
98 |
+
}
|
99 |
+
$this->requests[] = $requestToAdd;
|
100 |
+
|
101 |
+
return $this;
|
102 |
+
}
|
103 |
+
|
104 |
+
/**
|
105 |
+
* Ensures that the FacebookApp and access token fall back when missing.
|
106 |
+
*
|
107 |
+
* @param FacebookRequest $request
|
108 |
+
*
|
109 |
+
* @throws FacebookSDKException
|
110 |
+
*/
|
111 |
+
public function addFallbackDefaults(FacebookRequest $request)
|
112 |
+
{
|
113 |
+
if (!$request->getApp()) {
|
114 |
+
$app = $this->getApp();
|
115 |
+
if (!$app) {
|
116 |
+
throw new FacebookSDKException('Missing FacebookApp on FacebookRequest and no fallback detected on FacebookBatchRequest.');
|
117 |
+
}
|
118 |
+
$request->setApp($app);
|
119 |
+
}
|
120 |
+
|
121 |
+
if (!$request->getAccessToken()) {
|
122 |
+
$accessToken = $this->getAccessToken();
|
123 |
+
if (!$accessToken) {
|
124 |
+
throw new FacebookSDKException('Missing access token on FacebookRequest and no fallback detected on FacebookBatchRequest.');
|
125 |
+
}
|
126 |
+
$request->setAccessToken($accessToken);
|
127 |
+
}
|
128 |
+
}
|
129 |
+
|
130 |
+
/**
|
131 |
+
* Extracts the files from a request.
|
132 |
+
*
|
133 |
+
* @param FacebookRequest $request
|
134 |
+
*
|
135 |
+
* @return string|null
|
136 |
+
*
|
137 |
+
* @throws FacebookSDKException
|
138 |
+
*/
|
139 |
+
public function extractFileAttachments(FacebookRequest $request)
|
140 |
+
{
|
141 |
+
if (!$request->containsFileUploads()) {
|
142 |
+
return null;
|
143 |
+
}
|
144 |
+
|
145 |
+
$files = $request->getFiles();
|
146 |
+
$fileNames = [];
|
147 |
+
foreach ($files as $file) {
|
148 |
+
$fileName = uniqid();
|
149 |
+
$this->addFile($fileName, $file);
|
150 |
+
$fileNames[] = $fileName;
|
151 |
+
}
|
152 |
+
|
153 |
+
$request->resetFiles();
|
154 |
+
|
155 |
+
// @TODO Does Graph support multiple uploads on one endpoint?
|
156 |
+
return implode(',', $fileNames);
|
157 |
+
}
|
158 |
+
|
159 |
+
/**
|
160 |
+
* Return the FacebookRequest entities.
|
161 |
+
*
|
162 |
+
* @return array
|
163 |
+
*/
|
164 |
+
public function getRequests()
|
165 |
+
{
|
166 |
+
return $this->requests;
|
167 |
+
}
|
168 |
+
|
169 |
+
/**
|
170 |
+
* Prepares the requests to be sent as a batch request.
|
171 |
+
*/
|
172 |
+
public function prepareRequestsForBatch()
|
173 |
+
{
|
174 |
+
$this->validateBatchRequestCount();
|
175 |
+
|
176 |
+
$params = [
|
177 |
+
'batch' => $this->convertRequestsToJson(),
|
178 |
+
'include_headers' => true,
|
179 |
+
];
|
180 |
+
$this->setParams($params);
|
181 |
+
}
|
182 |
+
|
183 |
+
/**
|
184 |
+
* Converts the requests into a JSON(P) string.
|
185 |
+
*
|
186 |
+
* @return string
|
187 |
+
*/
|
188 |
+
public function convertRequestsToJson()
|
189 |
+
{
|
190 |
+
$requests = [];
|
191 |
+
foreach ($this->requests as $request) {
|
192 |
+
$attachedFiles = isset($request['attached_files']) ? $request['attached_files'] : null;
|
193 |
+
$requests[] = $this->requestEntityToBatchArray($request['request'], $request['name'], $attachedFiles);
|
194 |
+
}
|
195 |
+
|
196 |
+
return json_encode($requests);
|
197 |
+
}
|
198 |
+
|
199 |
+
/**
|
200 |
+
* Validate the request count before sending them as a batch.
|
201 |
+
*
|
202 |
+
* @throws FacebookSDKException
|
203 |
+
*/
|
204 |
+
public function validateBatchRequestCount()
|
205 |
+
{
|
206 |
+
$batchCount = count($this->requests);
|
207 |
+
if ($batchCount === 0) {
|
208 |
+
throw new FacebookSDKException('There are no batch requests to send.');
|
209 |
+
} elseif ($batchCount > 50) {
|
210 |
+
// Per: https://developers.facebook.com/docs/graph-api/making-multiple-requests#limits
|
211 |
+
throw new FacebookSDKException('You cannot send more than 50 batch requests at a time.');
|
212 |
+
}
|
213 |
+
}
|
214 |
+
|
215 |
+
/**
|
216 |
+
* Converts a Request entity into an array that is batch-friendly.
|
217 |
+
*
|
218 |
+
* @param FacebookRequest $request The request entity to convert.
|
219 |
+
* @param string|null $requestName The name of the request.
|
220 |
+
* @param string|null $attachedFiles Names of files associated with the request.
|
221 |
+
*
|
222 |
+
* @return array
|
223 |
+
*/
|
224 |
+
public function requestEntityToBatchArray(FacebookRequest $request, $requestName = null, $attachedFiles = null)
|
225 |
+
{
|
226 |
+
$compiledHeaders = [];
|
227 |
+
$headers = $request->getHeaders();
|
228 |
+
foreach ($headers as $name => $value) {
|
229 |
+
$compiledHeaders[] = $name . ': ' . $value;
|
230 |
+
}
|
231 |
+
|
232 |
+
$batch = [
|
233 |
+
'headers' => $compiledHeaders,
|
234 |
+
'method' => $request->getMethod(),
|
235 |
+
'relative_url' => $request->getUrl(),
|
236 |
+
];
|
237 |
+
|
238 |
+
// Since file uploads are moved to the root request of a batch request,
|
239 |
+
// the child requests will always be URL-encoded.
|
240 |
+
$body = $request->getUrlEncodedBody()->getBody();
|
241 |
+
if ($body) {
|
242 |
+
$batch['body'] = $body;
|
243 |
+
}
|
244 |
+
|
245 |
+
if (isset($requestName)) {
|
246 |
+
$batch['name'] = $requestName;
|
247 |
+
}
|
248 |
+
|
249 |
+
if (isset($attachedFiles)) {
|
250 |
+
$batch['attached_files'] = $attachedFiles;
|
251 |
+
}
|
252 |
+
|
253 |
+
// @TODO Add support for "omit_response_on_success"
|
254 |
+
// @TODO Add support for "depends_on"
|
255 |
+
// @TODO Add support for JSONP with "callback"
|
256 |
+
|
257 |
+
return $batch;
|
258 |
+
}
|
259 |
+
|
260 |
+
/**
|
261 |
+
* Get an iterator for the items.
|
262 |
+
*
|
263 |
+
* @return ArrayIterator
|
264 |
+
*/
|
265 |
+
public function getIterator()
|
266 |
+
{
|
267 |
+
return new ArrayIterator($this->requests);
|
268 |
+
}
|
269 |
+
|
270 |
+
/**
|
271 |
+
* @inheritdoc
|
272 |
+
*/
|
273 |
+
public function offsetSet($offset, $value)
|
274 |
+
{
|
275 |
+
$this->add($value, $offset);
|
276 |
+
}
|
277 |
+
|
278 |
+
/**
|
279 |
+
* @inheritdoc
|
280 |
+
*/
|
281 |
+
public function offsetExists($offset)
|
282 |
+
{
|
283 |
+
return isset($this->requests[$offset]);
|
284 |
+
}
|
285 |
+
|
286 |
+
/**
|
287 |
+
* @inheritdoc
|
288 |
+
*/
|
289 |
+
public function offsetUnset($offset)
|
290 |
+
{
|
291 |
+
unset($this->requests[$offset]);
|
292 |
+
}
|
293 |
+
|
294 |
+
/**
|
295 |
+
* @inheritdoc
|
296 |
+
*/
|
297 |
+
public function offsetGet($offset)
|
298 |
+
{
|
299 |
+
return isset($this->requests[$offset]) ? $this->requests[$offset] : null;
|
300 |
+
}
|
301 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/FacebookBatchResponse.php
ADDED
@@ -0,0 +1,174 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook;
|
25 |
+
|
26 |
+
use ArrayIterator;
|
27 |
+
use IteratorAggregate;
|
28 |
+
use ArrayAccess;
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Class FacebookBatchResponse
|
32 |
+
*
|
33 |
+
* @package Facebook
|
34 |
+
*/
|
35 |
+
class FacebookBatchResponse extends FacebookResponse implements IteratorAggregate, ArrayAccess
|
36 |
+
{
|
37 |
+
/**
|
38 |
+
* @var FacebookBatchRequest The original entity that made the batch request.
|
39 |
+
*/
|
40 |
+
protected $batchRequest;
|
41 |
+
|
42 |
+
/**
|
43 |
+
* @var array An array of FacebookResponse entities.
|
44 |
+
*/
|
45 |
+
protected $responses = [];
|
46 |
+
|
47 |
+
/**
|
48 |
+
* Creates a new Response entity.
|
49 |
+
*
|
50 |
+
* @param FacebookBatchRequest $batchRequest
|
51 |
+
* @param FacebookResponse $response
|
52 |
+
*/
|
53 |
+
public function __construct(FacebookBatchRequest $batchRequest, FacebookResponse $response)
|
54 |
+
{
|
55 |
+
$this->batchRequest = $batchRequest;
|
56 |
+
|
57 |
+
$request = $response->getRequest();
|
58 |
+
$body = $response->getBody();
|
59 |
+
$httpStatusCode = $response->getHttpStatusCode();
|
60 |
+
$headers = $response->getHeaders();
|
61 |
+
parent::__construct($request, $body, $httpStatusCode, $headers);
|
62 |
+
|
63 |
+
$responses = $response->getDecodedBody();
|
64 |
+
$this->setResponses($responses);
|
65 |
+
}
|
66 |
+
|
67 |
+
/**
|
68 |
+
* Returns an array of FacebookResponse entities.
|
69 |
+
*
|
70 |
+
* @return array
|
71 |
+
*/
|
72 |
+
public function getResponses()
|
73 |
+
{
|
74 |
+
return $this->responses;
|
75 |
+
}
|
76 |
+
|
77 |
+
/**
|
78 |
+
* The main batch response will be an array of requests so
|
79 |
+
* we need to iterate over all the responses.
|
80 |
+
*
|
81 |
+
* @param array $responses
|
82 |
+
*/
|
83 |
+
public function setResponses(array $responses)
|
84 |
+
{
|
85 |
+
$this->responses = [];
|
86 |
+
|
87 |
+
foreach ($responses as $key => $graphResponse) {
|
88 |
+
$this->addResponse($key, $graphResponse);
|
89 |
+
}
|
90 |
+
}
|
91 |
+
|
92 |
+
/**
|
93 |
+
* Add a response to the list.
|
94 |
+
*
|
95 |
+
* @param int $key
|
96 |
+
* @param array|null $response
|
97 |
+
*/
|
98 |
+
public function addResponse($key, $response)
|
99 |
+
{
|
100 |
+
$originalRequestName = isset($this->batchRequest[$key]['name']) ? $this->batchRequest[$key]['name'] : $key;
|
101 |
+
$originalRequest = isset($this->batchRequest[$key]['request']) ? $this->batchRequest[$key]['request'] : null;
|
102 |
+
|
103 |
+
$httpResponseBody = isset($response['body']) ? $response['body'] : null;
|
104 |
+
$httpResponseCode = isset($response['code']) ? $response['code'] : null;
|
105 |
+
// @TODO With PHP 5.5 support, this becomes array_column($response['headers'], 'value', 'name')
|
106 |
+
$httpResponseHeaders = isset($response['headers']) ? $this->normalizeBatchHeaders($response['headers']) : [];
|
107 |
+
|
108 |
+
$this->responses[$originalRequestName] = new FacebookResponse(
|
109 |
+
$originalRequest,
|
110 |
+
$httpResponseBody,
|
111 |
+
$httpResponseCode,
|
112 |
+
$httpResponseHeaders
|
113 |
+
);
|
114 |
+
}
|
115 |
+
|
116 |
+
/**
|
117 |
+
* @inheritdoc
|
118 |
+
*/
|
119 |
+
public function getIterator()
|
120 |
+
{
|
121 |
+
return new ArrayIterator($this->responses);
|
122 |
+
}
|
123 |
+
|
124 |
+
/**
|
125 |
+
* @inheritdoc
|
126 |
+
*/
|
127 |
+
public function offsetSet($offset, $value)
|
128 |
+
{
|
129 |
+
$this->addResponse($offset, $value);
|
130 |
+
}
|
131 |
+
|
132 |
+
/**
|
133 |
+
* @inheritdoc
|
134 |
+
*/
|
135 |
+
public function offsetExists($offset)
|
136 |
+
{
|
137 |
+
return isset($this->responses[$offset]);
|
138 |
+
}
|
139 |
+
|
140 |
+
/**
|
141 |
+
* @inheritdoc
|
142 |
+
*/
|
143 |
+
public function offsetUnset($offset)
|
144 |
+
{
|
145 |
+
unset($this->responses[$offset]);
|
146 |
+
}
|
147 |
+
|
148 |
+
/**
|
149 |
+
* @inheritdoc
|
150 |
+
*/
|
151 |
+
public function offsetGet($offset)
|
152 |
+
{
|
153 |
+
return isset($this->responses[$offset]) ? $this->responses[$offset] : null;
|
154 |
+
}
|
155 |
+
|
156 |
+
/**
|
157 |
+
* Converts the batch header array into a standard format.
|
158 |
+
* @TODO replace with array_column() when PHP 5.5 is supported.
|
159 |
+
*
|
160 |
+
* @param array $batchHeaders
|
161 |
+
*
|
162 |
+
* @return array
|
163 |
+
*/
|
164 |
+
private function normalizeBatchHeaders(array $batchHeaders)
|
165 |
+
{
|
166 |
+
$headers = [];
|
167 |
+
|
168 |
+
foreach ($batchHeaders as $header) {
|
169 |
+
$headers[$header['name']] = $header['value'];
|
170 |
+
}
|
171 |
+
|
172 |
+
return $headers;
|
173 |
+
}
|
174 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/FacebookClient.php
ADDED
@@ -0,0 +1,250 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook;
|
25 |
+
|
26 |
+
use Facebook\HttpClients\FacebookHttpClientInterface;
|
27 |
+
use Facebook\HttpClients\FacebookCurlHttpClient;
|
28 |
+
use Facebook\HttpClients\FacebookStreamHttpClient;
|
29 |
+
use Facebook\Exceptions\FacebookSDKException;
|
30 |
+
|
31 |
+
/**
|
32 |
+
* Class FacebookClient
|
33 |
+
*
|
34 |
+
* @package Facebook
|
35 |
+
*/
|
36 |
+
class FacebookClient
|
37 |
+
{
|
38 |
+
/**
|
39 |
+
* @const string Production Graph API URL.
|
40 |
+
*/
|
41 |
+
const BASE_GRAPH_URL = 'https://graph.facebook.com';
|
42 |
+
|
43 |
+
/**
|
44 |
+
* @const string Graph API URL for video uploads.
|
45 |
+
*/
|
46 |
+
const BASE_GRAPH_VIDEO_URL = 'https://graph-video.facebook.com';
|
47 |
+
|
48 |
+
/**
|
49 |
+
* @const string Beta Graph API URL.
|
50 |
+
*/
|
51 |
+
const BASE_GRAPH_URL_BETA = 'https://graph.beta.facebook.com';
|
52 |
+
|
53 |
+
/**
|
54 |
+
* @const string Beta Graph API URL for video uploads.
|
55 |
+
*/
|
56 |
+
const BASE_GRAPH_VIDEO_URL_BETA = 'https://graph-video.beta.facebook.com';
|
57 |
+
|
58 |
+
/**
|
59 |
+
* @const int The timeout in seconds for a normal request.
|
60 |
+
*/
|
61 |
+
const DEFAULT_REQUEST_TIMEOUT = 60;
|
62 |
+
|
63 |
+
/**
|
64 |
+
* @const int The timeout in seconds for a request that contains file uploads.
|
65 |
+
*/
|
66 |
+
const DEFAULT_FILE_UPLOAD_REQUEST_TIMEOUT = 3600;
|
67 |
+
|
68 |
+
/**
|
69 |
+
* @const int The timeout in seconds for a request that contains video uploads.
|
70 |
+
*/
|
71 |
+
const DEFAULT_VIDEO_UPLOAD_REQUEST_TIMEOUT = 7200;
|
72 |
+
|
73 |
+
/**
|
74 |
+
* @var bool Toggle to use Graph beta url.
|
75 |
+
*/
|
76 |
+
protected $enableBetaMode = false;
|
77 |
+
|
78 |
+
/**
|
79 |
+
* @var FacebookHttpClientInterface HTTP client handler.
|
80 |
+
*/
|
81 |
+
protected $httpClientHandler;
|
82 |
+
|
83 |
+
/**
|
84 |
+
* @var int The number of calls that have been made to Graph.
|
85 |
+
*/
|
86 |
+
public static $requestCount = 0;
|
87 |
+
|
88 |
+
/**
|
89 |
+
* Instantiates a new FacebookClient object.
|
90 |
+
*
|
91 |
+
* @param FacebookHttpClientInterface|null $httpClientHandler
|
92 |
+
* @param boolean $enableBeta
|
93 |
+
*/
|
94 |
+
public function __construct(FacebookHttpClientInterface $httpClientHandler = null, $enableBeta = false)
|
95 |
+
{
|
96 |
+
$this->httpClientHandler = $httpClientHandler ?: $this->detectHttpClientHandler();
|
97 |
+
$this->enableBetaMode = $enableBeta;
|
98 |
+
}
|
99 |
+
|
100 |
+
/**
|
101 |
+
* Sets the HTTP client handler.
|
102 |
+
*
|
103 |
+
* @param FacebookHttpClientInterface $httpClientHandler
|
104 |
+
*/
|
105 |
+
public function setHttpClientHandler(FacebookHttpClientInterface $httpClientHandler)
|
106 |
+
{
|
107 |
+
$this->httpClientHandler = $httpClientHandler;
|
108 |
+
}
|
109 |
+
|
110 |
+
/**
|
111 |
+
* Returns the HTTP client handler.
|
112 |
+
*
|
113 |
+
* @return FacebookHttpClientInterface
|
114 |
+
*/
|
115 |
+
public function getHttpClientHandler()
|
116 |
+
{
|
117 |
+
return $this->httpClientHandler;
|
118 |
+
}
|
119 |
+
|
120 |
+
/**
|
121 |
+
* Detects which HTTP client handler to use.
|
122 |
+
*
|
123 |
+
* @return FacebookHttpClientInterface
|
124 |
+
*/
|
125 |
+
public function detectHttpClientHandler()
|
126 |
+
{
|
127 |
+
return extension_loaded('curl') ? new FacebookCurlHttpClient() : new FacebookStreamHttpClient();
|
128 |
+
}
|
129 |
+
|
130 |
+
/**
|
131 |
+
* Toggle beta mode.
|
132 |
+
*
|
133 |
+
* @param boolean $betaMode
|
134 |
+
*/
|
135 |
+
public function enableBetaMode($betaMode = true)
|
136 |
+
{
|
137 |
+
$this->enableBetaMode = $betaMode;
|
138 |
+
}
|
139 |
+
|
140 |
+
/**
|
141 |
+
* Returns the base Graph URL.
|
142 |
+
*
|
143 |
+
* @param boolean $postToVideoUrl Post to the video API if videos are being uploaded.
|
144 |
+
*
|
145 |
+
* @return string
|
146 |
+
*/
|
147 |
+
public function getBaseGraphUrl($postToVideoUrl = false)
|
148 |
+
{
|
149 |
+
if ($postToVideoUrl) {
|
150 |
+
return $this->enableBetaMode ? static::BASE_GRAPH_VIDEO_URL_BETA : static::BASE_GRAPH_VIDEO_URL;
|
151 |
+
}
|
152 |
+
|
153 |
+
return $this->enableBetaMode ? static::BASE_GRAPH_URL_BETA : static::BASE_GRAPH_URL;
|
154 |
+
}
|
155 |
+
|
156 |
+
/**
|
157 |
+
* Prepares the request for sending to the client handler.
|
158 |
+
*
|
159 |
+
* @param FacebookRequest $request
|
160 |
+
*
|
161 |
+
* @return array
|
162 |
+
*/
|
163 |
+
public function prepareRequestMessage(FacebookRequest $request)
|
164 |
+
{
|
165 |
+
$postToVideoUrl = $request->containsVideoUploads();
|
166 |
+
$url = $this->getBaseGraphUrl($postToVideoUrl) . $request->getUrl();
|
167 |
+
|
168 |
+
// If we're sending files they should be sent as multipart/form-data
|
169 |
+
if ($request->containsFileUploads()) {
|
170 |
+
$requestBody = $request->getMultipartBody();
|
171 |
+
$request->setHeaders([
|
172 |
+
'Content-Type' => 'multipart/form-data; boundary=' . $requestBody->getBoundary(),
|
173 |
+
]);
|
174 |
+
} else {
|
175 |
+
$requestBody = $request->getUrlEncodedBody();
|
176 |
+
$request->setHeaders([
|
177 |
+
'Content-Type' => 'application/x-www-form-urlencoded',
|
178 |
+
]);
|
179 |
+
}
|
180 |
+
|
181 |
+
return [
|
182 |
+
$url,
|
183 |
+
$request->getMethod(),
|
184 |
+
$request->getHeaders(),
|
185 |
+
$requestBody->getBody(),
|
186 |
+
];
|
187 |
+
}
|
188 |
+
|
189 |
+
/**
|
190 |
+
* Makes the request to Graph and returns the result.
|
191 |
+
*
|
192 |
+
* @param FacebookRequest $request
|
193 |
+
*
|
194 |
+
* @return FacebookResponse
|
195 |
+
*
|
196 |
+
* @throws FacebookSDKException
|
197 |
+
*/
|
198 |
+
public function sendRequest(FacebookRequest $request)
|
199 |
+
{
|
200 |
+
if (get_class($request) === 'Facebook\FacebookRequest') {
|
201 |
+
$request->validateAccessToken();
|
202 |
+
}
|
203 |
+
|
204 |
+
list($url, $method, $headers, $body) = $this->prepareRequestMessage($request);
|
205 |
+
|
206 |
+
// Since file uploads can take a while, we need to give more time for uploads
|
207 |
+
$timeOut = static::DEFAULT_REQUEST_TIMEOUT;
|
208 |
+
if ($request->containsFileUploads()) {
|
209 |
+
$timeOut = static::DEFAULT_FILE_UPLOAD_REQUEST_TIMEOUT;
|
210 |
+
} elseif ($request->containsVideoUploads()) {
|
211 |
+
$timeOut = static::DEFAULT_VIDEO_UPLOAD_REQUEST_TIMEOUT;
|
212 |
+
}
|
213 |
+
|
214 |
+
// Should throw `FacebookSDKException` exception on HTTP client error.
|
215 |
+
// Don't catch to allow it to bubble up.
|
216 |
+
$rawResponse = $this->httpClientHandler->send($url, $method, $body, $headers, $timeOut);
|
217 |
+
|
218 |
+
static::$requestCount++;
|
219 |
+
|
220 |
+
$returnResponse = new FacebookResponse(
|
221 |
+
$request,
|
222 |
+
$rawResponse->getBody(),
|
223 |
+
$rawResponse->getHttpResponseCode(),
|
224 |
+
$rawResponse->getHeaders()
|
225 |
+
);
|
226 |
+
|
227 |
+
if ($returnResponse->isError()) {
|
228 |
+
throw $returnResponse->getThrownException();
|
229 |
+
}
|
230 |
+
|
231 |
+
return $returnResponse;
|
232 |
+
}
|
233 |
+
|
234 |
+
/**
|
235 |
+
* Makes a batched request to Graph and returns the result.
|
236 |
+
*
|
237 |
+
* @param FacebookBatchRequest $request
|
238 |
+
*
|
239 |
+
* @return FacebookBatchResponse
|
240 |
+
*
|
241 |
+
* @throws FacebookSDKException
|
242 |
+
*/
|
243 |
+
public function sendBatchRequest(FacebookBatchRequest $request)
|
244 |
+
{
|
245 |
+
$request->prepareRequestsForBatch();
|
246 |
+
$facebookResponse = $this->sendRequest($request);
|
247 |
+
|
248 |
+
return new FacebookBatchResponse($request, $facebookResponse);
|
249 |
+
}
|
250 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/FacebookRequest.php
ADDED
@@ -0,0 +1,534 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook;
|
25 |
+
|
26 |
+
use Facebook\Authentication\AccessToken;
|
27 |
+
use Facebook\Url\FacebookUrlManipulator;
|
28 |
+
use Facebook\FileUpload\FacebookFile;
|
29 |
+
use Facebook\FileUpload\FacebookVideo;
|
30 |
+
use Facebook\Http\RequestBodyMultipart;
|
31 |
+
use Facebook\Http\RequestBodyUrlEncoded;
|
32 |
+
use Facebook\Exceptions\FacebookSDKException;
|
33 |
+
|
34 |
+
/**
|
35 |
+
* Class Request
|
36 |
+
*
|
37 |
+
* @package Facebook
|
38 |
+
*/
|
39 |
+
class FacebookRequest
|
40 |
+
{
|
41 |
+
/**
|
42 |
+
* @var FacebookApp The Facebook app entity.
|
43 |
+
*/
|
44 |
+
protected $app;
|
45 |
+
|
46 |
+
/**
|
47 |
+
* @var string|null The access token to use for this request.
|
48 |
+
*/
|
49 |
+
protected $accessToken;
|
50 |
+
|
51 |
+
/**
|
52 |
+
* @var string The HTTP method for this request.
|
53 |
+
*/
|
54 |
+
protected $method;
|
55 |
+
|
56 |
+
/**
|
57 |
+
* @var string The Graph endpoint for this request.
|
58 |
+
*/
|
59 |
+
protected $endpoint;
|
60 |
+
|
61 |
+
/**
|
62 |
+
* @var array The headers to send with this request.
|
63 |
+
*/
|
64 |
+
protected $headers = [];
|
65 |
+
|
66 |
+
/**
|
67 |
+
* @var array The parameters to send with this request.
|
68 |
+
*/
|
69 |
+
protected $params = [];
|
70 |
+
|
71 |
+
/**
|
72 |
+
* @var array The files to send with this request.
|
73 |
+
*/
|
74 |
+
protected $files = [];
|
75 |
+
|
76 |
+
/**
|
77 |
+
* @var string ETag to send with this request.
|
78 |
+
*/
|
79 |
+
protected $eTag;
|
80 |
+
|
81 |
+
/**
|
82 |
+
* @var string Graph version to use for this request.
|
83 |
+
*/
|
84 |
+
protected $graphVersion;
|
85 |
+
|
86 |
+
/**
|
87 |
+
* Creates a new Request entity.
|
88 |
+
*
|
89 |
+
* @param FacebookApp|null $app
|
90 |
+
* @param AccessToken|string|null $accessToken
|
91 |
+
* @param string|null $method
|
92 |
+
* @param string|null $endpoint
|
93 |
+
* @param array|null $params
|
94 |
+
* @param string|null $eTag
|
95 |
+
* @param string|null $graphVersion
|
96 |
+
*/
|
97 |
+
public function __construct(FacebookApp $app = null, $accessToken = null, $method = null, $endpoint = null, array $params = [], $eTag = null, $graphVersion = null)
|
98 |
+
{
|
99 |
+
$this->setApp($app);
|
100 |
+
$this->setAccessToken($accessToken);
|
101 |
+
$this->setMethod($method);
|
102 |
+
$this->setEndpoint($endpoint);
|
103 |
+
$this->setParams($params);
|
104 |
+
$this->setETag($eTag);
|
105 |
+
$this->graphVersion = $graphVersion ?: Facebook::DEFAULT_GRAPH_VERSION;
|
106 |
+
}
|
107 |
+
|
108 |
+
/**
|
109 |
+
* Set the access token for this request.
|
110 |
+
*
|
111 |
+
* @param AccessToken|string
|
112 |
+
*
|
113 |
+
* @return FacebookRequest
|
114 |
+
*/
|
115 |
+
public function setAccessToken($accessToken)
|
116 |
+
{
|
117 |
+
$this->accessToken = $accessToken;
|
118 |
+
if ($accessToken instanceof AccessToken) {
|
119 |
+
$this->accessToken = $accessToken->getValue();
|
120 |
+
}
|
121 |
+
|
122 |
+
return $this;
|
123 |
+
}
|
124 |
+
|
125 |
+
/**
|
126 |
+
* Sets the access token with one harvested from a URL or POST params.
|
127 |
+
*
|
128 |
+
* @param string $accessToken The access token.
|
129 |
+
*
|
130 |
+
* @return FacebookRequest
|
131 |
+
*
|
132 |
+
* @throws FacebookSDKException
|
133 |
+
*/
|
134 |
+
public function setAccessTokenFromParams($accessToken)
|
135 |
+
{
|
136 |
+
$existingAccessToken = $this->getAccessToken();
|
137 |
+
if (!$existingAccessToken) {
|
138 |
+
$this->setAccessToken($accessToken);
|
139 |
+
} elseif ($accessToken !== $existingAccessToken) {
|
140 |
+
throw new FacebookSDKException('Access token mismatch. The access token provided in the FacebookRequest and the one provided in the URL or POST params do not match.');
|
141 |
+
}
|
142 |
+
|
143 |
+
return $this;
|
144 |
+
}
|
145 |
+
|
146 |
+
/**
|
147 |
+
* Return the access token for this request.
|
148 |
+
*
|
149 |
+
* @return string|null
|
150 |
+
*/
|
151 |
+
public function getAccessToken()
|
152 |
+
{
|
153 |
+
return $this->accessToken;
|
154 |
+
}
|
155 |
+
|
156 |
+
/**
|
157 |
+
* Return the access token for this request as an AccessToken entity.
|
158 |
+
*
|
159 |
+
* @return AccessToken|null
|
160 |
+
*/
|
161 |
+
public function getAccessTokenEntity()
|
162 |
+
{
|
163 |
+
return $this->accessToken ? new AccessToken($this->accessToken) : null;
|
164 |
+
}
|
165 |
+
|
166 |
+
/**
|
167 |
+
* Set the FacebookApp entity used for this request.
|
168 |
+
*
|
169 |
+
* @param FacebookApp|null $app
|
170 |
+
*/
|
171 |
+
public function setApp(FacebookApp $app = null)
|
172 |
+
{
|
173 |
+
$this->app = $app;
|
174 |
+
}
|
175 |
+
|
176 |
+
/**
|
177 |
+
* Return the FacebookApp entity used for this request.
|
178 |
+
*
|
179 |
+
* @return FacebookApp
|
180 |
+
*/
|
181 |
+
public function getApp()
|
182 |
+
{
|
183 |
+
return $this->app;
|
184 |
+
}
|
185 |
+
|
186 |
+
/**
|
187 |
+
* Generate an app secret proof to sign this request.
|
188 |
+
*
|
189 |
+
* @return string|null
|
190 |
+
*/
|
191 |
+
public function getAppSecretProof()
|
192 |
+
{
|
193 |
+
if (!$accessTokenEntity = $this->getAccessTokenEntity()) {
|
194 |
+
return null;
|
195 |
+
}
|
196 |
+
|
197 |
+
return $accessTokenEntity->getAppSecretProof($this->app->getSecret());
|
198 |
+
}
|
199 |
+
|
200 |
+
/**
|
201 |
+
* Validate that an access token exists for this request.
|
202 |
+
*
|
203 |
+
* @throws FacebookSDKException
|
204 |
+
*/
|
205 |
+
public function validateAccessToken()
|
206 |
+
{
|
207 |
+
$accessToken = $this->getAccessToken();
|
208 |
+
if (!$accessToken) {
|
209 |
+
throw new FacebookSDKException('You must provide an access token.');
|
210 |
+
}
|
211 |
+
}
|
212 |
+
|
213 |
+
/**
|
214 |
+
* Set the HTTP method for this request.
|
215 |
+
*
|
216 |
+
* @param string
|
217 |
+
*/
|
218 |
+
public function setMethod($method)
|
219 |
+
{
|
220 |
+
$this->method = strtoupper($method);
|
221 |
+
}
|
222 |
+
|
223 |
+
/**
|
224 |
+
* Return the HTTP method for this request.
|
225 |
+
*
|
226 |
+
* @return string
|
227 |
+
*/
|
228 |
+
public function getMethod()
|
229 |
+
{
|
230 |
+
return $this->method;
|
231 |
+
}
|
232 |
+
|
233 |
+
/**
|
234 |
+
* Validate that the HTTP method is set.
|
235 |
+
*
|
236 |
+
* @throws FacebookSDKException
|
237 |
+
*/
|
238 |
+
public function validateMethod()
|
239 |
+
{
|
240 |
+
if (!$this->method) {
|
241 |
+
throw new FacebookSDKException('HTTP method not specified.');
|
242 |
+
}
|
243 |
+
|
244 |
+
if (!in_array($this->method, ['GET', 'POST', 'DELETE'])) {
|
245 |
+
throw new FacebookSDKException('Invalid HTTP method specified.');
|
246 |
+
}
|
247 |
+
}
|
248 |
+
|
249 |
+
/**
|
250 |
+
* Set the endpoint for this request.
|
251 |
+
*
|
252 |
+
* @param string
|
253 |
+
*
|
254 |
+
* @return FacebookRequest
|
255 |
+
*
|
256 |
+
* @throws FacebookSDKException
|
257 |
+
*/
|
258 |
+
public function setEndpoint($endpoint)
|
259 |
+
{
|
260 |
+
// Harvest the access token from the endpoint to keep things in sync
|
261 |
+
$params = FacebookUrlManipulator::getParamsAsArray($endpoint);
|
262 |
+
if (isset($params['access_token'])) {
|
263 |
+
$this->setAccessTokenFromParams($params['access_token']);
|
264 |
+
}
|
265 |
+
|
266 |
+
// Clean the token & app secret proof from the endpoint.
|
267 |
+
$filterParams = ['access_token', 'appsecret_proof'];
|
268 |
+
$this->endpoint = FacebookUrlManipulator::removeParamsFromUrl($endpoint, $filterParams);
|
269 |
+
|
270 |
+
return $this;
|
271 |
+
}
|
272 |
+
|
273 |
+
/**
|
274 |
+
* Return the endpoint for this request.
|
275 |
+
*
|
276 |
+
* @return string
|
277 |
+
*/
|
278 |
+
public function getEndpoint()
|
279 |
+
{
|
280 |
+
// For batch requests, this will be empty
|
281 |
+
return $this->endpoint;
|
282 |
+
}
|
283 |
+
|
284 |
+
/**
|
285 |
+
* Generate and return the headers for this request.
|
286 |
+
*
|
287 |
+
* @return array
|
288 |
+
*/
|
289 |
+
public function getHeaders()
|
290 |
+
{
|
291 |
+
$headers = static::getDefaultHeaders();
|
292 |
+
|
293 |
+
if ($this->eTag) {
|
294 |
+
$headers['If-None-Match'] = $this->eTag;
|
295 |
+
}
|
296 |
+
|
297 |
+
return array_merge($this->headers, $headers);
|
298 |
+
}
|
299 |
+
|
300 |
+
/**
|
301 |
+
* Set the headers for this request.
|
302 |
+
*
|
303 |
+
* @param array $headers
|
304 |
+
*/
|
305 |
+
public function setHeaders(array $headers)
|
306 |
+
{
|
307 |
+
$this->headers = array_merge($this->headers, $headers);
|
308 |
+
}
|
309 |
+
|
310 |
+
/**
|
311 |
+
* Sets the eTag value.
|
312 |
+
*
|
313 |
+
* @param string $eTag
|
314 |
+
*/
|
315 |
+
public function setETag($eTag)
|
316 |
+
{
|
317 |
+
$this->eTag = $eTag;
|
318 |
+
}
|
319 |
+
|
320 |
+
/**
|
321 |
+
* Set the params for this request.
|
322 |
+
*
|
323 |
+
* @param array $params
|
324 |
+
*
|
325 |
+
* @return FacebookRequest
|
326 |
+
*
|
327 |
+
* @throws FacebookSDKException
|
328 |
+
*/
|
329 |
+
public function setParams(array $params = [])
|
330 |
+
{
|
331 |
+
if (isset($params['access_token'])) {
|
332 |
+
$this->setAccessTokenFromParams($params['access_token']);
|
333 |
+
}
|
334 |
+
|
335 |
+
// Don't let these buggers slip in.
|
336 |
+
unset($params['access_token'], $params['appsecret_proof']);
|
337 |
+
|
338 |
+
// @TODO Refactor code above with this
|
339 |
+
//$params = $this->sanitizeAuthenticationParams($params);
|
340 |
+
$params = $this->sanitizeFileParams($params);
|
341 |
+
$this->dangerouslySetParams($params);
|
342 |
+
|
343 |
+
return $this;
|
344 |
+
}
|
345 |
+
|
346 |
+
/**
|
347 |
+
* Set the params for this request without filtering them first.
|
348 |
+
*
|
349 |
+
* @param array $params
|
350 |
+
*
|
351 |
+
* @return FacebookRequest
|
352 |
+
*/
|
353 |
+
public function dangerouslySetParams(array $params = [])
|
354 |
+
{
|
355 |
+
$this->params = array_merge($this->params, $params);
|
356 |
+
|
357 |
+
return $this;
|
358 |
+
}
|
359 |
+
|
360 |
+
/**
|
361 |
+
* Iterate over the params and pull out the file uploads.
|
362 |
+
*
|
363 |
+
* @param array $params
|
364 |
+
*
|
365 |
+
* @return array
|
366 |
+
*/
|
367 |
+
public function sanitizeFileParams(array $params)
|
368 |
+
{
|
369 |
+
foreach ($params as $key => $value) {
|
370 |
+
if ($value instanceof FacebookFile) {
|
371 |
+
$this->addFile($key, $value);
|
372 |
+
unset($params[$key]);
|
373 |
+
}
|
374 |
+
}
|
375 |
+
|
376 |
+
return $params;
|
377 |
+
}
|
378 |
+
|
379 |
+
/**
|
380 |
+
* Add a file to be uploaded.
|
381 |
+
*
|
382 |
+
* @param string $key
|
383 |
+
* @param FacebookFile $file
|
384 |
+
*/
|
385 |
+
public function addFile($key, FacebookFile $file)
|
386 |
+
{
|
387 |
+
$this->files[$key] = $file;
|
388 |
+
}
|
389 |
+
|
390 |
+
/**
|
391 |
+
* Removes all the files from the upload queue.
|
392 |
+
*/
|
393 |
+
public function resetFiles()
|
394 |
+
{
|
395 |
+
$this->files = [];
|
396 |
+
}
|
397 |
+
|
398 |
+
/**
|
399 |
+
* Get the list of files to be uploaded.
|
400 |
+
*
|
401 |
+
* @return array
|
402 |
+
*/
|
403 |
+
public function getFiles()
|
404 |
+
{
|
405 |
+
return $this->files;
|
406 |
+
}
|
407 |
+
|
408 |
+
/**
|
409 |
+
* Let's us know if there is a file upload with this request.
|
410 |
+
*
|
411 |
+
* @return boolean
|
412 |
+
*/
|
413 |
+
public function containsFileUploads()
|
414 |
+
{
|
415 |
+
return !empty($this->files);
|
416 |
+
}
|
417 |
+
|
418 |
+
/**
|
419 |
+
* Let's us know if there is a video upload with this request.
|
420 |
+
*
|
421 |
+
* @return boolean
|
422 |
+
*/
|
423 |
+
public function containsVideoUploads()
|
424 |
+
{
|
425 |
+
foreach ($this->files as $file) {
|
426 |
+
if ($file instanceof FacebookVideo) {
|
427 |
+
return true;
|
428 |
+
}
|
429 |
+
}
|
430 |
+
|
431 |
+
return false;
|
432 |
+
}
|
433 |
+
|
434 |
+
/**
|
435 |
+
* Returns the body of the request as multipart/form-data.
|
436 |
+
*
|
437 |
+
* @return RequestBodyMultipart
|
438 |
+
*/
|
439 |
+
public function getMultipartBody()
|
440 |
+
{
|
441 |
+
$params = $this->getPostParams();
|
442 |
+
|
443 |
+
return new RequestBodyMultipart($params, $this->files);
|
444 |
+
}
|
445 |
+
|
446 |
+
/**
|
447 |
+
* Returns the body of the request as URL-encoded.
|
448 |
+
*
|
449 |
+
* @return RequestBodyUrlEncoded
|
450 |
+
*/
|
451 |
+
public function getUrlEncodedBody()
|
452 |
+
{
|
453 |
+
$params = $this->getPostParams();
|
454 |
+
|
455 |
+
return new RequestBodyUrlEncoded($params);
|
456 |
+
}
|
457 |
+
|
458 |
+
/**
|
459 |
+
* Generate and return the params for this request.
|
460 |
+
*
|
461 |
+
* @return array
|
462 |
+
*/
|
463 |
+
public function getParams()
|
464 |
+
{
|
465 |
+
$params = $this->params;
|
466 |
+
|
467 |
+
$accessToken = $this->getAccessToken();
|
468 |
+
if ($accessToken) {
|
469 |
+
$params['access_token'] = $accessToken;
|
470 |
+
$params['appsecret_proof'] = $this->getAppSecretProof();
|
471 |
+
}
|
472 |
+
|
473 |
+
return $params;
|
474 |
+
}
|
475 |
+
|
476 |
+
/**
|
477 |
+
* Only return params on POST requests.
|
478 |
+
*
|
479 |
+
* @return array
|
480 |
+
*/
|
481 |
+
public function getPostParams()
|
482 |
+
{
|
483 |
+
if ($this->getMethod() === 'POST') {
|
484 |
+
return $this->getParams();
|
485 |
+
}
|
486 |
+
|
487 |
+
return [];
|
488 |
+
}
|
489 |
+
|
490 |
+
/**
|
491 |
+
* The graph version used for this request.
|
492 |
+
*
|
493 |
+
* @return string
|
494 |
+
*/
|
495 |
+
public function getGraphVersion()
|
496 |
+
{
|
497 |
+
return $this->graphVersion;
|
498 |
+
}
|
499 |
+
|
500 |
+
/**
|
501 |
+
* Generate and return the URL for this request.
|
502 |
+
*
|
503 |
+
* @return string
|
504 |
+
*/
|
505 |
+
public function getUrl()
|
506 |
+
{
|
507 |
+
$this->validateMethod();
|
508 |
+
|
509 |
+
$graphVersion = FacebookUrlManipulator::forceSlashPrefix($this->graphVersion);
|
510 |
+
$endpoint = FacebookUrlManipulator::forceSlashPrefix($this->getEndpoint());
|
511 |
+
|
512 |
+
$url = $graphVersion . $endpoint;
|
513 |
+
|
514 |
+
if ($this->getMethod() !== 'POST') {
|
515 |
+
$params = $this->getParams();
|
516 |
+
$url = FacebookUrlManipulator::appendParamsToUrl($url, $params);
|
517 |
+
}
|
518 |
+
|
519 |
+
return $url;
|
520 |
+
}
|
521 |
+
|
522 |
+
/**
|
523 |
+
* Return the default headers that every request should use.
|
524 |
+
*
|
525 |
+
* @return array
|
526 |
+
*/
|
527 |
+
public static function getDefaultHeaders()
|
528 |
+
{
|
529 |
+
return [
|
530 |
+
'User-Agent' => 'fb-php-' . Facebook::VERSION,
|
531 |
+
'Accept-Encoding' => '*',
|
532 |
+
];
|
533 |
+
}
|
534 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/FacebookResponse.php
ADDED
@@ -0,0 +1,410 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook;
|
25 |
+
|
26 |
+
use Facebook\GraphNodes\GraphNodeFactory;
|
27 |
+
use Facebook\Exceptions\FacebookResponseException;
|
28 |
+
use Facebook\Exceptions\FacebookSDKException;
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Class FacebookResponse
|
32 |
+
*
|
33 |
+
* @package Facebook
|
34 |
+
*/
|
35 |
+
class FacebookResponse
|
36 |
+
{
|
37 |
+
/**
|
38 |
+
* @var int The HTTP status code response from Graph.
|
39 |
+
*/
|
40 |
+
protected $httpStatusCode;
|
41 |
+
|
42 |
+
/**
|
43 |
+
* @var array The headers returned from Graph.
|
44 |
+
*/
|
45 |
+
protected $headers;
|
46 |
+
|
47 |
+
/**
|
48 |
+
* @var string The raw body of the response from Graph.
|
49 |
+
*/
|
50 |
+
protected $body;
|
51 |
+
|
52 |
+
/**
|
53 |
+
* @var array The decoded body of the Graph response.
|
54 |
+
*/
|
55 |
+
protected $decodedBody = [];
|
56 |
+
|
57 |
+
/**
|
58 |
+
* @var FacebookRequest The original request that returned this response.
|
59 |
+
*/
|
60 |
+
protected $request;
|
61 |
+
|
62 |
+
/**
|
63 |
+
* @var FacebookSDKException The exception thrown by this request.
|
64 |
+
*/
|
65 |
+
protected $thrownException;
|
66 |
+
|
67 |
+
/**
|
68 |
+
* Creates a new Response entity.
|
69 |
+
*
|
70 |
+
* @param FacebookRequest $request
|
71 |
+
* @param string|null $body
|
72 |
+
* @param int|null $httpStatusCode
|
73 |
+
* @param array|null $headers
|
74 |
+
*/
|
75 |
+
public function __construct(FacebookRequest $request, $body = null, $httpStatusCode = null, array $headers = [])
|
76 |
+
{
|
77 |
+
$this->request = $request;
|
78 |
+
$this->body = $body;
|
79 |
+
$this->httpStatusCode = $httpStatusCode;
|
80 |
+
$this->headers = $headers;
|
81 |
+
|
82 |
+
$this->decodeBody();
|
83 |
+
}
|
84 |
+
|
85 |
+
/**
|
86 |
+
* Return the original request that returned this response.
|
87 |
+
*
|
88 |
+
* @return FacebookRequest
|
89 |
+
*/
|
90 |
+
public function getRequest()
|
91 |
+
{
|
92 |
+
return $this->request;
|
93 |
+
}
|
94 |
+
|
95 |
+
/**
|
96 |
+
* Return the FacebookApp entity used for this response.
|
97 |
+
*
|
98 |
+
* @return FacebookApp
|
99 |
+
*/
|
100 |
+
public function getApp()
|
101 |
+
{
|
102 |
+
return $this->request->getApp();
|
103 |
+
}
|
104 |
+
|
105 |
+
/**
|
106 |
+
* Return the access token that was used for this response.
|
107 |
+
*
|
108 |
+
* @return string|null
|
109 |
+
*/
|
110 |
+
public function getAccessToken()
|
111 |
+
{
|
112 |
+
return $this->request->getAccessToken();
|
113 |
+
}
|
114 |
+
|
115 |
+
/**
|
116 |
+
* Return the HTTP status code for this response.
|
117 |
+
*
|
118 |
+
* @return int
|
119 |
+
*/
|
120 |
+
public function getHttpStatusCode()
|
121 |
+
{
|
122 |
+
return $this->httpStatusCode;
|
123 |
+
}
|
124 |
+
|
125 |
+
/**
|
126 |
+
* Return the HTTP headers for this response.
|
127 |
+
*
|
128 |
+
* @return array
|
129 |
+
*/
|
130 |
+
public function getHeaders()
|
131 |
+
{
|
132 |
+
return $this->headers;
|
133 |
+
}
|
134 |
+
|
135 |
+
/**
|
136 |
+
* Return the raw body response.
|
137 |
+
*
|
138 |
+
* @return string
|
139 |
+
*/
|
140 |
+
public function getBody()
|
141 |
+
{
|
142 |
+
return $this->body;
|
143 |
+
}
|
144 |
+
|
145 |
+
/**
|
146 |
+
* Return the decoded body response.
|
147 |
+
*
|
148 |
+
* @return array
|
149 |
+
*/
|
150 |
+
public function getDecodedBody()
|
151 |
+
{
|
152 |
+
return $this->decodedBody;
|
153 |
+
}
|
154 |
+
|
155 |
+
/**
|
156 |
+
* Get the app secret proof that was used for this response.
|
157 |
+
*
|
158 |
+
* @return string|null
|
159 |
+
*/
|
160 |
+
public function getAppSecretProof()
|
161 |
+
{
|
162 |
+
return $this->request->getAppSecretProof();
|
163 |
+
}
|
164 |
+
|
165 |
+
/**
|
166 |
+
* Get the ETag associated with the response.
|
167 |
+
*
|
168 |
+
* @return string|null
|
169 |
+
*/
|
170 |
+
public function getETag()
|
171 |
+
{
|
172 |
+
return isset($this->headers['ETag']) ? $this->headers['ETag'] : null;
|
173 |
+
}
|
174 |
+
|
175 |
+
/**
|
176 |
+
* Get the version of Graph that returned this response.
|
177 |
+
*
|
178 |
+
* @return string|null
|
179 |
+
*/
|
180 |
+
public function getGraphVersion()
|
181 |
+
{
|
182 |
+
return isset($this->headers['Facebook-API-Version']) ? $this->headers['Facebook-API-Version'] : null;
|
183 |
+
}
|
184 |
+
|
185 |
+
/**
|
186 |
+
* Returns true if Graph returned an error message.
|
187 |
+
*
|
188 |
+
* @return boolean
|
189 |
+
*/
|
190 |
+
public function isError()
|
191 |
+
{
|
192 |
+
return isset($this->decodedBody['error']);
|
193 |
+
}
|
194 |
+
|
195 |
+
/**
|
196 |
+
* Throws the exception.
|
197 |
+
*
|
198 |
+
* @throws FacebookSDKException
|
199 |
+
*/
|
200 |
+
public function throwException()
|
201 |
+
{
|
202 |
+
throw $this->thrownException;
|
203 |
+
}
|
204 |
+
|
205 |
+
/**
|
206 |
+
* Instantiates an exception to be thrown later.
|
207 |
+
*/
|
208 |
+
public function makeException()
|
209 |
+
{
|
210 |
+
$this->thrownException = FacebookResponseException::create($this);
|
211 |
+
}
|
212 |
+
|
213 |
+
/**
|
214 |
+
* Returns the exception that was thrown for this request.
|
215 |
+
*
|
216 |
+
* @return FacebookResponseException|null
|
217 |
+
*/
|
218 |
+
public function getThrownException()
|
219 |
+
{
|
220 |
+
return $this->thrownException;
|
221 |
+
}
|
222 |
+
|
223 |
+
/**
|
224 |
+
* Convert the raw response into an array if possible.
|
225 |
+
*
|
226 |
+
* Graph will return 2 types of responses:
|
227 |
+
* - JSON(P)
|
228 |
+
* Most responses from Graph are JSON(P)
|
229 |
+
* - application/x-www-form-urlencoded key/value pairs
|
230 |
+
* Happens on the `/oauth/access_token` endpoint when exchanging
|
231 |
+
* a short-lived access token for a long-lived access token
|
232 |
+
* - And sometimes nothing :/ but that'd be a bug.
|
233 |
+
*/
|
234 |
+
public function decodeBody()
|
235 |
+
{
|
236 |
+
$this->decodedBody = json_decode($this->body, true);
|
237 |
+
|
238 |
+
if ($this->decodedBody === null) {
|
239 |
+
$this->decodedBody = [];
|
240 |
+
parse_str($this->body, $this->decodedBody);
|
241 |
+
} elseif (is_bool($this->decodedBody)) {
|
242 |
+
// Backwards compatibility for Graph < 2.1.
|
243 |
+
// Mimics 2.1 responses.
|
244 |
+
// @TODO Remove this after Graph 2.0 is no longer supported
|
245 |
+
$this->decodedBody = ['success' => $this->decodedBody];
|
246 |
+
} elseif (is_numeric($this->decodedBody)) {
|
247 |
+
$this->decodedBody = ['id' => $this->decodedBody];
|
248 |
+
}
|
249 |
+
|
250 |
+
if (!is_array($this->decodedBody)) {
|
251 |
+
$this->decodedBody = [];
|
252 |
+
}
|
253 |
+
|
254 |
+
if ($this->isError()) {
|
255 |
+
$this->makeException();
|
256 |
+
}
|
257 |
+
}
|
258 |
+
|
259 |
+
/**
|
260 |
+
* Instantiate a new GraphObject from response.
|
261 |
+
*
|
262 |
+
* @param string|null $subclassName The GraphNode subclass to cast to.
|
263 |
+
*
|
264 |
+
* @return \Facebook\GraphNodes\GraphObject
|
265 |
+
*
|
266 |
+
* @throws FacebookSDKException
|
267 |
+
*
|
268 |
+
* @deprecated 5.0.0 getGraphObject() has been renamed to getGraphNode()
|
269 |
+
* @todo v6: Remove this method
|
270 |
+
*/
|
271 |
+
public function getGraphObject($subclassName = null)
|
272 |
+
{
|
273 |
+
return $this->getGraphNode($subclassName);
|
274 |
+
}
|
275 |
+
|
276 |
+
/**
|
277 |
+
* Instantiate a new GraphNode from response.
|
278 |
+
*
|
279 |
+
* @param string|null $subclassName The GraphNode subclass to cast to.
|
280 |
+
*
|
281 |
+
* @return \Facebook\GraphNodes\GraphNode
|
282 |
+
*
|
283 |
+
* @throws FacebookSDKException
|
284 |
+
*/
|
285 |
+
public function getGraphNode($subclassName = null)
|
286 |
+
{
|
287 |
+
$factory = new GraphNodeFactory($this);
|
288 |
+
|
289 |
+
return $factory->makeGraphNode($subclassName);
|
290 |
+
}
|
291 |
+
|
292 |
+
/**
|
293 |
+
* Convenience method for creating a GraphAlbum collection.
|
294 |
+
*
|
295 |
+
* @return \Facebook\GraphNodes\GraphAlbum
|
296 |
+
*
|
297 |
+
* @throws FacebookSDKException
|
298 |
+
*/
|
299 |
+
public function getGraphAlbum()
|
300 |
+
{
|
301 |
+
$factory = new GraphNodeFactory($this);
|
302 |
+
|
303 |
+
return $factory->makeGraphAlbum();
|
304 |
+
}
|
305 |
+
|
306 |
+
/**
|
307 |
+
* Convenience method for creating a GraphPage collection.
|
308 |
+
*
|
309 |
+
* @return \Facebook\GraphNodes\GraphPage
|
310 |
+
*
|
311 |
+
* @throws FacebookSDKException
|
312 |
+
*/
|
313 |
+
public function getGraphPage()
|
314 |
+
{
|
315 |
+
$factory = new GraphNodeFactory($this);
|
316 |
+
|
317 |
+
return $factory->makeGraphPage();
|
318 |
+
}
|
319 |
+
|
320 |
+
/**
|
321 |
+
* Convenience method for creating a GraphSessionInfo collection.
|
322 |
+
*
|
323 |
+
* @return \Facebook\GraphNodes\GraphSessionInfo
|
324 |
+
*
|
325 |
+
* @throws FacebookSDKException
|
326 |
+
*/
|
327 |
+
public function getGraphSessionInfo()
|
328 |
+
{
|
329 |
+
$factory = new GraphNodeFactory($this);
|
330 |
+
|
331 |
+
return $factory->makeGraphSessionInfo();
|
332 |
+
}
|
333 |
+
|
334 |
+
/**
|
335 |
+
* Convenience method for creating a GraphUser collection.
|
336 |
+
*
|
337 |
+
* @return \Facebook\GraphNodes\GraphUser
|
338 |
+
*
|
339 |
+
* @throws FacebookSDKException
|
340 |
+
*/
|
341 |
+
public function getGraphUser()
|
342 |
+
{
|
343 |
+
$factory = new GraphNodeFactory($this);
|
344 |
+
|
345 |
+
return $factory->makeGraphUser();
|
346 |
+
}
|
347 |
+
|
348 |
+
/**
|
349 |
+
* Convenience method for creating a GraphEvent collection.
|
350 |
+
*
|
351 |
+
* @return \Facebook\GraphNodes\GraphEvent
|
352 |
+
*
|
353 |
+
* @throws FacebookSDKException
|
354 |
+
*/
|
355 |
+
public function getGraphEvent()
|
356 |
+
{
|
357 |
+
$factory = new GraphNodeFactory($this);
|
358 |
+
|
359 |
+
return $factory->makeGraphEvent();
|
360 |
+
}
|
361 |
+
|
362 |
+
/**
|
363 |
+
* Convenience method for creating a GraphGroup collection.
|
364 |
+
*
|
365 |
+
* @return \Facebook\GraphNodes\GraphGroup
|
366 |
+
*
|
367 |
+
* @throws FacebookSDKException
|
368 |
+
*/
|
369 |
+
public function getGraphGroup()
|
370 |
+
{
|
371 |
+
$factory = new GraphNodeFactory($this);
|
372 |
+
|
373 |
+
return $factory->makeGraphGroup();
|
374 |
+
}
|
375 |
+
|
376 |
+
/**
|
377 |
+
* Instantiate a new GraphList from response.
|
378 |
+
*
|
379 |
+
* @param string|null $subclassName The GraphNode subclass to cast list items to.
|
380 |
+
* @param boolean $auto_prefix Toggle to auto-prefix the subclass name.
|
381 |
+
*
|
382 |
+
* @return \Facebook\GraphNodes\GraphList
|
383 |
+
*
|
384 |
+
* @throws FacebookSDKException
|
385 |
+
*
|
386 |
+
* @deprecated 5.0.0 getGraphList() has been renamed to getGraphEdge()
|
387 |
+
* @todo v6: Remove this method
|
388 |
+
*/
|
389 |
+
public function getGraphList($subclassName = null, $auto_prefix = true)
|
390 |
+
{
|
391 |
+
return $this->getGraphEdge($subclassName, $auto_prefix);
|
392 |
+
}
|
393 |
+
|
394 |
+
/**
|
395 |
+
* Instantiate a new GraphEdge from response.
|
396 |
+
*
|
397 |
+
* @param string|null $subclassName The GraphNode subclass to cast list items to.
|
398 |
+
* @param boolean $auto_prefix Toggle to auto-prefix the subclass name.
|
399 |
+
*
|
400 |
+
* @return \Facebook\GraphNodes\GraphEdge
|
401 |
+
*
|
402 |
+
* @throws FacebookSDKException
|
403 |
+
*/
|
404 |
+
public function getGraphEdge($subclassName = null, $auto_prefix = true)
|
405 |
+
{
|
406 |
+
$factory = new GraphNodeFactory($this);
|
407 |
+
|
408 |
+
return $factory->makeGraphEdge($subclassName, $auto_prefix);
|
409 |
+
}
|
410 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/FileUpload/FacebookFile.php
ADDED
@@ -0,0 +1,169 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\FileUpload;
|
25 |
+
|
26 |
+
use Facebook\Exceptions\FacebookSDKException;
|
27 |
+
|
28 |
+
/**
|
29 |
+
* Class FacebookFile
|
30 |
+
*
|
31 |
+
* @package Facebook
|
32 |
+
*/
|
33 |
+
class FacebookFile
|
34 |
+
{
|
35 |
+
/**
|
36 |
+
* @var string The path to the file on the system.
|
37 |
+
*/
|
38 |
+
protected $path;
|
39 |
+
|
40 |
+
/**
|
41 |
+
* @var int The maximum bytes to read. Defaults to -1 (read all the remaining buffer).
|
42 |
+
*/
|
43 |
+
private $maxLength;
|
44 |
+
|
45 |
+
/**
|
46 |
+
* @var int Seek to the specified offset before reading. If this number is negative, no seeking will occur and reading will start from the current position.
|
47 |
+
*/
|
48 |
+
private $offset;
|
49 |
+
|
50 |
+
/**
|
51 |
+
* @var resource The stream pointing to the file.
|
52 |
+
*/
|
53 |
+
protected $stream;
|
54 |
+
|
55 |
+
/**
|
56 |
+
* Creates a new FacebookFile entity.
|
57 |
+
*
|
58 |
+
* @param string $filePath
|
59 |
+
* @param int $maxLength
|
60 |
+
* @param int $offset
|
61 |
+
*
|
62 |
+
* @throws FacebookSDKException
|
63 |
+
*/
|
64 |
+
public function __construct($filePath, $maxLength = -1, $offset = -1)
|
65 |
+
{
|
66 |
+
$this->path = $filePath;
|
67 |
+
$this->maxLength = $maxLength;
|
68 |
+
$this->offset = $offset;
|
69 |
+
$this->open();
|
70 |
+
}
|
71 |
+
|
72 |
+
/**
|
73 |
+
* Closes the stream when destructed.
|
74 |
+
*/
|
75 |
+
public function __destruct()
|
76 |
+
{
|
77 |
+
$this->close();
|
78 |
+
}
|
79 |
+
|
80 |
+
/**
|
81 |
+
* Opens a stream for the file.
|
82 |
+
*
|
83 |
+
* @throws FacebookSDKException
|
84 |
+
*/
|
85 |
+
public function open()
|
86 |
+
{
|
87 |
+
if (!$this->isRemoteFile($this->path) && !is_readable($this->path)) {
|
88 |
+
throw new FacebookSDKException('Failed to create FacebookFile entity. Unable to read resource: ' . $this->path . '.');
|
89 |
+
}
|
90 |
+
|
91 |
+
$this->stream = fopen($this->path, 'r');
|
92 |
+
|
93 |
+
if (!$this->stream) {
|
94 |
+
throw new FacebookSDKException('Failed to create FacebookFile entity. Unable to open resource: ' . $this->path . '.');
|
95 |
+
}
|
96 |
+
}
|
97 |
+
|
98 |
+
/**
|
99 |
+
* Stops the file stream.
|
100 |
+
*/
|
101 |
+
public function close()
|
102 |
+
{
|
103 |
+
if (is_resource($this->stream)) {
|
104 |
+
fclose($this->stream);
|
105 |
+
}
|
106 |
+
}
|
107 |
+
|
108 |
+
/**
|
109 |
+
* Return the contents of the file.
|
110 |
+
*
|
111 |
+
* @return string
|
112 |
+
*/
|
113 |
+
public function getContents()
|
114 |
+
{
|
115 |
+
return stream_get_contents($this->stream, $this->maxLength, $this->offset);
|
116 |
+
}
|
117 |
+
|
118 |
+
/**
|
119 |
+
* Return the name of the file.
|
120 |
+
*
|
121 |
+
* @return string
|
122 |
+
*/
|
123 |
+
public function getFileName()
|
124 |
+
{
|
125 |
+
return basename($this->path);
|
126 |
+
}
|
127 |
+
|
128 |
+
/**
|
129 |
+
* Return the path of the file.
|
130 |
+
*
|
131 |
+
* @return string
|
132 |
+
*/
|
133 |
+
public function getFilePath()
|
134 |
+
{
|
135 |
+
return $this->path;
|
136 |
+
}
|
137 |
+
|
138 |
+
/**
|
139 |
+
* Return the size of the file.
|
140 |
+
*
|
141 |
+
* @return int
|
142 |
+
*/
|
143 |
+
public function getSize()
|
144 |
+
{
|
145 |
+
return filesize($this->path);
|
146 |
+
}
|
147 |
+
|
148 |
+
/**
|
149 |
+
* Return the mimetype of the file.
|
150 |
+
*
|
151 |
+
* @return string
|
152 |
+
*/
|
153 |
+
public function getMimetype()
|
154 |
+
{
|
155 |
+
return Mimetypes::getInstance()->fromFilename($this->path) ?: 'text/plain';
|
156 |
+
}
|
157 |
+
|
158 |
+
/**
|
159 |
+
* Returns true if the path to the file is remote.
|
160 |
+
*
|
161 |
+
* @param string $pathToFile
|
162 |
+
*
|
163 |
+
* @return boolean
|
164 |
+
*/
|
165 |
+
protected function isRemoteFile($pathToFile)
|
166 |
+
{
|
167 |
+
return preg_match('/^(https?|ftp):\/\/.*/', $pathToFile) === 1;
|
168 |
+
}
|
169 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/FileUpload/FacebookResumableUploader.php
ADDED
@@ -0,0 +1,167 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\FileUpload;
|
25 |
+
|
26 |
+
use Facebook\Authentication\AccessToken;
|
27 |
+
use Facebook\Exceptions\FacebookResponseException;
|
28 |
+
use Facebook\Exceptions\FacebookResumableUploadException;
|
29 |
+
use Facebook\Exceptions\FacebookSDKException;
|
30 |
+
use Facebook\FacebookApp;
|
31 |
+
use Facebook\FacebookClient;
|
32 |
+
use Facebook\FacebookRequest;
|
33 |
+
|
34 |
+
/**
|
35 |
+
* Class FacebookResumableUploader
|
36 |
+
*
|
37 |
+
* @package Facebook
|
38 |
+
*/
|
39 |
+
class FacebookResumableUploader
|
40 |
+
{
|
41 |
+
/**
|
42 |
+
* @var FacebookApp
|
43 |
+
*/
|
44 |
+
protected $app;
|
45 |
+
|
46 |
+
/**
|
47 |
+
* @var string
|
48 |
+
*/
|
49 |
+
protected $accessToken;
|
50 |
+
|
51 |
+
/**
|
52 |
+
* @var FacebookClient The Facebook client service.
|
53 |
+
*/
|
54 |
+
protected $client;
|
55 |
+
|
56 |
+
/**
|
57 |
+
* @var string Graph version to use for this request.
|
58 |
+
*/
|
59 |
+
protected $graphVersion;
|
60 |
+
|
61 |
+
/**
|
62 |
+
* @param FacebookApp $app
|
63 |
+
* @param FacebookClient $client
|
64 |
+
* @param AccessToken|string|null $accessToken
|
65 |
+
* @param string $graphVersion
|
66 |
+
*/
|
67 |
+
public function __construct(FacebookApp $app, FacebookClient $client, $accessToken, $graphVersion)
|
68 |
+
{
|
69 |
+
$this->app = $app;
|
70 |
+
$this->client = $client;
|
71 |
+
$this->accessToken = $accessToken;
|
72 |
+
$this->graphVersion = $graphVersion;
|
73 |
+
}
|
74 |
+
|
75 |
+
/**
|
76 |
+
* Upload by chunks - start phase
|
77 |
+
*
|
78 |
+
* @param string $endpoint
|
79 |
+
* @param FacebookFile $file
|
80 |
+
*
|
81 |
+
* @return FacebookTransferChunk
|
82 |
+
*
|
83 |
+
* @throws FacebookSDKException
|
84 |
+
*/
|
85 |
+
public function start($endpoint, FacebookFile $file)
|
86 |
+
{
|
87 |
+
$params = [
|
88 |
+
'upload_phase' => 'start',
|
89 |
+
'file_size' => $file->getSize(),
|
90 |
+
];
|
91 |
+
$response = $this->sendUploadRequest($endpoint, $params);
|
92 |
+
|
93 |
+
return new FacebookTransferChunk($file, $response['upload_session_id'], $response['video_id'], $response['start_offset'], $response['end_offset']);
|
94 |
+
}
|
95 |
+
|
96 |
+
/**
|
97 |
+
* Upload by chunks - transfer phase
|
98 |
+
*
|
99 |
+
* @param string $endpoint
|
100 |
+
* @param FacebookTransferChunk $chunk
|
101 |
+
* @param boolean $allowToThrow
|
102 |
+
*
|
103 |
+
* @return FacebookTransferChunk
|
104 |
+
*
|
105 |
+
* @throws FacebookResponseException
|
106 |
+
*/
|
107 |
+
public function transfer($endpoint, FacebookTransferChunk $chunk, $allowToThrow = false)
|
108 |
+
{
|
109 |
+
$params = [
|
110 |
+
'upload_phase' => 'transfer',
|
111 |
+
'upload_session_id' => $chunk->getUploadSessionId(),
|
112 |
+
'start_offset' => $chunk->getStartOffset(),
|
113 |
+
'video_file_chunk' => $chunk->getPartialFile(),
|
114 |
+
];
|
115 |
+
|
116 |
+
try {
|
117 |
+
$response = $this->sendUploadRequest($endpoint, $params);
|
118 |
+
} catch (FacebookResponseException $e) {
|
119 |
+
$preException = $e->getPrevious();
|
120 |
+
if ($allowToThrow || !$preException instanceof FacebookResumableUploadException) {
|
121 |
+
throw $e;
|
122 |
+
}
|
123 |
+
|
124 |
+
// Return the same chunk entity so it can be retried.
|
125 |
+
return $chunk;
|
126 |
+
}
|
127 |
+
|
128 |
+
return new FacebookTransferChunk($chunk->getFile(), $chunk->getUploadSessionId(), $chunk->getVideoId(), $response['start_offset'], $response['end_offset']);
|
129 |
+
}
|
130 |
+
|
131 |
+
/**
|
132 |
+
* Upload by chunks - finish phase
|
133 |
+
*
|
134 |
+
* @param string $endpoint
|
135 |
+
* @param string $uploadSessionId
|
136 |
+
* @param array $metadata The metadata associated with the file.
|
137 |
+
*
|
138 |
+
* @return boolean
|
139 |
+
*
|
140 |
+
* @throws FacebookSDKException
|
141 |
+
*/
|
142 |
+
public function finish($endpoint, $uploadSessionId, $metadata = [])
|
143 |
+
{
|
144 |
+
$params = array_merge($metadata, [
|
145 |
+
'upload_phase' => 'finish',
|
146 |
+
'upload_session_id' => $uploadSessionId,
|
147 |
+
]);
|
148 |
+
$response = $this->sendUploadRequest($endpoint, $params);
|
149 |
+
|
150 |
+
return $response['success'];
|
151 |
+
}
|
152 |
+
|
153 |
+
/**
|
154 |
+
* Helper to make a FacebookRequest and send it.
|
155 |
+
*
|
156 |
+
* @param string $endpoint The endpoint to POST to.
|
157 |
+
* @param array $params The params to send with the request.
|
158 |
+
*
|
159 |
+
* @return array
|
160 |
+
*/
|
161 |
+
private function sendUploadRequest($endpoint, $params = [])
|
162 |
+
{
|
163 |
+
$request = new FacebookRequest($this->app, $this->accessToken, 'POST', $endpoint, $params, null, $this->graphVersion);
|
164 |
+
|
165 |
+
return $this->client->sendRequest($request)->getDecodedBody();
|
166 |
+
}
|
167 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/FileUpload/FacebookTransferChunk.php
ADDED
@@ -0,0 +1,133 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\FileUpload;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class FacebookTransferChunk
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
class FacebookTransferChunk
|
32 |
+
{
|
33 |
+
/**
|
34 |
+
* @var FacebookFile The file to chunk during upload.
|
35 |
+
*/
|
36 |
+
private $file;
|
37 |
+
|
38 |
+
/**
|
39 |
+
* @var int The ID of the upload session.
|
40 |
+
*/
|
41 |
+
private $uploadSessionId;
|
42 |
+
|
43 |
+
/**
|
44 |
+
* @var int Start byte position of the next file chunk.
|
45 |
+
*/
|
46 |
+
private $startOffset;
|
47 |
+
|
48 |
+
/**
|
49 |
+
* @var int End byte position of the next file chunk.
|
50 |
+
*/
|
51 |
+
private $endOffset;
|
52 |
+
|
53 |
+
/**
|
54 |
+
* @var int The ID of the video.
|
55 |
+
*/
|
56 |
+
private $videoId;
|
57 |
+
|
58 |
+
/**
|
59 |
+
* @param FacebookFile $file
|
60 |
+
* @param int $uploadSessionId
|
61 |
+
* @param int $videoId
|
62 |
+
* @param int $startOffset
|
63 |
+
* @param int $endOffset
|
64 |
+
*/
|
65 |
+
public function __construct(FacebookFile $file, $uploadSessionId, $videoId, $startOffset, $endOffset)
|
66 |
+
{
|
67 |
+
$this->file = $file;
|
68 |
+
$this->uploadSessionId = $uploadSessionId;
|
69 |
+
$this->videoId = $videoId;
|
70 |
+
$this->startOffset = $startOffset;
|
71 |
+
$this->endOffset = $endOffset;
|
72 |
+
}
|
73 |
+
|
74 |
+
/**
|
75 |
+
* Return the file entity.
|
76 |
+
*
|
77 |
+
* @return FacebookFile
|
78 |
+
*/
|
79 |
+
public function getFile()
|
80 |
+
{
|
81 |
+
return $this->file;
|
82 |
+
}
|
83 |
+
|
84 |
+
/**
|
85 |
+
* Return a FacebookFile entity with partial content.
|
86 |
+
*
|
87 |
+
* @return FacebookFile
|
88 |
+
*/
|
89 |
+
public function getPartialFile()
|
90 |
+
{
|
91 |
+
$maxLength = $this->endOffset - $this->startOffset;
|
92 |
+
|
93 |
+
return new FacebookFile($this->file->getFilePath(), $maxLength, $this->startOffset);
|
94 |
+
}
|
95 |
+
|
96 |
+
/**
|
97 |
+
* Return upload session Id
|
98 |
+
*
|
99 |
+
* @return int
|
100 |
+
*/
|
101 |
+
public function getUploadSessionId()
|
102 |
+
{
|
103 |
+
return $this->uploadSessionId;
|
104 |
+
}
|
105 |
+
|
106 |
+
/**
|
107 |
+
* Check whether is the last chunk
|
108 |
+
*
|
109 |
+
* @return bool
|
110 |
+
*/
|
111 |
+
public function isLastChunk()
|
112 |
+
{
|
113 |
+
return $this->startOffset === $this->endOffset;
|
114 |
+
}
|
115 |
+
|
116 |
+
/**
|
117 |
+
* @return int
|
118 |
+
*/
|
119 |
+
public function getStartOffset()
|
120 |
+
{
|
121 |
+
return $this->startOffset;
|
122 |
+
}
|
123 |
+
|
124 |
+
/**
|
125 |
+
* Get uploaded video Id
|
126 |
+
*
|
127 |
+
* @return int
|
128 |
+
*/
|
129 |
+
public function getVideoId()
|
130 |
+
{
|
131 |
+
return $this->videoId;
|
132 |
+
}
|
133 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/FileUpload/FacebookVideo.php
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\FileUpload;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class FacebookVideo
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
class FacebookVideo extends FacebookFile
|
32 |
+
{
|
33 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/FileUpload/Mimetypes.php
ADDED
@@ -0,0 +1,988 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\FileUpload;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Provides mappings of file extensions to mimetypes
|
28 |
+
*
|
29 |
+
* Taken from Guzzle
|
30 |
+
*
|
31 |
+
* @see https://github.com/guzzle/guzzle/blob/master/src/Mimetypes.php
|
32 |
+
*
|
33 |
+
* @link http://svn.apache.org/repos/asf/httpd/httpd/branches/1.3.x/conf/mime.types
|
34 |
+
*/
|
35 |
+
class Mimetypes
|
36 |
+
{
|
37 |
+
/** @var self */
|
38 |
+
protected static $instance;
|
39 |
+
|
40 |
+
/** @var array Mapping of extension to mimetype */
|
41 |
+
protected $mimetypes = [
|
42 |
+
'3dml' => 'text/vnd.in3d.3dml',
|
43 |
+
'3g2' => 'video/3gpp2',
|
44 |
+
'3gp' => 'video/3gpp',
|
45 |
+
'7z' => 'application/x-7z-compressed',
|
46 |
+
'aab' => 'application/x-authorware-bin',
|
47 |
+
'aac' => 'audio/x-aac',
|
48 |
+
'aam' => 'application/x-authorware-map',
|
49 |
+
'aas' => 'application/x-authorware-seg',
|
50 |
+
'abw' => 'application/x-abiword',
|
51 |
+
'ac' => 'application/pkix-attr-cert',
|
52 |
+
'acc' => 'application/vnd.americandynamics.acc',
|
53 |
+
'ace' => 'application/x-ace-compressed',
|
54 |
+
'acu' => 'application/vnd.acucobol',
|
55 |
+
'acutc' => 'application/vnd.acucorp',
|
56 |
+
'adp' => 'audio/adpcm',
|
57 |
+
'aep' => 'application/vnd.audiograph',
|
58 |
+
'afm' => 'application/x-font-type1',
|
59 |
+
'afp' => 'application/vnd.ibm.modcap',
|
60 |
+
'ahead' => 'application/vnd.ahead.space',
|
61 |
+
'ai' => 'application/postscript',
|
62 |
+
'aif' => 'audio/x-aiff',
|
63 |
+
'aifc' => 'audio/x-aiff',
|
64 |
+
'aiff' => 'audio/x-aiff',
|
65 |
+
'air' => 'application/vnd.adobe.air-application-installer-package+zip',
|
66 |
+
'ait' => 'application/vnd.dvb.ait',
|
67 |
+
'ami' => 'application/vnd.amiga.ami',
|
68 |
+
'apk' => 'application/vnd.android.package-archive',
|
69 |
+
'application' => 'application/x-ms-application',
|
70 |
+
'apr' => 'application/vnd.lotus-approach',
|
71 |
+
'asa' => 'text/plain',
|
72 |
+
'asax' => 'application/octet-stream',
|
73 |
+
'asc' => 'application/pgp-signature',
|
74 |
+
'ascx' => 'text/plain',
|
75 |
+
'asf' => 'video/x-ms-asf',
|
76 |
+
'ashx' => 'text/plain',
|
77 |
+
'asm' => 'text/x-asm',
|
78 |
+
'asmx' => 'text/plain',
|
79 |
+
'aso' => 'application/vnd.accpac.simply.aso',
|
80 |
+
'asp' => 'text/plain',
|
81 |
+
'aspx' => 'text/plain',
|
82 |
+
'asx' => 'video/x-ms-asf',
|
83 |
+
'atc' => 'application/vnd.acucorp',
|
84 |
+
'atom' => 'application/atom+xml',
|
85 |
+
'atomcat' => 'application/atomcat+xml',
|
86 |
+
'atomsvc' => 'application/atomsvc+xml',
|
87 |
+
'atx' => 'application/vnd.antix.game-component',
|
88 |
+
'au' => 'audio/basic',
|
89 |
+
'avi' => 'video/x-msvideo',
|
90 |
+
'aw' => 'application/applixware',
|
91 |
+
'axd' => 'text/plain',
|
92 |
+
'azf' => 'application/vnd.airzip.filesecure.azf',
|
93 |
+
'azs' => 'application/vnd.airzip.filesecure.azs',
|
94 |
+
'azw' => 'application/vnd.amazon.ebook',
|
95 |
+
'bat' => 'application/x-msdownload',
|
96 |
+
'bcpio' => 'application/x-bcpio',
|
97 |
+
'bdf' => 'application/x-font-bdf',
|
98 |
+
'bdm' => 'application/vnd.syncml.dm+wbxml',
|
99 |
+
'bed' => 'application/vnd.realvnc.bed',
|
100 |
+
'bh2' => 'application/vnd.fujitsu.oasysprs',
|
101 |
+
'bin' => 'application/octet-stream',
|
102 |
+
'bmi' => 'application/vnd.bmi',
|
103 |
+
'bmp' => 'image/bmp',
|
104 |
+
'book' => 'application/vnd.framemaker',
|
105 |
+
'box' => 'application/vnd.previewsystems.box',
|
106 |
+
'boz' => 'application/x-bzip2',
|
107 |
+
'bpk' => 'application/octet-stream',
|
108 |
+
'btif' => 'image/prs.btif',
|
109 |
+
'bz' => 'application/x-bzip',
|
110 |
+
'bz2' => 'application/x-bzip2',
|
111 |
+
'c' => 'text/x-c',
|
112 |
+
'c11amc' => 'application/vnd.cluetrust.cartomobile-config',
|
113 |
+
'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg',
|
114 |
+
'c4d' => 'application/vnd.clonk.c4group',
|
115 |
+
'c4f' => 'application/vnd.clonk.c4group',
|
116 |
+
'c4g' => 'application/vnd.clonk.c4group',
|
117 |
+
'c4p' => 'application/vnd.clonk.c4group',
|
118 |
+
'c4u' => 'application/vnd.clonk.c4group',
|
119 |
+
'cab' => 'application/vnd.ms-cab-compressed',
|
120 |
+
'car' => 'application/vnd.curl.car',
|
121 |
+
'cat' => 'application/vnd.ms-pki.seccat',
|
122 |
+
'cc' => 'text/x-c',
|
123 |
+
'cct' => 'application/x-director',
|
124 |
+
'ccxml' => 'application/ccxml+xml',
|
125 |
+
'cdbcmsg' => 'application/vnd.contact.cmsg',
|
126 |
+
'cdf' => 'application/x-netcdf',
|
127 |
+
'cdkey' => 'application/vnd.mediastation.cdkey',
|
128 |
+
'cdmia' => 'application/cdmi-capability',
|
129 |
+
'cdmic' => 'application/cdmi-container',
|
130 |
+
'cdmid' => 'application/cdmi-domain',
|
131 |
+
'cdmio' => 'application/cdmi-object',
|
132 |
+
'cdmiq' => 'application/cdmi-queue',
|
133 |
+
'cdx' => 'chemical/x-cdx',
|
134 |
+
'cdxml' => 'application/vnd.chemdraw+xml',
|
135 |
+
'cdy' => 'application/vnd.cinderella',
|
136 |
+
'cer' => 'application/pkix-cert',
|
137 |
+
'cfc' => 'application/x-coldfusion',
|
138 |
+
'cfm' => 'application/x-coldfusion',
|
139 |
+
'cgm' => 'image/cgm',
|
140 |
+
'chat' => 'application/x-chat',
|
141 |
+
'chm' => 'application/vnd.ms-htmlhelp',
|
142 |
+
'chrt' => 'application/vnd.kde.kchart',
|
143 |
+
'cif' => 'chemical/x-cif',
|
144 |
+
'cii' => 'application/vnd.anser-web-certificate-issue-initiation',
|
145 |
+
'cil' => 'application/vnd.ms-artgalry',
|
146 |
+
'cla' => 'application/vnd.claymore',
|
147 |
+
'class' => 'application/java-vm',
|
148 |
+
'clkk' => 'application/vnd.crick.clicker.keyboard',
|
149 |
+
'clkp' => 'application/vnd.crick.clicker.palette',
|
150 |
+
'clkt' => 'application/vnd.crick.clicker.template',
|
151 |
+
'clkw' => 'application/vnd.crick.clicker.wordbank',
|
152 |
+
'clkx' => 'application/vnd.crick.clicker',
|
153 |
+
'clp' => 'application/x-msclip',
|
154 |
+
'cmc' => 'application/vnd.cosmocaller',
|
155 |
+
'cmdf' => 'chemical/x-cmdf',
|
156 |
+
'cml' => 'chemical/x-cml',
|
157 |
+
'cmp' => 'application/vnd.yellowriver-custom-menu',
|
158 |
+
'cmx' => 'image/x-cmx',
|
159 |
+
'cod' => 'application/vnd.rim.cod',
|
160 |
+
'com' => 'application/x-msdownload',
|
161 |
+
'conf' => 'text/plain',
|
162 |
+
'cpio' => 'application/x-cpio',
|
163 |
+
'cpp' => 'text/x-c',
|
164 |
+
'cpt' => 'application/mac-compactpro',
|
165 |
+
'crd' => 'application/x-mscardfile',
|
166 |
+
'crl' => 'application/pkix-crl',
|
167 |
+
'crt' => 'application/x-x509-ca-cert',
|
168 |
+
'cryptonote' => 'application/vnd.rig.cryptonote',
|
169 |
+
'cs' => 'text/plain',
|
170 |
+
'csh' => 'application/x-csh',
|
171 |
+
'csml' => 'chemical/x-csml',
|
172 |
+
'csp' => 'application/vnd.commonspace',
|
173 |
+
'css' => 'text/css',
|
174 |
+
'cst' => 'application/x-director',
|
175 |
+
'csv' => 'text/csv',
|
176 |
+
'cu' => 'application/cu-seeme',
|
177 |
+
'curl' => 'text/vnd.curl',
|
178 |
+
'cww' => 'application/prs.cww',
|
179 |
+
'cxt' => 'application/x-director',
|
180 |
+
'cxx' => 'text/x-c',
|
181 |
+
'dae' => 'model/vnd.collada+xml',
|
182 |
+
'daf' => 'application/vnd.mobius.daf',
|
183 |
+
'dataless' => 'application/vnd.fdsn.seed',
|
184 |
+
'davmount' => 'application/davmount+xml',
|
185 |
+
'dcr' => 'application/x-director',
|
186 |
+
'dcurl' => 'text/vnd.curl.dcurl',
|
187 |
+
'dd2' => 'application/vnd.oma.dd2+xml',
|
188 |
+
'ddd' => 'application/vnd.fujixerox.ddd',
|
189 |
+
'deb' => 'application/x-debian-package',
|
190 |
+
'def' => 'text/plain',
|
191 |
+
'deploy' => 'application/octet-stream',
|
192 |
+
'der' => 'application/x-x509-ca-cert',
|
193 |
+
'dfac' => 'application/vnd.dreamfactory',
|
194 |
+
'dic' => 'text/x-c',
|
195 |
+
'dir' => 'application/x-director',
|
196 |
+
'dis' => 'application/vnd.mobius.dis',
|
197 |
+
'dist' => 'application/octet-stream',
|
198 |
+
'distz' => 'application/octet-stream',
|
199 |
+
'djv' => 'image/vnd.djvu',
|
200 |
+
'djvu' => 'image/vnd.djvu',
|
201 |
+
'dll' => 'application/x-msdownload',
|
202 |
+
'dmg' => 'application/octet-stream',
|
203 |
+
'dms' => 'application/octet-stream',
|
204 |
+
'dna' => 'application/vnd.dna',
|
205 |
+
'doc' => 'application/msword',
|
206 |
+
'docm' => 'application/vnd.ms-word.document.macroenabled.12',
|
207 |
+
'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
208 |
+
'dot' => 'application/msword',
|
209 |
+
'dotm' => 'application/vnd.ms-word.template.macroenabled.12',
|
210 |
+
'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
|
211 |
+
'dp' => 'application/vnd.osgi.dp',
|
212 |
+
'dpg' => 'application/vnd.dpgraph',
|
213 |
+
'dra' => 'audio/vnd.dra',
|
214 |
+
'dsc' => 'text/prs.lines.tag',
|
215 |
+
'dssc' => 'application/dssc+der',
|
216 |
+
'dtb' => 'application/x-dtbook+xml',
|
217 |
+
'dtd' => 'application/xml-dtd',
|
218 |
+
'dts' => 'audio/vnd.dts',
|
219 |
+
'dtshd' => 'audio/vnd.dts.hd',
|
220 |
+
'dump' => 'application/octet-stream',
|
221 |
+
'dvi' => 'application/x-dvi',
|
222 |
+
'dwf' => 'model/vnd.dwf',
|
223 |
+
'dwg' => 'image/vnd.dwg',
|
224 |
+
'dxf' => 'image/vnd.dxf',
|
225 |
+
'dxp' => 'application/vnd.spotfire.dxp',
|
226 |
+
'dxr' => 'application/x-director',
|
227 |
+
'ecelp4800' => 'audio/vnd.nuera.ecelp4800',
|
228 |
+
'ecelp7470' => 'audio/vnd.nuera.ecelp7470',
|
229 |
+
'ecelp9600' => 'audio/vnd.nuera.ecelp9600',
|
230 |
+
'ecma' => 'application/ecmascript',
|
231 |
+
'edm' => 'application/vnd.novadigm.edm',
|
232 |
+
'edx' => 'application/vnd.novadigm.edx',
|
233 |
+
'efif' => 'application/vnd.picsel',
|
234 |
+
'ei6' => 'application/vnd.pg.osasli',
|
235 |
+
'elc' => 'application/octet-stream',
|
236 |
+
'eml' => 'message/rfc822',
|
237 |
+
'emma' => 'application/emma+xml',
|
238 |
+
'eol' => 'audio/vnd.digital-winds',
|
239 |
+
'eot' => 'application/vnd.ms-fontobject',
|
240 |
+
'eps' => 'application/postscript',
|
241 |
+
'epub' => 'application/epub+zip',
|
242 |
+
'es3' => 'application/vnd.eszigno3+xml',
|
243 |
+
'esf' => 'application/vnd.epson.esf',
|
244 |
+
'et3' => 'application/vnd.eszigno3+xml',
|
245 |
+
'etx' => 'text/x-setext',
|
246 |
+
'exe' => 'application/x-msdownload',
|
247 |
+
'exi' => 'application/exi',
|
248 |
+
'ext' => 'application/vnd.novadigm.ext',
|
249 |
+
'ez' => 'application/andrew-inset',
|
250 |
+
'ez2' => 'application/vnd.ezpix-album',
|
251 |
+
'ez3' => 'application/vnd.ezpix-package',
|
252 |
+
'f' => 'text/x-fortran',
|
253 |
+
'f4v' => 'video/x-f4v',
|
254 |
+
'f77' => 'text/x-fortran',
|
255 |
+
'f90' => 'text/x-fortran',
|
256 |
+
'fbs' => 'image/vnd.fastbidsheet',
|
257 |
+
'fcs' => 'application/vnd.isac.fcs',
|
258 |
+
'fdf' => 'application/vnd.fdf',
|
259 |
+
'fe_launch' => 'application/vnd.denovo.fcselayout-link',
|
260 |
+
'fg5' => 'application/vnd.fujitsu.oasysgp',
|
261 |
+
'fgd' => 'application/x-director',
|
262 |
+
'fh' => 'image/x-freehand',
|
263 |
+
'fh4' => 'image/x-freehand',
|
264 |
+
'fh5' => 'image/x-freehand',
|
265 |
+
'fh7' => 'image/x-freehand',
|
266 |
+
'fhc' => 'image/x-freehand',
|
267 |
+
'fig' => 'application/x-xfig',
|
268 |
+
'fli' => 'video/x-fli',
|
269 |
+
'flo' => 'application/vnd.micrografx.flo',
|
270 |
+
'flv' => 'video/x-flv',
|
271 |
+
'flw' => 'application/vnd.kde.kivio',
|
272 |
+
'flx' => 'text/vnd.fmi.flexstor',
|
273 |
+
'fly' => 'text/vnd.fly',
|
274 |
+
'fm' => 'application/vnd.framemaker',
|
275 |
+
'fnc' => 'application/vnd.frogans.fnc',
|
276 |
+
'for' => 'text/x-fortran',
|
277 |
+
'fpx' => 'image/vnd.fpx',
|
278 |
+
'frame' => 'application/vnd.framemaker',
|
279 |
+
'fsc' => 'application/vnd.fsc.weblaunch',
|
280 |
+
'fst' => 'image/vnd.fst',
|
281 |
+
'ftc' => 'application/vnd.fluxtime.clip',
|
282 |
+
'fti' => 'application/vnd.anser-web-funds-transfer-initiation',
|
283 |
+
'fvt' => 'video/vnd.fvt',
|
284 |
+
'fxp' => 'application/vnd.adobe.fxp',
|
285 |
+
'fxpl' => 'application/vnd.adobe.fxp',
|
286 |
+
'fzs' => 'application/vnd.fuzzysheet',
|
287 |
+
'g2w' => 'application/vnd.geoplan',
|
288 |
+
'g3' => 'image/g3fax',
|
289 |
+
'g3w' => 'application/vnd.geospace',
|
290 |
+
'gac' => 'application/vnd.groove-account',
|
291 |
+
'gdl' => 'model/vnd.gdl',
|
292 |
+
'geo' => 'application/vnd.dynageo',
|
293 |
+
'gex' => 'application/vnd.geometry-explorer',
|
294 |
+
'ggb' => 'application/vnd.geogebra.file',
|
295 |
+
'ggt' => 'application/vnd.geogebra.tool',
|
296 |
+
'ghf' => 'application/vnd.groove-help',
|
297 |
+
'gif' => 'image/gif',
|
298 |
+
'gim' => 'application/vnd.groove-identity-message',
|
299 |
+
'gmx' => 'application/vnd.gmx',
|
300 |
+
'gnumeric' => 'application/x-gnumeric',
|
301 |
+
'gph' => 'application/vnd.flographit',
|
302 |
+
'gqf' => 'application/vnd.grafeq',
|
303 |
+
'gqs' => 'application/vnd.grafeq',
|
304 |
+
'gram' => 'application/srgs',
|
305 |
+
'gre' => 'application/vnd.geometry-explorer',
|
306 |
+
'grv' => 'application/vnd.groove-injector',
|
307 |
+
'grxml' => 'application/srgs+xml',
|
308 |
+
'gsf' => 'application/x-font-ghostscript',
|
309 |
+
'gtar' => 'application/x-gtar',
|
310 |
+
'gtm' => 'application/vnd.groove-tool-message',
|
311 |
+
'gtw' => 'model/vnd.gtw',
|
312 |
+
'gv' => 'text/vnd.graphviz',
|
313 |
+
'gxt' => 'application/vnd.geonext',
|
314 |
+
'h' => 'text/x-c',
|
315 |
+
'h261' => 'video/h261',
|
316 |
+
'h263' => 'video/h263',
|
317 |
+
'h264' => 'video/h264',
|
318 |
+
'hal' => 'application/vnd.hal+xml',
|
319 |
+
'hbci' => 'application/vnd.hbci',
|
320 |
+
'hdf' => 'application/x-hdf',
|
321 |
+
'hh' => 'text/x-c',
|
322 |
+
'hlp' => 'application/winhlp',
|
323 |
+
'hpgl' => 'application/vnd.hp-hpgl',
|
324 |
+
'hpid' => 'application/vnd.hp-hpid',
|
325 |
+
'hps' => 'application/vnd.hp-hps',
|
326 |
+
'hqx' => 'application/mac-binhex40',
|
327 |
+
'hta' => 'application/octet-stream',
|
328 |
+
'htc' => 'text/html',
|
329 |
+
'htke' => 'application/vnd.kenameaapp',
|
330 |
+
'htm' => 'text/html',
|
331 |
+
'html' => 'text/html',
|
332 |
+
'hvd' => 'application/vnd.yamaha.hv-dic',
|
333 |
+
'hvp' => 'application/vnd.yamaha.hv-voice',
|
334 |
+
'hvs' => 'application/vnd.yamaha.hv-script',
|
335 |
+
'i2g' => 'application/vnd.intergeo',
|
336 |
+
'icc' => 'application/vnd.iccprofile',
|
337 |
+
'ice' => 'x-conference/x-cooltalk',
|
338 |
+
'icm' => 'application/vnd.iccprofile',
|
339 |
+
'ico' => 'image/x-icon',
|
340 |
+
'ics' => 'text/calendar',
|
341 |
+
'ief' => 'image/ief',
|
342 |
+
'ifb' => 'text/calendar',
|
343 |
+
'ifm' => 'application/vnd.shana.informed.formdata',
|
344 |
+
'iges' => 'model/iges',
|
345 |
+
'igl' => 'application/vnd.igloader',
|
346 |
+
'igm' => 'application/vnd.insors.igm',
|
347 |
+
'igs' => 'model/iges',
|
348 |
+
'igx' => 'application/vnd.micrografx.igx',
|
349 |
+
'iif' => 'application/vnd.shana.informed.interchange',
|
350 |
+
'imp' => 'application/vnd.accpac.simply.imp',
|
351 |
+
'ims' => 'application/vnd.ms-ims',
|
352 |
+
'in' => 'text/plain',
|
353 |
+
'ini' => 'text/plain',
|
354 |
+
'ipfix' => 'application/ipfix',
|
355 |
+
'ipk' => 'application/vnd.shana.informed.package',
|
356 |
+
'irm' => 'application/vnd.ibm.rights-management',
|
357 |
+
'irp' => 'application/vnd.irepository.package+xml',
|
358 |
+
'iso' => 'application/octet-stream',
|
359 |
+
'itp' => 'application/vnd.shana.informed.formtemplate',
|
360 |
+
'ivp' => 'application/vnd.immervision-ivp',
|
361 |
+
'ivu' => 'application/vnd.immervision-ivu',
|
362 |
+
'jad' => 'text/vnd.sun.j2me.app-descriptor',
|
363 |
+
'jam' => 'application/vnd.jam',
|
364 |
+
'jar' => 'application/java-archive',
|
365 |
+
'java' => 'text/x-java-source',
|
366 |
+
'jisp' => 'application/vnd.jisp',
|
367 |
+
'jlt' => 'application/vnd.hp-jlyt',
|
368 |
+
'jnlp' => 'application/x-java-jnlp-file',
|
369 |
+
'joda' => 'application/vnd.joost.joda-archive',
|
370 |
+
'jpe' => 'image/jpeg',
|
371 |
+
'jpeg' => 'image/jpeg',
|
372 |
+
'jpg' => 'image/jpeg',
|
373 |
+
'jpgm' => 'video/jpm',
|
374 |
+
'jpgv' => 'video/jpeg',
|
375 |
+
'jpm' => 'video/jpm',
|
376 |
+
'js' => 'text/javascript',
|
377 |
+
'json' => 'application/json',
|
378 |
+
'kar' => 'audio/midi',
|
379 |
+
'karbon' => 'application/vnd.kde.karbon',
|
380 |
+
'kfo' => 'application/vnd.kde.kformula',
|
381 |
+
'kia' => 'application/vnd.kidspiration',
|
382 |
+
'kml' => 'application/vnd.google-earth.kml+xml',
|
383 |
+
'kmz' => 'application/vnd.google-earth.kmz',
|
384 |
+
'kne' => 'application/vnd.kinar',
|
385 |
+
'knp' => 'application/vnd.kinar',
|
386 |
+
'kon' => 'application/vnd.kde.kontour',
|
387 |
+
'kpr' => 'application/vnd.kde.kpresenter',
|
388 |
+
'kpt' => 'application/vnd.kde.kpresenter',
|
389 |
+
'ksp' => 'application/vnd.kde.kspread',
|
390 |
+
'ktr' => 'application/vnd.kahootz',
|
391 |
+
'ktx' => 'image/ktx',
|
392 |
+
'ktz' => 'application/vnd.kahootz',
|
393 |
+
'kwd' => 'application/vnd.kde.kword',
|
394 |
+
'kwt' => 'application/vnd.kde.kword',
|
395 |
+
'lasxml' => 'application/vnd.las.las+xml',
|
396 |
+
'latex' => 'application/x-latex',
|
397 |
+
'lbd' => 'application/vnd.llamagraphics.life-balance.desktop',
|
398 |
+
'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml',
|
399 |
+
'les' => 'application/vnd.hhe.lesson-player',
|
400 |
+
'lha' => 'application/octet-stream',
|
401 |
+
'link66' => 'application/vnd.route66.link66+xml',
|
402 |
+
'list' => 'text/plain',
|
403 |
+
'list3820' => 'application/vnd.ibm.modcap',
|
404 |
+
'listafp' => 'application/vnd.ibm.modcap',
|
405 |
+
'log' => 'text/plain',
|
406 |
+
'lostxml' => 'application/lost+xml',
|
407 |
+
'lrf' => 'application/octet-stream',
|
408 |
+
'lrm' => 'application/vnd.ms-lrm',
|
409 |
+
'ltf' => 'application/vnd.frogans.ltf',
|
410 |
+
'lvp' => 'audio/vnd.lucent.voice',
|
411 |
+
'lwp' => 'application/vnd.lotus-wordpro',
|
412 |
+
'lzh' => 'application/octet-stream',
|
413 |
+
'm13' => 'application/x-msmediaview',
|
414 |
+
'm14' => 'application/x-msmediaview',
|
415 |
+
'm1v' => 'video/mpeg',
|
416 |
+
'm21' => 'application/mp21',
|
417 |
+
'm2a' => 'audio/mpeg',
|
418 |
+
'm2v' => 'video/mpeg',
|
419 |
+
'm3a' => 'audio/mpeg',
|
420 |
+
'm3u' => 'audio/x-mpegurl',
|
421 |
+
'm3u8' => 'application/vnd.apple.mpegurl',
|
422 |
+
'm4a' => 'audio/mp4',
|
423 |
+
'm4u' => 'video/vnd.mpegurl',
|
424 |
+
'm4v' => 'video/mp4',
|
425 |
+
'ma' => 'application/mathematica',
|
426 |
+
'mads' => 'application/mads+xml',
|
427 |
+
'mag' => 'application/vnd.ecowin.chart',
|
428 |
+
'maker' => 'application/vnd.framemaker',
|
429 |
+
'man' => 'text/troff',
|
430 |
+
'mathml' => 'application/mathml+xml',
|
431 |
+
'mb' => 'application/mathematica',
|
432 |
+
'mbk' => 'application/vnd.mobius.mbk',
|
433 |
+
'mbox' => 'application/mbox',
|
434 |
+
'mc1' => 'application/vnd.medcalcdata',
|
435 |
+
'mcd' => 'application/vnd.mcd',
|
436 |
+
'mcurl' => 'text/vnd.curl.mcurl',
|
437 |
+
'mdb' => 'application/x-msaccess',
|
438 |
+
'mdi' => 'image/vnd.ms-modi',
|
439 |
+
'me' => 'text/troff',
|
440 |
+
'mesh' => 'model/mesh',
|
441 |
+
'meta4' => 'application/metalink4+xml',
|
442 |
+
'mets' => 'application/mets+xml',
|
443 |
+
'mfm' => 'application/vnd.mfmp',
|
444 |
+
'mgp' => 'application/vnd.osgeo.mapguide.package',
|
445 |
+
'mgz' => 'application/vnd.proteus.magazine',
|
446 |
+
'mid' => 'audio/midi',
|
447 |
+
'midi' => 'audio/midi',
|
448 |
+
'mif' => 'application/vnd.mif',
|
449 |
+
'mime' => 'message/rfc822',
|
450 |
+
'mj2' => 'video/mj2',
|
451 |
+
'mjp2' => 'video/mj2',
|
452 |
+
'mlp' => 'application/vnd.dolby.mlp',
|
453 |
+
'mmd' => 'application/vnd.chipnuts.karaoke-mmd',
|
454 |
+
'mmf' => 'application/vnd.smaf',
|
455 |
+
'mmr' => 'image/vnd.fujixerox.edmics-mmr',
|
456 |
+
'mny' => 'application/x-msmoney',
|
457 |
+
'mobi' => 'application/x-mobipocket-ebook',
|
458 |
+
'mods' => 'application/mods+xml',
|
459 |
+
'mov' => 'video/quicktime',
|
460 |
+
'movie' => 'video/x-sgi-movie',
|
461 |
+
'mp2' => 'audio/mpeg',
|
462 |
+
'mp21' => 'application/mp21',
|
463 |
+
'mp2a' => 'audio/mpeg',
|
464 |
+
'mp3' => 'audio/mpeg',
|
465 |
+
'mp4' => 'video/mp4',
|
466 |
+
'mp4a' => 'audio/mp4',
|
467 |
+
'mp4s' => 'application/mp4',
|
468 |
+
'mp4v' => 'video/mp4',
|
469 |
+
'mpc' => 'application/vnd.mophun.certificate',
|
470 |
+
'mpe' => 'video/mpeg',
|
471 |
+
'mpeg' => 'video/mpeg',
|
472 |
+
'mpg' => 'video/mpeg',
|
473 |
+
'mpg4' => 'video/mp4',
|
474 |
+
'mpga' => 'audio/mpeg',
|
475 |
+
'mpkg' => 'application/vnd.apple.installer+xml',
|
476 |
+
'mpm' => 'application/vnd.blueice.multipass',
|
477 |
+
'mpn' => 'application/vnd.mophun.application',
|
478 |
+
'mpp' => 'application/vnd.ms-project',
|
479 |
+
'mpt' => 'application/vnd.ms-project',
|
480 |
+
'mpy' => 'application/vnd.ibm.minipay',
|
481 |
+
'mqy' => 'application/vnd.mobius.mqy',
|
482 |
+
'mrc' => 'application/marc',
|
483 |
+
'mrcx' => 'application/marcxml+xml',
|
484 |
+
'ms' => 'text/troff',
|
485 |
+
'mscml' => 'application/mediaservercontrol+xml',
|
486 |
+
'mseed' => 'application/vnd.fdsn.mseed',
|
487 |
+
'mseq' => 'application/vnd.mseq',
|
488 |
+
'msf' => 'application/vnd.epson.msf',
|
489 |
+
'msh' => 'model/mesh',
|
490 |
+
'msi' => 'application/x-msdownload',
|
491 |
+
'msl' => 'application/vnd.mobius.msl',
|
492 |
+
'msty' => 'application/vnd.muvee.style',
|
493 |
+
'mts' => 'model/vnd.mts',
|
494 |
+
'mus' => 'application/vnd.musician',
|
495 |
+
'musicxml' => 'application/vnd.recordare.musicxml+xml',
|
496 |
+
'mvb' => 'application/x-msmediaview',
|
497 |
+
'mwf' => 'application/vnd.mfer',
|
498 |
+
'mxf' => 'application/mxf',
|
499 |
+
'mxl' => 'application/vnd.recordare.musicxml',
|
500 |
+
'mxml' => 'application/xv+xml',
|
501 |
+
'mxs' => 'application/vnd.triscape.mxs',
|
502 |
+
'mxu' => 'video/vnd.mpegurl',
|
503 |
+
'n-gage' => 'application/vnd.nokia.n-gage.symbian.install',
|
504 |
+
'n3' => 'text/n3',
|
505 |
+
'nb' => 'application/mathematica',
|
506 |
+
'nbp' => 'application/vnd.wolfram.player',
|
507 |
+
'nc' => 'application/x-netcdf',
|
508 |
+
'ncx' => 'application/x-dtbncx+xml',
|
509 |
+
'ngdat' => 'application/vnd.nokia.n-gage.data',
|
510 |
+
'nlu' => 'application/vnd.neurolanguage.nlu',
|
511 |
+
'nml' => 'application/vnd.enliven',
|
512 |
+
'nnd' => 'application/vnd.noblenet-directory',
|
513 |
+
'nns' => 'application/vnd.noblenet-sealer',
|
514 |
+
'nnw' => 'application/vnd.noblenet-web',
|
515 |
+
'npx' => 'image/vnd.net-fpx',
|
516 |
+
'nsf' => 'application/vnd.lotus-notes',
|
517 |
+
'oa2' => 'application/vnd.fujitsu.oasys2',
|
518 |
+
'oa3' => 'application/vnd.fujitsu.oasys3',
|
519 |
+
'oas' => 'application/vnd.fujitsu.oasys',
|
520 |
+
'obd' => 'application/x-msbinder',
|
521 |
+
'oda' => 'application/oda',
|
522 |
+
'odb' => 'application/vnd.oasis.opendocument.database',
|
523 |
+
'odc' => 'application/vnd.oasis.opendocument.chart',
|
524 |
+
'odf' => 'application/vnd.oasis.opendocument.formula',
|
525 |
+
'odft' => 'application/vnd.oasis.opendocument.formula-template',
|
526 |
+
'odg' => 'application/vnd.oasis.opendocument.graphics',
|
527 |
+
'odi' => 'application/vnd.oasis.opendocument.image',
|
528 |
+
'odm' => 'application/vnd.oasis.opendocument.text-master',
|
529 |
+
'odp' => 'application/vnd.oasis.opendocument.presentation',
|
530 |
+
'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
|
531 |
+
'odt' => 'application/vnd.oasis.opendocument.text',
|
532 |
+
'oga' => 'audio/ogg',
|
533 |
+
'ogg' => 'audio/ogg',
|
534 |
+
'ogv' => 'video/ogg',
|
535 |
+
'ogx' => 'application/ogg',
|
536 |
+
'onepkg' => 'application/onenote',
|
537 |
+
'onetmp' => 'application/onenote',
|
538 |
+
'onetoc' => 'application/onenote',
|
539 |
+
'onetoc2' => 'application/onenote',
|
540 |
+
'opf' => 'application/oebps-package+xml',
|
541 |
+
'oprc' => 'application/vnd.palm',
|
542 |
+
'org' => 'application/vnd.lotus-organizer',
|
543 |
+
'osf' => 'application/vnd.yamaha.openscoreformat',
|
544 |
+
'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml',
|
545 |
+
'otc' => 'application/vnd.oasis.opendocument.chart-template',
|
546 |
+
'otf' => 'application/x-font-otf',
|
547 |
+
'otg' => 'application/vnd.oasis.opendocument.graphics-template',
|
548 |
+
'oth' => 'application/vnd.oasis.opendocument.text-web',
|
549 |
+
'oti' => 'application/vnd.oasis.opendocument.image-template',
|
550 |
+
'otp' => 'application/vnd.oasis.opendocument.presentation-template',
|
551 |
+
'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template',
|
552 |
+
'ott' => 'application/vnd.oasis.opendocument.text-template',
|
553 |
+
'oxt' => 'application/vnd.openofficeorg.extension',
|
554 |
+
'p' => 'text/x-pascal',
|
555 |
+
'p10' => 'application/pkcs10',
|
556 |
+
'p12' => 'application/x-pkcs12',
|
557 |
+
'p7b' => 'application/x-pkcs7-certificates',
|
558 |
+
'p7c' => 'application/pkcs7-mime',
|
559 |
+
'p7m' => 'application/pkcs7-mime',
|
560 |
+
'p7r' => 'application/x-pkcs7-certreqresp',
|
561 |
+
'p7s' => 'application/pkcs7-signature',
|
562 |
+
'p8' => 'application/pkcs8',
|
563 |
+
'pas' => 'text/x-pascal',
|
564 |
+
'paw' => 'application/vnd.pawaafile',
|
565 |
+
'pbd' => 'application/vnd.powerbuilder6',
|
566 |
+
'pbm' => 'image/x-portable-bitmap',
|
567 |
+
'pcf' => 'application/x-font-pcf',
|
568 |
+
'pcl' => 'application/vnd.hp-pcl',
|
569 |
+
'pclxl' => 'application/vnd.hp-pclxl',
|
570 |
+
'pct' => 'image/x-pict',
|
571 |
+
'pcurl' => 'application/vnd.curl.pcurl',
|
572 |
+
'pcx' => 'image/x-pcx',
|
573 |
+
'pdb' => 'application/vnd.palm',
|
574 |
+
'pdf' => 'application/pdf',
|
575 |
+
'pfa' => 'application/x-font-type1',
|
576 |
+
'pfb' => 'application/x-font-type1',
|
577 |
+
'pfm' => 'application/x-font-type1',
|
578 |
+
'pfr' => 'application/font-tdpfr',
|
579 |
+
'pfx' => 'application/x-pkcs12',
|
580 |
+
'pgm' => 'image/x-portable-graymap',
|
581 |
+
'pgn' => 'application/x-chess-pgn',
|
582 |
+
'pgp' => 'application/pgp-encrypted',
|
583 |
+
'php' => 'text/x-php',
|
584 |
+
'phps' => 'application/x-httpd-phps',
|
585 |
+
'pic' => 'image/x-pict',
|
586 |
+
'pkg' => 'application/octet-stream',
|
587 |
+
'pki' => 'application/pkixcmp',
|
588 |
+
'pkipath' => 'application/pkix-pkipath',
|
589 |
+
'plb' => 'application/vnd.3gpp.pic-bw-large',
|
590 |
+
'plc' => 'application/vnd.mobius.plc',
|
591 |
+
'plf' => 'application/vnd.pocketlearn',
|
592 |
+
'pls' => 'application/pls+xml',
|
593 |
+
'pml' => 'application/vnd.ctc-posml',
|
594 |
+
'png' => 'image/png',
|
595 |
+
'pnm' => 'image/x-portable-anymap',
|
596 |
+
'portpkg' => 'application/vnd.macports.portpkg',
|
597 |
+
'pot' => 'application/vnd.ms-powerpoint',
|
598 |
+
'potm' => 'application/vnd.ms-powerpoint.template.macroenabled.12',
|
599 |
+
'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template',
|
600 |
+
'ppam' => 'application/vnd.ms-powerpoint.addin.macroenabled.12',
|
601 |
+
'ppd' => 'application/vnd.cups-ppd',
|
602 |
+
'ppm' => 'image/x-portable-pixmap',
|
603 |
+
'pps' => 'application/vnd.ms-powerpoint',
|
604 |
+
'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroenabled.12',
|
605 |
+
'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
|
606 |
+
'ppt' => 'application/vnd.ms-powerpoint',
|
607 |
+
'pptm' => 'application/vnd.ms-powerpoint.presentation.macroenabled.12',
|
608 |
+
'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
|
609 |
+
'pqa' => 'application/vnd.palm',
|
610 |
+
'prc' => 'application/x-mobipocket-ebook',
|
611 |
+
'pre' => 'application/vnd.lotus-freelance',
|
612 |
+
'prf' => 'application/pics-rules',
|
613 |
+
'ps' => 'application/postscript',
|
614 |
+
'psb' => 'application/vnd.3gpp.pic-bw-small',
|
615 |
+
'psd' => 'image/vnd.adobe.photoshop',
|
616 |
+
'psf' => 'application/x-font-linux-psf',
|
617 |
+
'pskcxml' => 'application/pskc+xml',
|
618 |
+
'ptid' => 'application/vnd.pvi.ptid1',
|
619 |
+
'pub' => 'application/x-mspublisher',
|
620 |
+
'pvb' => 'application/vnd.3gpp.pic-bw-var',
|
621 |
+
'pwn' => 'application/vnd.3m.post-it-notes',
|
622 |
+
'pya' => 'audio/vnd.ms-playready.media.pya',
|
623 |
+
'pyv' => 'video/vnd.ms-playready.media.pyv',
|
624 |
+
'qam' => 'application/vnd.epson.quickanime',
|
625 |
+
'qbo' => 'application/vnd.intu.qbo',
|
626 |
+
'qfx' => 'application/vnd.intu.qfx',
|
627 |
+
'qps' => 'application/vnd.publishare-delta-tree',
|
628 |
+
'qt' => 'video/quicktime',
|
629 |
+
'qwd' => 'application/vnd.quark.quarkxpress',
|
630 |
+
'qwt' => 'application/vnd.quark.quarkxpress',
|
631 |
+
'qxb' => 'application/vnd.quark.quarkxpress',
|
632 |
+
'qxd' => 'application/vnd.quark.quarkxpress',
|
633 |
+
'qxl' => 'application/vnd.quark.quarkxpress',
|
634 |
+
'qxt' => 'application/vnd.quark.quarkxpress',
|
635 |
+
'ra' => 'audio/x-pn-realaudio',
|
636 |
+
'ram' => 'audio/x-pn-realaudio',
|
637 |
+
'rar' => 'application/x-rar-compressed',
|
638 |
+
'ras' => 'image/x-cmu-raster',
|
639 |
+
'rb' => 'text/plain',
|
640 |
+
'rcprofile' => 'application/vnd.ipunplugged.rcprofile',
|
641 |
+
'rdf' => 'application/rdf+xml',
|
642 |
+
'rdz' => 'application/vnd.data-vision.rdz',
|
643 |
+
'rep' => 'application/vnd.businessobjects',
|
644 |
+
'res' => 'application/x-dtbresource+xml',
|
645 |
+
'resx' => 'text/xml',
|
646 |
+
'rgb' => 'image/x-rgb',
|
647 |
+
'rif' => 'application/reginfo+xml',
|
648 |
+
'rip' => 'audio/vnd.rip',
|
649 |
+
'rl' => 'application/resource-lists+xml',
|
650 |
+
'rlc' => 'image/vnd.fujixerox.edmics-rlc',
|
651 |
+
'rld' => 'application/resource-lists-diff+xml',
|
652 |
+
'rm' => 'application/vnd.rn-realmedia',
|
653 |
+
'rmi' => 'audio/midi',
|
654 |
+
'rmp' => 'audio/x-pn-realaudio-plugin',
|
655 |
+
'rms' => 'application/vnd.jcp.javame.midlet-rms',
|
656 |
+
'rnc' => 'application/relax-ng-compact-syntax',
|
657 |
+
'roff' => 'text/troff',
|
658 |
+
'rp9' => 'application/vnd.cloanto.rp9',
|
659 |
+
'rpss' => 'application/vnd.nokia.radio-presets',
|
660 |
+
'rpst' => 'application/vnd.nokia.radio-preset',
|
661 |
+
'rq' => 'application/sparql-query',
|
662 |
+
'rs' => 'application/rls-services+xml',
|
663 |
+
'rsd' => 'application/rsd+xml',
|
664 |
+
'rss' => 'application/rss+xml',
|
665 |
+
'rtf' => 'application/rtf',
|
666 |
+
'rtx' => 'text/richtext',
|
667 |
+
's' => 'text/x-asm',
|
668 |
+
'saf' => 'application/vnd.yamaha.smaf-audio',
|
669 |
+
'sbml' => 'application/sbml+xml',
|
670 |
+
'sc' => 'application/vnd.ibm.secure-container',
|
671 |
+
'scd' => 'application/x-msschedule',
|
672 |
+
'scm' => 'application/vnd.lotus-screencam',
|
673 |
+
'scq' => 'application/scvp-cv-request',
|
674 |
+
'scs' => 'application/scvp-cv-response',
|
675 |
+
'scurl' => 'text/vnd.curl.scurl',
|
676 |
+
'sda' => 'application/vnd.stardivision.draw',
|
677 |
+
'sdc' => 'application/vnd.stardivision.calc',
|
678 |
+
'sdd' => 'application/vnd.stardivision.impress',
|
679 |
+
'sdkd' => 'application/vnd.solent.sdkm+xml',
|
680 |
+
'sdkm' => 'application/vnd.solent.sdkm+xml',
|
681 |
+
'sdp' => 'application/sdp',
|
682 |
+
'sdw' => 'application/vnd.stardivision.writer',
|
683 |
+
'see' => 'application/vnd.seemail',
|
684 |
+
'seed' => 'application/vnd.fdsn.seed',
|
685 |
+
'sema' => 'application/vnd.sema',
|
686 |
+
'semd' => 'application/vnd.semd',
|
687 |
+
'semf' => 'application/vnd.semf',
|
688 |
+
'ser' => 'application/java-serialized-object',
|
689 |
+
'setpay' => 'application/set-payment-initiation',
|
690 |
+
'setreg' => 'application/set-registration-initiation',
|
691 |
+
'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data',
|
692 |
+
'sfs' => 'application/vnd.spotfire.sfs',
|
693 |
+
'sgl' => 'application/vnd.stardivision.writer-global',
|
694 |
+
'sgm' => 'text/sgml',
|
695 |
+
'sgml' => 'text/sgml',
|
696 |
+
'sh' => 'application/x-sh',
|
697 |
+
'shar' => 'application/x-shar',
|
698 |
+
'shf' => 'application/shf+xml',
|
699 |
+
'sig' => 'application/pgp-signature',
|
700 |
+
'silo' => 'model/mesh',
|
701 |
+
'sis' => 'application/vnd.symbian.install',
|
702 |
+
'sisx' => 'application/vnd.symbian.install',
|
703 |
+
'sit' => 'application/x-stuffit',
|
704 |
+
'sitx' => 'application/x-stuffitx',
|
705 |
+
'skd' => 'application/vnd.koan',
|
706 |
+
'skm' => 'application/vnd.koan',
|
707 |
+
'skp' => 'application/vnd.koan',
|
708 |
+
'skt' => 'application/vnd.koan',
|
709 |
+
'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12',
|
710 |
+
'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
|
711 |
+
'slt' => 'application/vnd.epson.salt',
|
712 |
+
'sm' => 'application/vnd.stepmania.stepchart',
|
713 |
+
'smf' => 'application/vnd.stardivision.math',
|
714 |
+
'smi' => 'application/smil+xml',
|
715 |
+
'smil' => 'application/smil+xml',
|
716 |
+
'snd' => 'audio/basic',
|
717 |
+
'snf' => 'application/x-font-snf',
|
718 |
+
'so' => 'application/octet-stream',
|
719 |
+
'spc' => 'application/x-pkcs7-certificates',
|
720 |
+
'spf' => 'application/vnd.yamaha.smaf-phrase',
|
721 |
+
'spl' => 'application/x-futuresplash',
|
722 |
+
'spot' => 'text/vnd.in3d.spot',
|
723 |
+
'spp' => 'application/scvp-vp-response',
|
724 |
+
'spq' => 'application/scvp-vp-request',
|
725 |
+
'spx' => 'audio/ogg',
|
726 |
+
'src' => 'application/x-wais-source',
|
727 |
+
'srt' => 'application/octet-stream',
|
728 |
+
'sru' => 'application/sru+xml',
|
729 |
+
'srx' => 'application/sparql-results+xml',
|
730 |
+
'sse' => 'application/vnd.kodak-descriptor',
|
731 |
+
'ssf' => 'application/vnd.epson.ssf',
|
732 |
+
'ssml' => 'application/ssml+xml',
|
733 |
+
'st' => 'application/vnd.sailingtracker.track',
|
734 |
+
'stc' => 'application/vnd.sun.xml.calc.template',
|
735 |
+
'std' => 'application/vnd.sun.xml.draw.template',
|
736 |
+
'stf' => 'application/vnd.wt.stf',
|
737 |
+
'sti' => 'application/vnd.sun.xml.impress.template',
|
738 |
+
'stk' => 'application/hyperstudio',
|
739 |
+
'stl' => 'application/vnd.ms-pki.stl',
|
740 |
+
'str' => 'application/vnd.pg.format',
|
741 |
+
'stw' => 'application/vnd.sun.xml.writer.template',
|
742 |
+
'sub' => 'image/vnd.dvb.subtitle',
|
743 |
+
'sus' => 'application/vnd.sus-calendar',
|
744 |
+
'susp' => 'application/vnd.sus-calendar',
|
745 |
+
'sv4cpio' => 'application/x-sv4cpio',
|
746 |
+
'sv4crc' => 'application/x-sv4crc',
|
747 |
+
'svc' => 'application/vnd.dvb.service',
|
748 |
+
'svd' => 'application/vnd.svd',
|
749 |
+
'svg' => 'image/svg+xml',
|
750 |
+
'svgz' => 'image/svg+xml',
|
751 |
+
'swa' => 'application/x-director',
|
752 |
+
'swf' => 'application/x-shockwave-flash',
|
753 |
+
'swi' => 'application/vnd.aristanetworks.swi',
|
754 |
+
'sxc' => 'application/vnd.sun.xml.calc',
|
755 |
+
'sxd' => 'application/vnd.sun.xml.draw',
|
756 |
+
'sxg' => 'application/vnd.sun.xml.writer.global',
|
757 |
+
'sxi' => 'application/vnd.sun.xml.impress',
|
758 |
+
'sxm' => 'application/vnd.sun.xml.math',
|
759 |
+
'sxw' => 'application/vnd.sun.xml.writer',
|
760 |
+
't' => 'text/troff',
|
761 |
+
'tao' => 'application/vnd.tao.intent-module-archive',
|
762 |
+
'tar' => 'application/x-tar',
|
763 |
+
'tcap' => 'application/vnd.3gpp2.tcap',
|
764 |
+
'tcl' => 'application/x-tcl',
|
765 |
+
'teacher' => 'application/vnd.smart.teacher',
|
766 |
+
'tei' => 'application/tei+xml',
|
767 |
+
'teicorpus' => 'application/tei+xml',
|
768 |
+
'tex' => 'application/x-tex',
|
769 |
+
'texi' => 'application/x-texinfo',
|
770 |
+
'texinfo' => 'application/x-texinfo',
|
771 |
+
'text' => 'text/plain',
|
772 |
+
'tfi' => 'application/thraud+xml',
|
773 |
+
'tfm' => 'application/x-tex-tfm',
|
774 |
+
'thmx' => 'application/vnd.ms-officetheme',
|
775 |
+
'tif' => 'image/tiff',
|
776 |
+
'tiff' => 'image/tiff',
|
777 |
+
'tmo' => 'application/vnd.tmobile-livetv',
|
778 |
+
'torrent' => 'application/x-bittorrent',
|
779 |
+
'tpl' => 'application/vnd.groove-tool-template',
|
780 |
+
'tpt' => 'application/vnd.trid.tpt',
|
781 |
+
'tr' => 'text/troff',
|
782 |
+
'tra' => 'application/vnd.trueapp',
|
783 |
+
'trm' => 'application/x-msterminal',
|
784 |
+
'tsd' => 'application/timestamped-data',
|
785 |
+
'tsv' => 'text/tab-separated-values',
|
786 |
+
'ttc' => 'application/x-font-ttf',
|
787 |
+
'ttf' => 'application/x-font-ttf',
|
788 |
+
'ttl' => 'text/turtle',
|
789 |
+
'twd' => 'application/vnd.simtech-mindmapper',
|
790 |
+
'twds' => 'application/vnd.simtech-mindmapper',
|
791 |
+
'txd' => 'application/vnd.genomatix.tuxedo',
|
792 |
+
'txf' => 'application/vnd.mobius.txf',
|
793 |
+
'txt' => 'text/plain',
|
794 |
+
'u32' => 'application/x-authorware-bin',
|
795 |
+
'udeb' => 'application/x-debian-package',
|
796 |
+
'ufd' => 'application/vnd.ufdl',
|
797 |
+
'ufdl' => 'application/vnd.ufdl',
|
798 |
+
'umj' => 'application/vnd.umajin',
|
799 |
+
'unityweb' => 'application/vnd.unity',
|
800 |
+
'uoml' => 'application/vnd.uoml+xml',
|
801 |
+
'uri' => 'text/uri-list',
|
802 |
+
'uris' => 'text/uri-list',
|
803 |
+
'urls' => 'text/uri-list',
|
804 |
+
'ustar' => 'application/x-ustar',
|
805 |
+
'utz' => 'application/vnd.uiq.theme',
|
806 |
+
'uu' => 'text/x-uuencode',
|
807 |
+
'uva' => 'audio/vnd.dece.audio',
|
808 |
+
'uvd' => 'application/vnd.dece.data',
|
809 |
+
'uvf' => 'application/vnd.dece.data',
|
810 |
+
'uvg' => 'image/vnd.dece.graphic',
|
811 |
+
'uvh' => 'video/vnd.dece.hd',
|
812 |
+
'uvi' => 'image/vnd.dece.graphic',
|
813 |
+
'uvm' => 'video/vnd.dece.mobile',
|
814 |
+
'uvp' => 'video/vnd.dece.pd',
|
815 |
+
'uvs' => 'video/vnd.dece.sd',
|
816 |
+
'uvt' => 'application/vnd.dece.ttml+xml',
|
817 |
+
'uvu' => 'video/vnd.uvvu.mp4',
|
818 |
+
'uvv' => 'video/vnd.dece.video',
|
819 |
+
'uvva' => 'audio/vnd.dece.audio',
|
820 |
+
'uvvd' => 'application/vnd.dece.data',
|
821 |
+
'uvvf' => 'application/vnd.dece.data',
|
822 |
+
'uvvg' => 'image/vnd.dece.graphic',
|
823 |
+
'uvvh' => 'video/vnd.dece.hd',
|
824 |
+
'uvvi' => 'image/vnd.dece.graphic',
|
825 |
+
'uvvm' => 'video/vnd.dece.mobile',
|
826 |
+
'uvvp' => 'video/vnd.dece.pd',
|
827 |
+
'uvvs' => 'video/vnd.dece.sd',
|
828 |
+
'uvvt' => 'application/vnd.dece.ttml+xml',
|
829 |
+
'uvvu' => 'video/vnd.uvvu.mp4',
|
830 |
+
'uvvv' => 'video/vnd.dece.video',
|
831 |
+
'uvvx' => 'application/vnd.dece.unspecified',
|
832 |
+
'uvx' => 'application/vnd.dece.unspecified',
|
833 |
+
'vcd' => 'application/x-cdlink',
|
834 |
+
'vcf' => 'text/x-vcard',
|
835 |
+
'vcg' => 'application/vnd.groove-vcard',
|
836 |
+
'vcs' => 'text/x-vcalendar',
|
837 |
+
'vcx' => 'application/vnd.vcx',
|
838 |
+
'vis' => 'application/vnd.visionary',
|
839 |
+
'viv' => 'video/vnd.vivo',
|
840 |
+
'vor' => 'application/vnd.stardivision.writer',
|
841 |
+
'vox' => 'application/x-authorware-bin',
|
842 |
+
'vrml' => 'model/vrml',
|
843 |
+
'vsd' => 'application/vnd.visio',
|
844 |
+
'vsf' => 'application/vnd.vsf',
|
845 |
+
'vss' => 'application/vnd.visio',
|
846 |
+
'vst' => 'application/vnd.visio',
|
847 |
+
'vsw' => 'application/vnd.visio',
|
848 |
+
'vtu' => 'model/vnd.vtu',
|
849 |
+
'vxml' => 'application/voicexml+xml',
|
850 |
+
'w3d' => 'application/x-director',
|
851 |
+
'wad' => 'application/x-doom',
|
852 |
+
'wav' => 'audio/x-wav',
|
853 |
+
'wax' => 'audio/x-ms-wax',
|
854 |
+
'wbmp' => 'image/vnd.wap.wbmp',
|
855 |
+
'wbs' => 'application/vnd.criticaltools.wbs+xml',
|
856 |
+
'wbxml' => 'application/vnd.wap.wbxml',
|
857 |
+
'wcm' => 'application/vnd.ms-works',
|
858 |
+
'wdb' => 'application/vnd.ms-works',
|
859 |
+
'weba' => 'audio/webm',
|
860 |
+
'webm' => 'video/webm',
|
861 |
+
'webp' => 'image/webp',
|
862 |
+
'wg' => 'application/vnd.pmi.widget',
|
863 |
+
'wgt' => 'application/widget',
|
864 |
+
'wks' => 'application/vnd.ms-works',
|
865 |
+
'wm' => 'video/x-ms-wm',
|
866 |
+
'wma' => 'audio/x-ms-wma',
|
867 |
+
'wmd' => 'application/x-ms-wmd',
|
868 |
+
'wmf' => 'application/x-msmetafile',
|
869 |
+
'wml' => 'text/vnd.wap.wml',
|
870 |
+
'wmlc' => 'application/vnd.wap.wmlc',
|
871 |
+
'wmls' => 'text/vnd.wap.wmlscript',
|
872 |
+
'wmlsc' => 'application/vnd.wap.wmlscriptc',
|
873 |
+
'wmv' => 'video/x-ms-wmv',
|
874 |
+
'wmx' => 'video/x-ms-wmx',
|
875 |
+
'wmz' => 'application/x-ms-wmz',
|
876 |
+
'woff' => 'application/x-font-woff',
|
877 |
+
'wpd' => 'application/vnd.wordperfect',
|
878 |
+
'wpl' => 'application/vnd.ms-wpl',
|
879 |
+
'wps' => 'application/vnd.ms-works',
|
880 |
+
'wqd' => 'application/vnd.wqd',
|
881 |
+
'wri' => 'application/x-mswrite',
|
882 |
+
'wrl' => 'model/vrml',
|
883 |
+
'wsdl' => 'application/wsdl+xml',
|
884 |
+
'wspolicy' => 'application/wspolicy+xml',
|
885 |
+
'wtb' => 'application/vnd.webturbo',
|
886 |
+
'wvx' => 'video/x-ms-wvx',
|
887 |
+
'x32' => 'application/x-authorware-bin',
|
888 |
+
'x3d' => 'application/vnd.hzn-3d-crossword',
|
889 |
+
'xap' => 'application/x-silverlight-app',
|
890 |
+
'xar' => 'application/vnd.xara',
|
891 |
+
'xbap' => 'application/x-ms-xbap',
|
892 |
+
'xbd' => 'application/vnd.fujixerox.docuworks.binder',
|
893 |
+
'xbm' => 'image/x-xbitmap',
|
894 |
+
'xdf' => 'application/xcap-diff+xml',
|
895 |
+
'xdm' => 'application/vnd.syncml.dm+xml',
|
896 |
+
'xdp' => 'application/vnd.adobe.xdp+xml',
|
897 |
+
'xdssc' => 'application/dssc+xml',
|
898 |
+
'xdw' => 'application/vnd.fujixerox.docuworks',
|
899 |
+
'xenc' => 'application/xenc+xml',
|
900 |
+
'xer' => 'application/patch-ops-error+xml',
|
901 |
+
'xfdf' => 'application/vnd.adobe.xfdf',
|
902 |
+
'xfdl' => 'application/vnd.xfdl',
|
903 |
+
'xht' => 'application/xhtml+xml',
|
904 |
+
'xhtml' => 'application/xhtml+xml',
|
905 |
+
'xhvml' => 'application/xv+xml',
|
906 |
+
'xif' => 'image/vnd.xiff',
|
907 |
+
'xla' => 'application/vnd.ms-excel',
|
908 |
+
'xlam' => 'application/vnd.ms-excel.addin.macroenabled.12',
|
909 |
+
'xlc' => 'application/vnd.ms-excel',
|
910 |
+
'xlm' => 'application/vnd.ms-excel',
|
911 |
+
'xls' => 'application/vnd.ms-excel',
|
912 |
+
'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroenabled.12',
|
913 |
+
'xlsm' => 'application/vnd.ms-excel.sheet.macroenabled.12',
|
914 |
+
'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
915 |
+
'xlt' => 'application/vnd.ms-excel',
|
916 |
+
'xltm' => 'application/vnd.ms-excel.template.macroenabled.12',
|
917 |
+
'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
|
918 |
+
'xlw' => 'application/vnd.ms-excel',
|
919 |
+
'xml' => 'application/xml',
|
920 |
+
'xo' => 'application/vnd.olpc-sugar',
|
921 |
+
'xop' => 'application/xop+xml',
|
922 |
+
'xpi' => 'application/x-xpinstall',
|
923 |
+
'xpm' => 'image/x-xpixmap',
|
924 |
+
'xpr' => 'application/vnd.is-xpr',
|
925 |
+
'xps' => 'application/vnd.ms-xpsdocument',
|
926 |
+
'xpw' => 'application/vnd.intercon.formnet',
|
927 |
+
'xpx' => 'application/vnd.intercon.formnet',
|
928 |
+
'xsl' => 'application/xml',
|
929 |
+
'xslt' => 'application/xslt+xml',
|
930 |
+
'xsm' => 'application/vnd.syncml+xml',
|
931 |
+
'xspf' => 'application/xspf+xml',
|
932 |
+
'xul' => 'application/vnd.mozilla.xul+xml',
|
933 |
+
'xvm' => 'application/xv+xml',
|
934 |
+
'xvml' => 'application/xv+xml',
|
935 |
+
'xwd' => 'image/x-xwindowdump',
|
936 |
+
'xyz' => 'chemical/x-xyz',
|
937 |
+
'yaml' => 'text/yaml',
|
938 |
+
'yang' => 'application/yang',
|
939 |
+
'yin' => 'application/yin+xml',
|
940 |
+
'yml' => 'text/yaml',
|
941 |
+
'zaz' => 'application/vnd.zzazz.deck+xml',
|
942 |
+
'zip' => 'application/zip',
|
943 |
+
'zir' => 'application/vnd.zul',
|
944 |
+
'zirz' => 'application/vnd.zul',
|
945 |
+
'zmm' => 'application/vnd.handheld-entertainment+xml'
|
946 |
+
];
|
947 |
+
|
948 |
+
/**
|
949 |
+
* Get a singleton instance of the class
|
950 |
+
*
|
951 |
+
* @return self
|
952 |
+
* @codeCoverageIgnore
|
953 |
+
*/
|
954 |
+
public static function getInstance()
|
955 |
+
{
|
956 |
+
if (!self::$instance) {
|
957 |
+
self::$instance = new self();
|
958 |
+
}
|
959 |
+
|
960 |
+
return self::$instance;
|
961 |
+
}
|
962 |
+
|
963 |
+
/**
|
964 |
+
* Get a mimetype value from a file extension
|
965 |
+
*
|
966 |
+
* @param string $extension File extension
|
967 |
+
*
|
968 |
+
* @return string|null
|
969 |
+
*/
|
970 |
+
public function fromExtension($extension)
|
971 |
+
{
|
972 |
+
$extension = strtolower($extension);
|
973 |
+
|
974 |
+
return isset($this->mimetypes[$extension]) ? $this->mimetypes[$extension] : null;
|
975 |
+
}
|
976 |
+
|
977 |
+
/**
|
978 |
+
* Get a mimetype from a filename
|
979 |
+
*
|
980 |
+
* @param string $filename Filename to generate a mimetype from
|
981 |
+
*
|
982 |
+
* @return string|null
|
983 |
+
*/
|
984 |
+
public function fromFilename($filename)
|
985 |
+
{
|
986 |
+
return $this->fromExtension(pathinfo($filename, PATHINFO_EXTENSION));
|
987 |
+
}
|
988 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/Birthday.php
ADDED
@@ -0,0 +1,85 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\GraphNodes;
|
25 |
+
|
26 |
+
use DateTime;
|
27 |
+
|
28 |
+
/**
|
29 |
+
* Birthday object to handle various Graph return formats
|
30 |
+
*
|
31 |
+
* @package Facebook
|
32 |
+
*/
|
33 |
+
class Birthday extends DateTime
|
34 |
+
{
|
35 |
+
/**
|
36 |
+
* @var bool
|
37 |
+
*/
|
38 |
+
private $hasDate = false;
|
39 |
+
|
40 |
+
/**
|
41 |
+
* @var bool
|
42 |
+
*/
|
43 |
+
private $hasYear = false;
|
44 |
+
|
45 |
+
/**
|
46 |
+
* Parses Graph birthday format to set indication flags, possible values:
|
47 |
+
*
|
48 |
+
* MM/DD/YYYY
|
49 |
+
* MM/DD
|
50 |
+
* YYYY
|
51 |
+
*
|
52 |
+
* @link https://developers.facebook.com/docs/graph-api/reference/user
|
53 |
+
*
|
54 |
+
* @param string $date
|
55 |
+
*/
|
56 |
+
public function __construct($date)
|
57 |
+
{
|
58 |
+
$parts = explode('/', $date);
|
59 |
+
|
60 |
+
$this->hasYear = count($parts) === 3 || count($parts) === 1;
|
61 |
+
$this->hasDate = count($parts) === 3 || count($parts) === 2;
|
62 |
+
|
63 |
+
parent::__construct($date);
|
64 |
+
}
|
65 |
+
|
66 |
+
/**
|
67 |
+
* Returns whether date object contains birth day and month
|
68 |
+
*
|
69 |
+
* @return bool
|
70 |
+
*/
|
71 |
+
public function hasDate()
|
72 |
+
{
|
73 |
+
return $this->hasDate;
|
74 |
+
}
|
75 |
+
|
76 |
+
/**
|
77 |
+
* Returns whether date object contains birth year
|
78 |
+
*
|
79 |
+
* @return bool
|
80 |
+
*/
|
81 |
+
public function hasYear()
|
82 |
+
{
|
83 |
+
return $this->hasYear;
|
84 |
+
}
|
85 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/Collection.php
ADDED
@@ -0,0 +1,242 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\GraphNodes;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class Collection
|
28 |
+
*
|
29 |
+
* Modified version of Collection in "illuminate/support" by Taylor Otwell
|
30 |
+
*
|
31 |
+
* @package Facebook
|
32 |
+
*/
|
33 |
+
|
34 |
+
use ArrayAccess;
|
35 |
+
use ArrayIterator;
|
36 |
+
use Countable;
|
37 |
+
use IteratorAggregate;
|
38 |
+
|
39 |
+
class Collection implements ArrayAccess, Countable, IteratorAggregate
|
40 |
+
{
|
41 |
+
/**
|
42 |
+
* The items contained in the collection.
|
43 |
+
*
|
44 |
+
* @var array
|
45 |
+
*/
|
46 |
+
protected $items = [];
|
47 |
+
|
48 |
+
/**
|
49 |
+
* Create a new collection.
|
50 |
+
*
|
51 |
+
* @param array $items
|
52 |
+
*/
|
53 |
+
public function __construct(array $items = [])
|
54 |
+
{
|
55 |
+
$this->items = $items;
|
56 |
+
}
|
57 |
+
|
58 |
+
/**
|
59 |
+
* Gets the value of a field from the Graph node.
|
60 |
+
*
|
61 |
+
* @param string $name The field to retrieve.
|
62 |
+
* @param mixed $default The default to return if the field doesn't exist.
|
63 |
+
*
|
64 |
+
* @return mixed
|
65 |
+
*/
|
66 |
+
public function getField($name, $default = null)
|
67 |
+
{
|
68 |
+
if (isset($this->items[$name])) {
|
69 |
+
return $this->items[$name];
|
70 |
+
}
|
71 |
+
|
72 |
+
return $default;
|
73 |
+
}
|
74 |
+
|
75 |
+
/**
|
76 |
+
* Gets the value of the named property for this graph object.
|
77 |
+
*
|
78 |
+
* @param string $name The property to retrieve.
|
79 |
+
* @param mixed $default The default to return if the property doesn't exist.
|
80 |
+
*
|
81 |
+
* @return mixed
|
82 |
+
*
|
83 |
+
* @deprecated 5.0.0 getProperty() has been renamed to getField()
|
84 |
+
* @todo v6: Remove this method
|
85 |
+
*/
|
86 |
+
public function getProperty($name, $default = null)
|
87 |
+
{
|
88 |
+
return $this->getField($name, $default);
|
89 |
+
}
|
90 |
+
|
91 |
+
/**
|
92 |
+
* Returns a list of all fields set on the object.
|
93 |
+
*
|
94 |
+
* @return array
|
95 |
+
*/
|
96 |
+
public function getFieldNames()
|
97 |
+
{
|
98 |
+
return array_keys($this->items);
|
99 |
+
}
|
100 |
+
|
101 |
+
/**
|
102 |
+
* Returns a list of all properties set on the object.
|
103 |
+
*
|
104 |
+
* @return array
|
105 |
+
*
|
106 |
+
* @deprecated 5.0.0 getPropertyNames() has been renamed to getFieldNames()
|
107 |
+
* @todo v6: Remove this method
|
108 |
+
*/
|
109 |
+
public function getPropertyNames()
|
110 |
+
{
|
111 |
+
return $this->getFieldNames();
|
112 |
+
}
|
113 |
+
|
114 |
+
/**
|
115 |
+
* Get all of the items in the collection.
|
116 |
+
*
|
117 |
+
* @return array
|
118 |
+
*/
|
119 |
+
public function all()
|
120 |
+
{
|
121 |
+
return $this->items;
|
122 |
+
}
|
123 |
+
|
124 |
+
/**
|
125 |
+
* Get the collection of items as a plain array.
|
126 |
+
*
|
127 |
+
* @return array
|
128 |
+
*/
|
129 |
+
public function asArray()
|
130 |
+
{
|
131 |
+
return array_map(function ($value) {
|
132 |
+
return $value instanceof Collection ? $value->asArray() : $value;
|
133 |
+
}, $this->items);
|
134 |
+
}
|
135 |
+
|
136 |
+
/**
|
137 |
+
* Run a map over each of the items.
|
138 |
+
*
|
139 |
+
* @param \Closure $callback
|
140 |
+
*
|
141 |
+
* @return static
|
142 |
+
*/
|
143 |
+
public function map(\Closure $callback)
|
144 |
+
{
|
145 |
+
return new static(array_map($callback, $this->items, array_keys($this->items)));
|
146 |
+
}
|
147 |
+
|
148 |
+
/**
|
149 |
+
* Get the collection of items as JSON.
|
150 |
+
*
|
151 |
+
* @param int $options
|
152 |
+
*
|
153 |
+
* @return string
|
154 |
+
*/
|
155 |
+
public function asJson($options = 0)
|
156 |
+
{
|
157 |
+
return json_encode($this->asArray(), $options);
|
158 |
+
}
|
159 |
+
|
160 |
+
/**
|
161 |
+
* Count the number of items in the collection.
|
162 |
+
*
|
163 |
+
* @return int
|
164 |
+
*/
|
165 |
+
public function count()
|
166 |
+
{
|
167 |
+
return count($this->items);
|
168 |
+
}
|
169 |
+
|
170 |
+
/**
|
171 |
+
* Get an iterator for the items.
|
172 |
+
*
|
173 |
+
* @return ArrayIterator
|
174 |
+
*/
|
175 |
+
public function getIterator()
|
176 |
+
{
|
177 |
+
return new ArrayIterator($this->items);
|
178 |
+
}
|
179 |
+
|
180 |
+
/**
|
181 |
+
* Determine if an item exists at an offset.
|
182 |
+
*
|
183 |
+
* @param mixed $key
|
184 |
+
*
|
185 |
+
* @return bool
|
186 |
+
*/
|
187 |
+
public function offsetExists($key)
|
188 |
+
{
|
189 |
+
return array_key_exists($key, $this->items);
|
190 |
+
}
|
191 |
+
|
192 |
+
/**
|
193 |
+
* Get an item at a given offset.
|
194 |
+
*
|
195 |
+
* @param mixed $key
|
196 |
+
*
|
197 |
+
* @return mixed
|
198 |
+
*/
|
199 |
+
public function offsetGet($key)
|
200 |
+
{
|
201 |
+
return $this->items[$key];
|
202 |
+
}
|
203 |
+
|
204 |
+
/**
|
205 |
+
* Set the item at a given offset.
|
206 |
+
*
|
207 |
+
* @param mixed $key
|
208 |
+
* @param mixed $value
|
209 |
+
*
|
210 |
+
* @return void
|
211 |
+
*/
|
212 |
+
public function offsetSet($key, $value)
|
213 |
+
{
|
214 |
+
if (is_null($key)) {
|
215 |
+
$this->items[] = $value;
|
216 |
+
} else {
|
217 |
+
$this->items[$key] = $value;
|
218 |
+
}
|
219 |
+
}
|
220 |
+
|
221 |
+
/**
|
222 |
+
* Unset the item at a given offset.
|
223 |
+
*
|
224 |
+
* @param string $key
|
225 |
+
*
|
226 |
+
* @return void
|
227 |
+
*/
|
228 |
+
public function offsetUnset($key)
|
229 |
+
{
|
230 |
+
unset($this->items[$key]);
|
231 |
+
}
|
232 |
+
|
233 |
+
/**
|
234 |
+
* Convert the collection to its string representation.
|
235 |
+
*
|
236 |
+
* @return string
|
237 |
+
*/
|
238 |
+
public function __toString()
|
239 |
+
{
|
240 |
+
return $this->asJson();
|
241 |
+
}
|
242 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphAchievement.php
ADDED
@@ -0,0 +1,112 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\GraphNodes;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class GraphAchievement
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
class GraphAchievement extends GraphNode
|
32 |
+
{
|
33 |
+
/**
|
34 |
+
* @var array Maps object key names to Graph object types.
|
35 |
+
*/
|
36 |
+
protected static $graphObjectMap = [
|
37 |
+
'from' => '\Facebook\GraphNodes\GraphUser',
|
38 |
+
'application' => '\Facebook\GraphNodes\GraphApplication',
|
39 |
+
];
|
40 |
+
|
41 |
+
/**
|
42 |
+
* Returns the ID for the achievement.
|
43 |
+
*
|
44 |
+
* @return string|null
|
45 |
+
*/
|
46 |
+
public function getId()
|
47 |
+
{
|
48 |
+
return $this->getField('id');
|
49 |
+
}
|
50 |
+
|
51 |
+
/**
|
52 |
+
* Returns the user who achieved this.
|
53 |
+
*
|
54 |
+
* @return GraphUser|null
|
55 |
+
*/
|
56 |
+
public function getFrom()
|
57 |
+
{
|
58 |
+
return $this->getField('from');
|
59 |
+
}
|
60 |
+
|
61 |
+
/**
|
62 |
+
* Returns the time at which this was achieved.
|
63 |
+
*
|
64 |
+
* @return \DateTime|null
|
65 |
+
*/
|
66 |
+
public function getPublishTime()
|
67 |
+
{
|
68 |
+
return $this->getField('publish_time');
|
69 |
+
}
|
70 |
+
|
71 |
+
/**
|
72 |
+
* Returns the app in which the user achieved this.
|
73 |
+
*
|
74 |
+
* @return GraphApplication|null
|
75 |
+
*/
|
76 |
+
public function getApplication()
|
77 |
+
{
|
78 |
+
return $this->getField('application');
|
79 |
+
}
|
80 |
+
|
81 |
+
/**
|
82 |
+
* Returns information about the achievement type this instance is connected with.
|
83 |
+
*
|
84 |
+
* @return array|null
|
85 |
+
*/
|
86 |
+
public function getData()
|
87 |
+
{
|
88 |
+
return $this->getField('data');
|
89 |
+
}
|
90 |
+
|
91 |
+
/**
|
92 |
+
* Returns the type of achievement.
|
93 |
+
*
|
94 |
+
* @see https://developers.facebook.com/docs/graph-api/reference/achievement
|
95 |
+
*
|
96 |
+
* @return string
|
97 |
+
*/
|
98 |
+
public function getType()
|
99 |
+
{
|
100 |
+
return 'game.achievement';
|
101 |
+
}
|
102 |
+
|
103 |
+
/**
|
104 |
+
* Indicates whether gaining the achievement published a feed story for the user.
|
105 |
+
*
|
106 |
+
* @return boolean|null
|
107 |
+
*/
|
108 |
+
public function isNoFeedStory()
|
109 |
+
{
|
110 |
+
return $this->getField('no_feed_story');
|
111 |
+
}
|
112 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphAlbum.php
ADDED
@@ -0,0 +1,183 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\GraphNodes;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class GraphAlbum
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
|
32 |
+
class GraphAlbum extends GraphNode
|
33 |
+
{
|
34 |
+
/**
|
35 |
+
* @var array Maps object key names to Graph object types.
|
36 |
+
*/
|
37 |
+
protected static $graphObjectMap = [
|
38 |
+
'from' => '\Facebook\GraphNodes\GraphUser',
|
39 |
+
'place' => '\Facebook\GraphNodes\GraphPage',
|
40 |
+
];
|
41 |
+
|
42 |
+
/**
|
43 |
+
* Returns the ID for the album.
|
44 |
+
*
|
45 |
+
* @return string|null
|
46 |
+
*/
|
47 |
+
public function getId()
|
48 |
+
{
|
49 |
+
return $this->getField('id');
|
50 |
+
}
|
51 |
+
|
52 |
+
/**
|
53 |
+
* Returns whether the viewer can upload photos to this album.
|
54 |
+
*
|
55 |
+
* @return boolean|null
|
56 |
+
*/
|
57 |
+
public function getCanUpload()
|
58 |
+
{
|
59 |
+
return $this->getField('can_upload');
|
60 |
+
}
|
61 |
+
|
62 |
+
/**
|
63 |
+
* Returns the number of photos in this album.
|
64 |
+
*
|
65 |
+
* @return int|null
|
66 |
+
*/
|
67 |
+
public function getCount()
|
68 |
+
{
|
69 |
+
return $this->getField('count');
|
70 |
+
}
|
71 |
+
|
72 |
+
/**
|
73 |
+
* Returns the ID of the album's cover photo.
|
74 |
+
*
|
75 |
+
* @return string|null
|
76 |
+
*/
|
77 |
+
public function getCoverPhoto()
|
78 |
+
{
|
79 |
+
return $this->getField('cover_photo');
|
80 |
+
}
|
81 |
+
|
82 |
+
/**
|
83 |
+
* Returns the time the album was initially created.
|
84 |
+
*
|
85 |
+
* @return \DateTime|null
|
86 |
+
*/
|
87 |
+
public function getCreatedTime()
|
88 |
+
{
|
89 |
+
return $this->getField('created_time');
|
90 |
+
}
|
91 |
+
|
92 |
+
/**
|
93 |
+
* Returns the time the album was updated.
|
94 |
+
*
|
95 |
+
* @return \DateTime|null
|
96 |
+
*/
|
97 |
+
public function getUpdatedTime()
|
98 |
+
{
|
99 |
+
return $this->getField('updated_time');
|
100 |
+
}
|
101 |
+
|
102 |
+
/**
|
103 |
+
* Returns the description of the album.
|
104 |
+
*
|
105 |
+
* @return string|null
|
106 |
+
*/
|
107 |
+
public function getDescription()
|
108 |
+
{
|
109 |
+
return $this->getField('description');
|
110 |
+
}
|
111 |
+
|
112 |
+
/**
|
113 |
+
* Returns profile that created the album.
|
114 |
+
*
|
115 |
+
* @return GraphUser|null
|
116 |
+
*/
|
117 |
+
public function getFrom()
|
118 |
+
{
|
119 |
+
return $this->getField('from');
|
120 |
+
}
|
121 |
+
|
122 |
+
/**
|
123 |
+
* Returns profile that created the album.
|
124 |
+
*
|
125 |
+
* @return GraphPage|null
|
126 |
+
*/
|
127 |
+
public function getPlace()
|
128 |
+
{
|
129 |
+
return $this->getField('place');
|
130 |
+
}
|
131 |
+
|
132 |
+
/**
|
133 |
+
* Returns a link to this album on Facebook.
|
134 |
+
*
|
135 |
+
* @return string|null
|
136 |
+
*/
|
137 |
+
public function getLink()
|
138 |
+
{
|
139 |
+
return $this->getField('link');
|
140 |
+
}
|
141 |
+
|
142 |
+
/**
|
143 |
+
* Returns the textual location of the album.
|
144 |
+
*
|
145 |
+
* @return string|null
|
146 |
+
*/
|
147 |
+
public function getLocation()
|
148 |
+
{
|
149 |
+
return $this->getField('location');
|
150 |
+
}
|
151 |
+
|
152 |
+
/**
|
153 |
+
* Returns the title of the album.
|
154 |
+
*
|
155 |
+
* @return string|null
|
156 |
+
*/
|
157 |
+
public function getName()
|
158 |
+
{
|
159 |
+
return $this->getField('name');
|
160 |
+
}
|
161 |
+
|
162 |
+
/**
|
163 |
+
* Returns the privacy settings for the album.
|
164 |
+
*
|
165 |
+
* @return string|null
|
166 |
+
*/
|
167 |
+
public function getPrivacy()
|
168 |
+
{
|
169 |
+
return $this->getField('privacy');
|
170 |
+
}
|
171 |
+
|
172 |
+
/**
|
173 |
+
* Returns the type of the album.
|
174 |
+
*
|
175 |
+
* enum{ profile, mobile, wall, normal, album }
|
176 |
+
*
|
177 |
+
* @return string|null
|
178 |
+
*/
|
179 |
+
public function getType()
|
180 |
+
{
|
181 |
+
return $this->getField('type');
|
182 |
+
}
|
183 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphApplication.php
ADDED
@@ -0,0 +1,43 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\GraphNodes;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class GraphApplication
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
|
32 |
+
class GraphApplication extends GraphNode
|
33 |
+
{
|
34 |
+
/**
|
35 |
+
* Returns the ID for the application.
|
36 |
+
*
|
37 |
+
* @return string|null
|
38 |
+
*/
|
39 |
+
public function getId()
|
40 |
+
{
|
41 |
+
return $this->getField('id');
|
42 |
+
}
|
43 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphCoverPhoto.php
ADDED
@@ -0,0 +1,72 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\GraphNodes;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class GraphCoverPhoto
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
class GraphCoverPhoto extends GraphNode
|
32 |
+
{
|
33 |
+
/**
|
34 |
+
* Returns the id of cover if it exists
|
35 |
+
*
|
36 |
+
* @return int|null
|
37 |
+
*/
|
38 |
+
public function getId()
|
39 |
+
{
|
40 |
+
return $this->getField('id');
|
41 |
+
}
|
42 |
+
|
43 |
+
/**
|
44 |
+
* Returns the source of cover if it exists
|
45 |
+
*
|
46 |
+
* @return string|null
|
47 |
+
*/
|
48 |
+
public function getSource()
|
49 |
+
{
|
50 |
+
return $this->getField('source');
|
51 |
+
}
|
52 |
+
|
53 |
+
/**
|
54 |
+
* Returns the offset_x of cover if it exists
|
55 |
+
*
|
56 |
+
* @return int|null
|
57 |
+
*/
|
58 |
+
public function getOffsetX()
|
59 |
+
{
|
60 |
+
return $this->getField('offset_x');
|
61 |
+
}
|
62 |
+
|
63 |
+
/**
|
64 |
+
* Returns the offset_y of cover if it exists
|
65 |
+
*
|
66 |
+
* @return int|null
|
67 |
+
*/
|
68 |
+
public function getOffsetY()
|
69 |
+
{
|
70 |
+
return $this->getField('offset_y');
|
71 |
+
}
|
72 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphEdge.php
ADDED
@@ -0,0 +1,252 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\GraphNodes;
|
25 |
+
|
26 |
+
use Facebook\FacebookRequest;
|
27 |
+
use Facebook\Url\FacebookUrlManipulator;
|
28 |
+
use Facebook\Exceptions\FacebookSDKException;
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Class GraphEdge
|
32 |
+
*
|
33 |
+
* @package Facebook
|
34 |
+
*/
|
35 |
+
class GraphEdge extends Collection
|
36 |
+
{
|
37 |
+
/**
|
38 |
+
* @var FacebookRequest The original request that generated this data.
|
39 |
+
*/
|
40 |
+
protected $request;
|
41 |
+
|
42 |
+
/**
|
43 |
+
* @var array An array of Graph meta data like pagination, etc.
|
44 |
+
*/
|
45 |
+
protected $metaData = [];
|
46 |
+
|
47 |
+
/**
|
48 |
+
* @var string|null The parent Graph edge endpoint that generated the list.
|
49 |
+
*/
|
50 |
+
protected $parentEdgeEndpoint;
|
51 |
+
|
52 |
+
/**
|
53 |
+
* @var string|null The subclass of the child GraphNode's.
|
54 |
+
*/
|
55 |
+
protected $subclassName;
|
56 |
+
|
57 |
+
/**
|
58 |
+
* Init this collection of GraphNode's.
|
59 |
+
*
|
60 |
+
* @param FacebookRequest $request The original request that generated this data.
|
61 |
+
* @param array $data An array of GraphNode's.
|
62 |
+
* @param array $metaData An array of Graph meta data like pagination, etc.
|
63 |
+
* @param string|null $parentEdgeEndpoint The parent Graph edge endpoint that generated the list.
|
64 |
+
* @param string|null $subclassName The subclass of the child GraphNode's.
|
65 |
+
*/
|
66 |
+
public function __construct(FacebookRequest $request, array $data = [], array $metaData = [], $parentEdgeEndpoint = null, $subclassName = null)
|
67 |
+
{
|
68 |
+
$this->request = $request;
|
69 |
+
$this->metaData = $metaData;
|
70 |
+
$this->parentEdgeEndpoint = $parentEdgeEndpoint;
|
71 |
+
$this->subclassName = $subclassName;
|
72 |
+
|
73 |
+
parent::__construct($data);
|
74 |
+
}
|
75 |
+
|
76 |
+
/**
|
77 |
+
* Gets the parent Graph edge endpoint that generated the list.
|
78 |
+
*
|
79 |
+
* @return string|null
|
80 |
+
*/
|
81 |
+
public function getParentGraphEdge()
|
82 |
+
{
|
83 |
+
return $this->parentEdgeEndpoint;
|
84 |
+
}
|
85 |
+
|
86 |
+
/**
|
87 |
+
* Gets the subclass name that the child GraphNode's are cast as.
|
88 |
+
*
|
89 |
+
* @return string|null
|
90 |
+
*/
|
91 |
+
public function getSubClassName()
|
92 |
+
{
|
93 |
+
return $this->subclassName;
|
94 |
+
}
|
95 |
+
|
96 |
+
/**
|
97 |
+
* Returns the raw meta data associated with this GraphEdge.
|
98 |
+
*
|
99 |
+
* @return array
|
100 |
+
*/
|
101 |
+
public function getMetaData()
|
102 |
+
{
|
103 |
+
return $this->metaData;
|
104 |
+
}
|
105 |
+
|
106 |
+
/**
|
107 |
+
* Returns the next cursor if it exists.
|
108 |
+
*
|
109 |
+
* @return string|null
|
110 |
+
*/
|
111 |
+
public function getNextCursor()
|
112 |
+
{
|
113 |
+
return $this->getCursor('after');
|
114 |
+
}
|
115 |
+
|
116 |
+
/**
|
117 |
+
* Returns the previous cursor if it exists.
|
118 |
+
*
|
119 |
+
* @return string|null
|
120 |
+
*/
|
121 |
+
public function getPreviousCursor()
|
122 |
+
{
|
123 |
+
return $this->getCursor('before');
|
124 |
+
}
|
125 |
+
|
126 |
+
/**
|
127 |
+
* Returns the cursor for a specific direction if it exists.
|
128 |
+
*
|
129 |
+
* @param string $direction The direction of the page: after|before
|
130 |
+
*
|
131 |
+
* @return string|null
|
132 |
+
*/
|
133 |
+
public function getCursor($direction)
|
134 |
+
{
|
135 |
+
if (isset($this->metaData['paging']['cursors'][$direction])) {
|
136 |
+
return $this->metaData['paging']['cursors'][$direction];
|
137 |
+
}
|
138 |
+
|
139 |
+
return null;
|
140 |
+
}
|
141 |
+
|
142 |
+
/**
|
143 |
+
* Generates a pagination URL based on a cursor.
|
144 |
+
*
|
145 |
+
* @param string $direction The direction of the page: next|previous
|
146 |
+
*
|
147 |
+
* @return string|null
|
148 |
+
*
|
149 |
+
* @throws FacebookSDKException
|
150 |
+
*/
|
151 |
+
public function getPaginationUrl($direction)
|
152 |
+
{
|
153 |
+
$this->validateForPagination();
|
154 |
+
|
155 |
+
// Do we have a paging URL?
|
156 |
+
if (!isset($this->metaData['paging'][$direction])) {
|
157 |
+
return null;
|
158 |
+
}
|
159 |
+
|
160 |
+
$pageUrl = $this->metaData['paging'][$direction];
|
161 |
+
|
162 |
+
return FacebookUrlManipulator::baseGraphUrlEndpoint($pageUrl);
|
163 |
+
}
|
164 |
+
|
165 |
+
/**
|
166 |
+
* Validates whether or not we can paginate on this request.
|
167 |
+
*
|
168 |
+
* @throws FacebookSDKException
|
169 |
+
*/
|
170 |
+
public function validateForPagination()
|
171 |
+
{
|
172 |
+
if ($this->request->getMethod() !== 'GET') {
|
173 |
+
throw new FacebookSDKException('You can only paginate on a GET request.', 720);
|
174 |
+
}
|
175 |
+
}
|
176 |
+
|
177 |
+
/**
|
178 |
+
* Gets the request object needed to make a next|previous page request.
|
179 |
+
*
|
180 |
+
* @param string $direction The direction of the page: next|previous
|
181 |
+
*
|
182 |
+
* @return FacebookRequest|null
|
183 |
+
*
|
184 |
+
* @throws FacebookSDKException
|
185 |
+
*/
|
186 |
+
public function getPaginationRequest($direction)
|
187 |
+
{
|
188 |
+
$pageUrl = $this->getPaginationUrl($direction);
|
189 |
+
if (!$pageUrl) {
|
190 |
+
return null;
|
191 |
+
}
|
192 |
+
|
193 |
+
$newRequest = clone $this->request;
|
194 |
+
$newRequest->setEndpoint($pageUrl);
|
195 |
+
|
196 |
+
return $newRequest;
|
197 |
+
}
|
198 |
+
|
199 |
+
/**
|
200 |
+
* Gets the request object needed to make a "next" page request.
|
201 |
+
*
|
202 |
+
* @return FacebookRequest|null
|
203 |
+
*
|
204 |
+
* @throws FacebookSDKException
|
205 |
+
*/
|
206 |
+
public function getNextPageRequest()
|
207 |
+
{
|
208 |
+
return $this->getPaginationRequest('next');
|
209 |
+
}
|
210 |
+
|
211 |
+
/**
|
212 |
+
* Gets the request object needed to make a "previous" page request.
|
213 |
+
*
|
214 |
+
* @return FacebookRequest|null
|
215 |
+
*
|
216 |
+
* @throws FacebookSDKException
|
217 |
+
*/
|
218 |
+
public function getPreviousPageRequest()
|
219 |
+
{
|
220 |
+
return $this->getPaginationRequest('previous');
|
221 |
+
}
|
222 |
+
|
223 |
+
/**
|
224 |
+
* The total number of results according to Graph if it exists.
|
225 |
+
*
|
226 |
+
* This will be returned if the summary=true modifier is present in the request.
|
227 |
+
*
|
228 |
+
* @return int|null
|
229 |
+
*/
|
230 |
+
public function getTotalCount()
|
231 |
+
{
|
232 |
+
if (isset($this->metaData['summary']['total_count'])) {
|
233 |
+
return $this->metaData['summary']['total_count'];
|
234 |
+
}
|
235 |
+
|
236 |
+
return null;
|
237 |
+
}
|
238 |
+
|
239 |
+
/**
|
240 |
+
* @inheritDoc
|
241 |
+
*/
|
242 |
+
public function map(\Closure $callback)
|
243 |
+
{
|
244 |
+
return new static(
|
245 |
+
$this->request,
|
246 |
+
array_map($callback, $this->items, array_keys($this->items)),
|
247 |
+
$this->metaData,
|
248 |
+
$this->parentEdgeEndpoint,
|
249 |
+
$this->subclassName
|
250 |
+
);
|
251 |
+
}
|
252 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphEvent.php
ADDED
@@ -0,0 +1,242 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\GraphNodes;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class GraphEvent
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
class GraphEvent extends GraphNode
|
32 |
+
{
|
33 |
+
/**
|
34 |
+
* @var array Maps object key names to GraphNode types.
|
35 |
+
*/
|
36 |
+
protected static $graphObjectMap = [
|
37 |
+
'cover' => '\Facebook\GraphNodes\GraphCoverPhoto',
|
38 |
+
'place' => '\Facebook\GraphNodes\GraphPage',
|
39 |
+
'picture' => '\Facebook\GraphNodes\GraphPicture',
|
40 |
+
'parent_group' => '\Facebook\GraphNodes\GraphGroup',
|
41 |
+
];
|
42 |
+
|
43 |
+
/**
|
44 |
+
* Returns the `id` (The event ID) as string if present.
|
45 |
+
*
|
46 |
+
* @return string|null
|
47 |
+
*/
|
48 |
+
public function getId()
|
49 |
+
{
|
50 |
+
return $this->getField('id');
|
51 |
+
}
|
52 |
+
|
53 |
+
/**
|
54 |
+
* Returns the `cover` (Cover picture) as GraphCoverPhoto if present.
|
55 |
+
*
|
56 |
+
* @return GraphCoverPhoto|null
|
57 |
+
*/
|
58 |
+
public function getCover()
|
59 |
+
{
|
60 |
+
return $this->getField('cover');
|
61 |
+
}
|
62 |
+
|
63 |
+
/**
|
64 |
+
* Returns the `description` (Long-form description) as string if present.
|
65 |
+
*
|
66 |
+
* @return string|null
|
67 |
+
*/
|
68 |
+
public function getDescription()
|
69 |
+
{
|
70 |
+
return $this->getField('description');
|
71 |
+
}
|
72 |
+
|
73 |
+
/**
|
74 |
+
* Returns the `end_time` (End time, if one has been set) as DateTime if present.
|
75 |
+
*
|
76 |
+
* @return \DateTime|null
|
77 |
+
*/
|
78 |
+
public function getEndTime()
|
79 |
+
{
|
80 |
+
return $this->getField('end_time');
|
81 |
+
}
|
82 |
+
|
83 |
+
/**
|
84 |
+
* Returns the `is_date_only` (Whether the event only has a date specified, but no time) as bool if present.
|
85 |
+
*
|
86 |
+
* @return bool|null
|
87 |
+
*/
|
88 |
+
public function getIsDateOnly()
|
89 |
+
{
|
90 |
+
return $this->getField('is_date_only');
|
91 |
+
}
|
92 |
+
|
93 |
+
/**
|
94 |
+
* Returns the `name` (Event name) as string if present.
|
95 |
+
*
|
96 |
+
* @return string|null
|
97 |
+
*/
|
98 |
+
public function getName()
|
99 |
+
{
|
100 |
+
return $this->getField('name');
|
101 |
+
}
|
102 |
+
|
103 |
+
/**
|
104 |
+
* Returns the `owner` (The profile that created the event) as GraphNode if present.
|
105 |
+
*
|
106 |
+
* @return GraphNode|null
|
107 |
+
*/
|
108 |
+
public function getOwner()
|
109 |
+
{
|
110 |
+
return $this->getField('owner');
|
111 |
+
}
|
112 |
+
|
113 |
+
/**
|
114 |
+
* Returns the `parent_group` (The group the event belongs to) as GraphGroup if present.
|
115 |
+
*
|
116 |
+
* @return GraphGroup|null
|
117 |
+
*/
|
118 |
+
public function getParentGroup()
|
119 |
+
{
|
120 |
+
return $this->getField('parent_group');
|
121 |
+
}
|
122 |
+
|
123 |
+
/**
|
124 |
+
* Returns the `place` (Event Place information) as GraphPage if present.
|
125 |
+
*
|
126 |
+
* @return GraphPage|null
|
127 |
+
*/
|
128 |
+
public function getPlace()
|
129 |
+
{
|
130 |
+
return $this->getField('place');
|
131 |
+
}
|
132 |
+
|
133 |
+
/**
|
134 |
+
* Returns the `privacy` (Who can see the event) as string if present.
|
135 |
+
*
|
136 |
+
* @return string|null
|
137 |
+
*/
|
138 |
+
public function getPrivacy()
|
139 |
+
{
|
140 |
+
return $this->getField('privacy');
|
141 |
+
}
|
142 |
+
|
143 |
+
/**
|
144 |
+
* Returns the `start_time` (Start time) as DateTime if present.
|
145 |
+
*
|
146 |
+
* @return \DateTime|null
|
147 |
+
*/
|
148 |
+
public function getStartTime()
|
149 |
+
{
|
150 |
+
return $this->getField('start_time');
|
151 |
+
}
|
152 |
+
|
153 |
+
/**
|
154 |
+
* Returns the `ticket_uri` (The link users can visit to buy a ticket to this event) as string if present.
|
155 |
+
*
|
156 |
+
* @return string|null
|
157 |
+
*/
|
158 |
+
public function getTicketUri()
|
159 |
+
{
|
160 |
+
return $this->getField('ticket_uri');
|
161 |
+
}
|
162 |
+
|
163 |
+
/**
|
164 |
+
* Returns the `timezone` (Timezone) as string if present.
|
165 |
+
*
|
166 |
+
* @return string|null
|
167 |
+
*/
|
168 |
+
public function getTimezone()
|
169 |
+
{
|
170 |
+
return $this->getField('timezone');
|
171 |
+
}
|
172 |
+
|
173 |
+
/**
|
174 |
+
* Returns the `updated_time` (Last update time) as DateTime if present.
|
175 |
+
*
|
176 |
+
* @return \DateTime|null
|
177 |
+
*/
|
178 |
+
public function getUpdatedTime()
|
179 |
+
{
|
180 |
+
return $this->getField('updated_time');
|
181 |
+
}
|
182 |
+
|
183 |
+
/**
|
184 |
+
* Returns the `picture` (Event picture) as GraphPicture if present.
|
185 |
+
*
|
186 |
+
* @return GraphPicture|null
|
187 |
+
*/
|
188 |
+
public function getPicture()
|
189 |
+
{
|
190 |
+
return $this->getField('picture');
|
191 |
+
}
|
192 |
+
|
193 |
+
/**
|
194 |
+
* Returns the `attending_count` (Number of people attending the event) as int if present.
|
195 |
+
*
|
196 |
+
* @return int|null
|
197 |
+
*/
|
198 |
+
public function getAttendingCount()
|
199 |
+
{
|
200 |
+
return $this->getField('attending_count');
|
201 |
+
}
|
202 |
+
|
203 |
+
/**
|
204 |
+
* Returns the `declined_count` (Number of people who declined the event) as int if present.
|
205 |
+
*
|
206 |
+
* @return int|null
|
207 |
+
*/
|
208 |
+
public function getDeclinedCount()
|
209 |
+
{
|
210 |
+
return $this->getField('declined_count');
|
211 |
+
}
|
212 |
+
|
213 |
+
/**
|
214 |
+
* Returns the `maybe_count` (Number of people who maybe going to the event) as int if present.
|
215 |
+
*
|
216 |
+
* @return int|null
|
217 |
+
*/
|
218 |
+
public function getMaybeCount()
|
219 |
+
{
|
220 |
+
return $this->getField('maybe_count');
|
221 |
+
}
|
222 |
+
|
223 |
+
/**
|
224 |
+
* Returns the `noreply_count` (Number of people who did not reply to the event) as int if present.
|
225 |
+
*
|
226 |
+
* @return int|null
|
227 |
+
*/
|
228 |
+
public function getNoreplyCount()
|
229 |
+
{
|
230 |
+
return $this->getField('noreply_count');
|
231 |
+
}
|
232 |
+
|
233 |
+
/**
|
234 |
+
* Returns the `invited_count` (Number of people invited to the event) as int if present.
|
235 |
+
*
|
236 |
+
* @return int|null
|
237 |
+
*/
|
238 |
+
public function getInvitedCount()
|
239 |
+
{
|
240 |
+
return $this->getField('invited_count');
|
241 |
+
}
|
242 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphGroup.php
ADDED
@@ -0,0 +1,170 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\GraphNodes;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class GraphGroup
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
class GraphGroup extends GraphNode
|
32 |
+
{
|
33 |
+
/**
|
34 |
+
* @var array Maps object key names to GraphNode types.
|
35 |
+
*/
|
36 |
+
protected static $graphObjectMap = [
|
37 |
+
'cover' => '\Facebook\GraphNodes\GraphCoverPhoto',
|
38 |
+
'venue' => '\Facebook\GraphNodes\GraphLocation',
|
39 |
+
];
|
40 |
+
|
41 |
+
/**
|
42 |
+
* Returns the `id` (The Group ID) as string if present.
|
43 |
+
*
|
44 |
+
* @return string|null
|
45 |
+
*/
|
46 |
+
public function getId()
|
47 |
+
{
|
48 |
+
return $this->getField('id');
|
49 |
+
}
|
50 |
+
|
51 |
+
/**
|
52 |
+
* Returns the `cover` (The cover photo of the Group) as GraphCoverPhoto if present.
|
53 |
+
*
|
54 |
+
* @return GraphCoverPhoto|null
|
55 |
+
*/
|
56 |
+
public function getCover()
|
57 |
+
{
|
58 |
+
return $this->getField('cover');
|
59 |
+
}
|
60 |
+
|
61 |
+
/**
|
62 |
+
* Returns the `description` (A brief description of the Group) as string if present.
|
63 |
+
*
|
64 |
+
* @return string|null
|
65 |
+
*/
|
66 |
+
public function getDescription()
|
67 |
+
{
|
68 |
+
return $this->getField('description');
|
69 |
+
}
|
70 |
+
|
71 |
+
/**
|
72 |
+
* Returns the `email` (The email address to upload content to the Group. Only current members of the Group can use this) as string if present.
|
73 |
+
*
|
74 |
+
* @return string|null
|
75 |
+
*/
|
76 |
+
public function getEmail()
|
77 |
+
{
|
78 |
+
return $this->getField('email');
|
79 |
+
}
|
80 |
+
|
81 |
+
/**
|
82 |
+
* Returns the `icon` (The URL for the Group's icon) as string if present.
|
83 |
+
*
|
84 |
+
* @return string|null
|
85 |
+
*/
|
86 |
+
public function getIcon()
|
87 |
+
{
|
88 |
+
return $this->getField('icon');
|
89 |
+
}
|
90 |
+
|
91 |
+
/**
|
92 |
+
* Returns the `link` (The Group's website) as string if present.
|
93 |
+
*
|
94 |
+
* @return string|null
|
95 |
+
*/
|
96 |
+
public function getLink()
|
97 |
+
{
|
98 |
+
return $this->getField('link');
|
99 |
+
}
|
100 |
+
|
101 |
+
/**
|
102 |
+
* Returns the `name` (The name of the Group) as string if present.
|
103 |
+
*
|
104 |
+
* @return string|null
|
105 |
+
*/
|
106 |
+
public function getName()
|
107 |
+
{
|
108 |
+
return $this->getField('name');
|
109 |
+
}
|
110 |
+
|
111 |
+
/**
|
112 |
+
* Returns the `member_request_count` (Number of people asking to join the group.) as int if present.
|
113 |
+
*
|
114 |
+
* @return int|null
|
115 |
+
*/
|
116 |
+
public function getMemberRequestCount()
|
117 |
+
{
|
118 |
+
return $this->getField('member_request_count');
|
119 |
+
}
|
120 |
+
|
121 |
+
/**
|
122 |
+
* Returns the `owner` (The profile that created this Group) as GraphNode if present.
|
123 |
+
*
|
124 |
+
* @return GraphNode|null
|
125 |
+
*/
|
126 |
+
public function getOwner()
|
127 |
+
{
|
128 |
+
return $this->getField('owner');
|
129 |
+
}
|
130 |
+
|
131 |
+
/**
|
132 |
+
* Returns the `parent` (The parent Group of this Group, if it exists) as GraphNode if present.
|
133 |
+
*
|
134 |
+
* @return GraphNode|null
|
135 |
+
*/
|
136 |
+
public function getParent()
|
137 |
+
{
|
138 |
+
return $this->getField('parent');
|
139 |
+
}
|
140 |
+
|
141 |
+
/**
|
142 |
+
* Returns the `privacy` (The privacy setting of the Group) as string if present.
|
143 |
+
*
|
144 |
+
* @return string|null
|
145 |
+
*/
|
146 |
+
public function getPrivacy()
|
147 |
+
{
|
148 |
+
return $this->getField('privacy');
|
149 |
+
}
|
150 |
+
|
151 |
+
/**
|
152 |
+
* Returns the `updated_time` (The last time the Group was updated (this includes changes in the Group's properties and changes in posts and comments if user can see them)) as \DateTime if present.
|
153 |
+
*
|
154 |
+
* @return \DateTime|null
|
155 |
+
*/
|
156 |
+
public function getUpdatedTime()
|
157 |
+
{
|
158 |
+
return $this->getField('updated_time');
|
159 |
+
}
|
160 |
+
|
161 |
+
/**
|
162 |
+
* Returns the `venue` (The location for the Group) as GraphLocation if present.
|
163 |
+
*
|
164 |
+
* @return GraphLocation|null
|
165 |
+
*/
|
166 |
+
public function getVenue()
|
167 |
+
{
|
168 |
+
return $this->getField('venue');
|
169 |
+
}
|
170 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphList.php
ADDED
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\GraphNodes;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class GraphList
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*
|
31 |
+
* @deprecated 5.0.0 GraphList has been renamed to GraphEdge
|
32 |
+
* @todo v6: Remove this class
|
33 |
+
*/
|
34 |
+
class GraphList extends GraphEdge
|
35 |
+
{
|
36 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphLocation.php
ADDED
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\GraphNodes;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class GraphLocation
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
class GraphLocation extends GraphNode
|
32 |
+
{
|
33 |
+
/**
|
34 |
+
* Returns the street component of the location
|
35 |
+
*
|
36 |
+
* @return string|null
|
37 |
+
*/
|
38 |
+
public function getStreet()
|
39 |
+
{
|
40 |
+
return $this->getField('street');
|
41 |
+
}
|
42 |
+
|
43 |
+
/**
|
44 |
+
* Returns the city component of the location
|
45 |
+
*
|
46 |
+
* @return string|null
|
47 |
+
*/
|
48 |
+
public function getCity()
|
49 |
+
{
|
50 |
+
return $this->getField('city');
|
51 |
+
}
|
52 |
+
|
53 |
+
/**
|
54 |
+
* Returns the state component of the location
|
55 |
+
*
|
56 |
+
* @return string|null
|
57 |
+
*/
|
58 |
+
public function getState()
|
59 |
+
{
|
60 |
+
return $this->getField('state');
|
61 |
+
}
|
62 |
+
|
63 |
+
/**
|
64 |
+
* Returns the country component of the location
|
65 |
+
*
|
66 |
+
* @return string|null
|
67 |
+
*/
|
68 |
+
public function getCountry()
|
69 |
+
{
|
70 |
+
return $this->getField('country');
|
71 |
+
}
|
72 |
+
|
73 |
+
/**
|
74 |
+
* Returns the zipcode component of the location
|
75 |
+
*
|
76 |
+
* @return string|null
|
77 |
+
*/
|
78 |
+
public function getZip()
|
79 |
+
{
|
80 |
+
return $this->getField('zip');
|
81 |
+
}
|
82 |
+
|
83 |
+
/**
|
84 |
+
* Returns the latitude component of the location
|
85 |
+
*
|
86 |
+
* @return float|null
|
87 |
+
*/
|
88 |
+
public function getLatitude()
|
89 |
+
{
|
90 |
+
return $this->getField('latitude');
|
91 |
+
}
|
92 |
+
|
93 |
+
/**
|
94 |
+
* Returns the street component of the location
|
95 |
+
*
|
96 |
+
* @return float|null
|
97 |
+
*/
|
98 |
+
public function getLongitude()
|
99 |
+
{
|
100 |
+
return $this->getField('longitude');
|
101 |
+
}
|
102 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphNode.php
ADDED
@@ -0,0 +1,197 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\GraphNodes;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class GraphNode
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
class GraphNode extends Collection
|
32 |
+
{
|
33 |
+
/**
|
34 |
+
* @var array Maps object key names to Graph object types.
|
35 |
+
*/
|
36 |
+
protected static $graphObjectMap = [];
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Init this Graph object.
|
40 |
+
*
|
41 |
+
* @param array $data
|
42 |
+
*/
|
43 |
+
public function __construct(array $data = [])
|
44 |
+
{
|
45 |
+
parent::__construct($this->castItems($data));
|
46 |
+
}
|
47 |
+
|
48 |
+
/**
|
49 |
+
* Iterates over an array and detects the types each node
|
50 |
+
* should be cast to and returns all the items as an array.
|
51 |
+
*
|
52 |
+
* @TODO Add auto-casting to AccessToken entities.
|
53 |
+
*
|
54 |
+
* @param array $data The array to iterate over.
|
55 |
+
*
|
56 |
+
* @return array
|
57 |
+
*/
|
58 |
+
public function castItems(array $data)
|
59 |
+
{
|
60 |
+
$items = [];
|
61 |
+
|
62 |
+
foreach ($data as $k => $v) {
|
63 |
+
if ($this->shouldCastAsDateTime($k)
|
64 |
+
&& (is_numeric($v)
|
65 |
+
|| $this->isIso8601DateString($v))
|
66 |
+
) {
|
67 |
+
$items[$k] = $this->castToDateTime($v);
|
68 |
+
} elseif ($k === 'birthday') {
|
69 |
+
$items[$k] = $this->castToBirthday($v);
|
70 |
+
} else {
|
71 |
+
$items[$k] = $v;
|
72 |
+
}
|
73 |
+
}
|
74 |
+
|
75 |
+
return $items;
|
76 |
+
}
|
77 |
+
|
78 |
+
/**
|
79 |
+
* Uncasts any auto-casted datatypes.
|
80 |
+
* Basically the reverse of castItems().
|
81 |
+
*
|
82 |
+
* @return array
|
83 |
+
*/
|
84 |
+
public function uncastItems()
|
85 |
+
{
|
86 |
+
$items = $this->asArray();
|
87 |
+
|
88 |
+
return array_map(function ($v) {
|
89 |
+
if ($v instanceof \DateTime) {
|
90 |
+
return $v->format(\DateTime::ISO8601);
|
91 |
+
}
|
92 |
+
|
93 |
+
return $v;
|
94 |
+
}, $items);
|
95 |
+
}
|
96 |
+
|
97 |
+
/**
|
98 |
+
* Get the collection of items as JSON.
|
99 |
+
*
|
100 |
+
* @param int $options
|
101 |
+
*
|
102 |
+
* @return string
|
103 |
+
*/
|
104 |
+
public function asJson($options = 0)
|
105 |
+
{
|
106 |
+
return json_encode($this->uncastItems(), $options);
|
107 |
+
}
|
108 |
+
|
109 |
+
/**
|
110 |
+
* Detects an ISO 8601 formatted string.
|
111 |
+
*
|
112 |
+
* @param string $string
|
113 |
+
*
|
114 |
+
* @return boolean
|
115 |
+
*
|
116 |
+
* @see https://developers.facebook.com/docs/graph-api/using-graph-api/#readmodifiers
|
117 |
+
* @see http://www.cl.cam.ac.uk/~mgk25/iso-time.html
|
118 |
+
* @see http://en.wikipedia.org/wiki/ISO_8601
|
119 |
+
*/
|
120 |
+
public function isIso8601DateString($string)
|
121 |
+
{
|
122 |
+
// This insane regex was yoinked from here:
|
123 |
+
// http://www.pelagodesign.com/blog/2009/05/20/iso-8601-date-validation-that-doesnt-suck/
|
124 |
+
// ...and I'm all like:
|
125 |
+
// http://thecodinglove.com/post/95378251969/when-code-works-and-i-dont-know-why
|
126 |
+
$crazyInsaneRegexThatSomehowDetectsIso8601 = '/^([\+-]?\d{4}(?!\d{2}\b))'
|
127 |
+
. '((-?)((0[1-9]|1[0-2])(\3([12]\d|0[1-9]|3[01]))?'
|
128 |
+
. '|W([0-4]\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\d'
|
129 |
+
. '|[12]\d{2}|3([0-5]\d|6[1-6])))([T\s]((([01]\d|2[0-3])'
|
130 |
+
. '((:?)[0-5]\d)?|24\:?00)([\.,]\d+(?!:))?)?(\17[0-5]\d'
|
131 |
+
. '([\.,]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)?$/';
|
132 |
+
|
133 |
+
return preg_match($crazyInsaneRegexThatSomehowDetectsIso8601, $string) === 1;
|
134 |
+
}
|
135 |
+
|
136 |
+
/**
|
137 |
+
* Determines if a value from Graph should be cast to DateTime.
|
138 |
+
*
|
139 |
+
* @param string $key
|
140 |
+
*
|
141 |
+
* @return boolean
|
142 |
+
*/
|
143 |
+
public function shouldCastAsDateTime($key)
|
144 |
+
{
|
145 |
+
return in_array($key, [
|
146 |
+
'created_time',
|
147 |
+
'updated_time',
|
148 |
+
'start_time',
|
149 |
+
'end_time',
|
150 |
+
'backdated_time',
|
151 |
+
'issued_at',
|
152 |
+
'expires_at',
|
153 |
+
'publish_time'
|
154 |
+
], true);
|
155 |
+
}
|
156 |
+
|
157 |
+
/**
|
158 |
+
* Casts a date value from Graph to DateTime.
|
159 |
+
*
|
160 |
+
* @param int|string $value
|
161 |
+
*
|
162 |
+
* @return \DateTime
|
163 |
+
*/
|
164 |
+
public function castToDateTime($value)
|
165 |
+
{
|
166 |
+
if (is_int($value)) {
|
167 |
+
$dt = new \DateTime();
|
168 |
+
$dt->setTimestamp($value);
|
169 |
+
} else {
|
170 |
+
$dt = new \DateTime($value);
|
171 |
+
}
|
172 |
+
|
173 |
+
return $dt;
|
174 |
+
}
|
175 |
+
|
176 |
+
/**
|
177 |
+
* Casts a birthday value from Graph to Birthday
|
178 |
+
*
|
179 |
+
* @param string $value
|
180 |
+
*
|
181 |
+
* @return Birthday
|
182 |
+
*/
|
183 |
+
public function castToBirthday($value)
|
184 |
+
{
|
185 |
+
return new Birthday($value);
|
186 |
+
}
|
187 |
+
|
188 |
+
/**
|
189 |
+
* Getter for $graphObjectMap.
|
190 |
+
*
|
191 |
+
* @return array
|
192 |
+
*/
|
193 |
+
public static function getObjectMap()
|
194 |
+
{
|
195 |
+
return static::$graphObjectMap;
|
196 |
+
}
|
197 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphNodeFactory.php
ADDED
@@ -0,0 +1,392 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\GraphNodes;
|
25 |
+
|
26 |
+
use Facebook\FacebookResponse;
|
27 |
+
use Facebook\Exceptions\FacebookSDKException;
|
28 |
+
|
29 |
+
/**
|
30 |
+
* Class GraphNodeFactory
|
31 |
+
*
|
32 |
+
* @package Facebook
|
33 |
+
*
|
34 |
+
* ## Assumptions ##
|
35 |
+
* GraphEdge - is ALWAYS a numeric array
|
36 |
+
* GraphEdge - is ALWAYS an array of GraphNode types
|
37 |
+
* GraphNode - is ALWAYS an associative array
|
38 |
+
* GraphNode - MAY contain GraphNode's "recurrable"
|
39 |
+
* GraphNode - MAY contain GraphEdge's "recurrable"
|
40 |
+
* GraphNode - MAY contain DateTime's "primitives"
|
41 |
+
* GraphNode - MAY contain string's "primitives"
|
42 |
+
*/
|
43 |
+
class GraphNodeFactory
|
44 |
+
{
|
45 |
+
/**
|
46 |
+
* @const string The base graph object class.
|
47 |
+
*/
|
48 |
+
const BASE_GRAPH_NODE_CLASS = '\Facebook\GraphNodes\GraphNode';
|
49 |
+
|
50 |
+
/**
|
51 |
+
* @const string The base graph edge class.
|
52 |
+
*/
|
53 |
+
const BASE_GRAPH_EDGE_CLASS = '\Facebook\GraphNodes\GraphEdge';
|
54 |
+
|
55 |
+
/**
|
56 |
+
* @const string The graph object prefix.
|
57 |
+
*/
|
58 |
+
const BASE_GRAPH_OBJECT_PREFIX = '\Facebook\GraphNodes\\';
|
59 |
+
|
60 |
+
/**
|
61 |
+
* @var FacebookResponse The response entity from Graph.
|
62 |
+
*/
|
63 |
+
protected $response;
|
64 |
+
|
65 |
+
/**
|
66 |
+
* @var array The decoded body of the FacebookResponse entity from Graph.
|
67 |
+
*/
|
68 |
+
protected $decodedBody;
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Init this Graph object.
|
72 |
+
*
|
73 |
+
* @param FacebookResponse $response The response entity from Graph.
|
74 |
+
*/
|
75 |
+
public function __construct(FacebookResponse $response)
|
76 |
+
{
|
77 |
+
$this->response = $response;
|
78 |
+
$this->decodedBody = $response->getDecodedBody();
|
79 |
+
}
|
80 |
+
|
81 |
+
/**
|
82 |
+
* Tries to convert a FacebookResponse entity into a GraphNode.
|
83 |
+
*
|
84 |
+
* @param string|null $subclassName The GraphNode sub class to cast to.
|
85 |
+
*
|
86 |
+
* @return GraphNode
|
87 |
+
*
|
88 |
+
* @throws FacebookSDKException
|
89 |
+
*/
|
90 |
+
public function makeGraphNode($subclassName = null)
|
91 |
+
{
|
92 |
+
$this->validateResponseAsArray();
|
93 |
+
$this->validateResponseCastableAsGraphNode();
|
94 |
+
|
95 |
+
return $this->castAsGraphNodeOrGraphEdge($this->decodedBody, $subclassName);
|
96 |
+
}
|
97 |
+
|
98 |
+
/**
|
99 |
+
* Convenience method for creating a GraphAchievement collection.
|
100 |
+
*
|
101 |
+
* @return GraphAchievement
|
102 |
+
*
|
103 |
+
* @throws FacebookSDKException
|
104 |
+
*/
|
105 |
+
public function makeGraphAchievement()
|
106 |
+
{
|
107 |
+
return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphAchievement');
|
108 |
+
}
|
109 |
+
|
110 |
+
/**
|
111 |
+
* Convenience method for creating a GraphAlbum collection.
|
112 |
+
*
|
113 |
+
* @return GraphAlbum
|
114 |
+
*
|
115 |
+
* @throws FacebookSDKException
|
116 |
+
*/
|
117 |
+
public function makeGraphAlbum()
|
118 |
+
{
|
119 |
+
return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphAlbum');
|
120 |
+
}
|
121 |
+
|
122 |
+
/**
|
123 |
+
* Convenience method for creating a GraphPage collection.
|
124 |
+
*
|
125 |
+
* @return GraphPage
|
126 |
+
*
|
127 |
+
* @throws FacebookSDKException
|
128 |
+
*/
|
129 |
+
public function makeGraphPage()
|
130 |
+
{
|
131 |
+
return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphPage');
|
132 |
+
}
|
133 |
+
|
134 |
+
/**
|
135 |
+
* Convenience method for creating a GraphSessionInfo collection.
|
136 |
+
*
|
137 |
+
* @return GraphSessionInfo
|
138 |
+
*
|
139 |
+
* @throws FacebookSDKException
|
140 |
+
*/
|
141 |
+
public function makeGraphSessionInfo()
|
142 |
+
{
|
143 |
+
return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphSessionInfo');
|
144 |
+
}
|
145 |
+
|
146 |
+
/**
|
147 |
+
* Convenience method for creating a GraphUser collection.
|
148 |
+
*
|
149 |
+
* @return GraphUser
|
150 |
+
*
|
151 |
+
* @throws FacebookSDKException
|
152 |
+
*/
|
153 |
+
public function makeGraphUser()
|
154 |
+
{
|
155 |
+
return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphUser');
|
156 |
+
}
|
157 |
+
|
158 |
+
/**
|
159 |
+
* Convenience method for creating a GraphEvent collection.
|
160 |
+
*
|
161 |
+
* @return GraphEvent
|
162 |
+
*
|
163 |
+
* @throws FacebookSDKException
|
164 |
+
*/
|
165 |
+
public function makeGraphEvent()
|
166 |
+
{
|
167 |
+
return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphEvent');
|
168 |
+
}
|
169 |
+
|
170 |
+
/**
|
171 |
+
* Convenience method for creating a GraphGroup collection.
|
172 |
+
*
|
173 |
+
* @return GraphGroup
|
174 |
+
*
|
175 |
+
* @throws FacebookSDKException
|
176 |
+
*/
|
177 |
+
public function makeGraphGroup()
|
178 |
+
{
|
179 |
+
return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphGroup');
|
180 |
+
}
|
181 |
+
|
182 |
+
/**
|
183 |
+
* Tries to convert a FacebookResponse entity into a GraphEdge.
|
184 |
+
*
|
185 |
+
* @param string|null $subclassName The GraphNode sub class to cast the list items to.
|
186 |
+
* @param boolean $auto_prefix Toggle to auto-prefix the subclass name.
|
187 |
+
*
|
188 |
+
* @return GraphEdge
|
189 |
+
*
|
190 |
+
* @throws FacebookSDKException
|
191 |
+
*/
|
192 |
+
public function makeGraphEdge($subclassName = null, $auto_prefix = true)
|
193 |
+
{
|
194 |
+
$this->validateResponseAsArray();
|
195 |
+
$this->validateResponseCastableAsGraphEdge();
|
196 |
+
|
197 |
+
if ($subclassName && $auto_prefix) {
|
198 |
+
$subclassName = static::BASE_GRAPH_OBJECT_PREFIX . $subclassName;
|
199 |
+
}
|
200 |
+
|
201 |
+
return $this->castAsGraphNodeOrGraphEdge($this->decodedBody, $subclassName);
|
202 |
+
}
|
203 |
+
|
204 |
+
/**
|
205 |
+
* Validates the decoded body.
|
206 |
+
*
|
207 |
+
* @throws FacebookSDKException
|
208 |
+
*/
|
209 |
+
public function validateResponseAsArray()
|
210 |
+
{
|
211 |
+
if (!is_array($this->decodedBody)) {
|
212 |
+
throw new FacebookSDKException('Unable to get response from Graph as array.', 620);
|
213 |
+
}
|
214 |
+
}
|
215 |
+
|
216 |
+
/**
|
217 |
+
* Validates that the return data can be cast as a GraphNode.
|
218 |
+
*
|
219 |
+
* @throws FacebookSDKException
|
220 |
+
*/
|
221 |
+
public function validateResponseCastableAsGraphNode()
|
222 |
+
{
|
223 |
+
if (isset($this->decodedBody['data']) && static::isCastableAsGraphEdge($this->decodedBody['data'])) {
|
224 |
+
throw new FacebookSDKException(
|
225 |
+
'Unable to convert response from Graph to a GraphNode because the response looks like a GraphEdge. Try using GraphNodeFactory::makeGraphEdge() instead.',
|
226 |
+
620
|
227 |
+
);
|
228 |
+
}
|
229 |
+
}
|
230 |
+
|
231 |
+
/**
|
232 |
+
* Validates that the return data can be cast as a GraphEdge.
|
233 |
+
*
|
234 |
+
* @throws FacebookSDKException
|
235 |
+
*/
|
236 |
+
public function validateResponseCastableAsGraphEdge()
|
237 |
+
{
|
238 |
+
if (!(isset($this->decodedBody['data']) && static::isCastableAsGraphEdge($this->decodedBody['data']))) {
|
239 |
+
throw new FacebookSDKException(
|
240 |
+
'Unable to convert response from Graph to a GraphEdge because the response does not look like a GraphEdge. Try using GraphNodeFactory::makeGraphNode() instead.',
|
241 |
+
620
|
242 |
+
);
|
243 |
+
}
|
244 |
+
}
|
245 |
+
|
246 |
+
/**
|
247 |
+
* Safely instantiates a GraphNode of $subclassName.
|
248 |
+
*
|
249 |
+
* @param array $data The array of data to iterate over.
|
250 |
+
* @param string|null $subclassName The subclass to cast this collection to.
|
251 |
+
*
|
252 |
+
* @return GraphNode
|
253 |
+
*
|
254 |
+
* @throws FacebookSDKException
|
255 |
+
*/
|
256 |
+
public function safelyMakeGraphNode(array $data, $subclassName = null)
|
257 |
+
{
|
258 |
+
$subclassName = $subclassName ?: static::BASE_GRAPH_NODE_CLASS;
|
259 |
+
static::validateSubclass($subclassName);
|
260 |
+
|
261 |
+
// Remember the parent node ID
|
262 |
+
$parentNodeId = isset($data['id']) ? $data['id'] : null;
|
263 |
+
|
264 |
+
$items = [];
|
265 |
+
|
266 |
+
foreach ($data as $k => $v) {
|
267 |
+
// Array means could be recurable
|
268 |
+
if (is_array($v)) {
|
269 |
+
// Detect any smart-casting from the $graphObjectMap array.
|
270 |
+
// This is always empty on the GraphNode collection, but subclasses can define
|
271 |
+
// their own array of smart-casting types.
|
272 |
+
$graphObjectMap = $subclassName::getObjectMap();
|
273 |
+
$objectSubClass = isset($graphObjectMap[$k])
|
274 |
+
? $graphObjectMap[$k]
|
275 |
+
: null;
|
276 |
+
|
277 |
+
// Could be a GraphEdge or GraphNode
|
278 |
+
$items[$k] = $this->castAsGraphNodeOrGraphEdge($v, $objectSubClass, $k, $parentNodeId);
|
279 |
+
} else {
|
280 |
+
$items[$k] = $v;
|
281 |
+
}
|
282 |
+
}
|
283 |
+
|
284 |
+
return new $subclassName($items);
|
285 |
+
}
|
286 |
+
|
287 |
+
/**
|
288 |
+
* Takes an array of values and determines how to cast each node.
|
289 |
+
*
|
290 |
+
* @param array $data The array of data to iterate over.
|
291 |
+
* @param string|null $subclassName The subclass to cast this collection to.
|
292 |
+
* @param string|null $parentKey The key of this data (Graph edge).
|
293 |
+
* @param string|null $parentNodeId The parent Graph node ID.
|
294 |
+
*
|
295 |
+
* @return GraphNode|GraphEdge
|
296 |
+
*
|
297 |
+
* @throws FacebookSDKException
|
298 |
+
*/
|
299 |
+
public function castAsGraphNodeOrGraphEdge(array $data, $subclassName = null, $parentKey = null, $parentNodeId = null)
|
300 |
+
{
|
301 |
+
if (isset($data['data'])) {
|
302 |
+
// Create GraphEdge
|
303 |
+
if (static::isCastableAsGraphEdge($data['data'])) {
|
304 |
+
return $this->safelyMakeGraphEdge($data, $subclassName, $parentKey, $parentNodeId);
|
305 |
+
}
|
306 |
+
// Sometimes Graph is a weirdo and returns a GraphNode under the "data" key
|
307 |
+
$data = $data['data'];
|
308 |
+
}
|
309 |
+
|
310 |
+
// Create GraphNode
|
311 |
+
return $this->safelyMakeGraphNode($data, $subclassName);
|
312 |
+
}
|
313 |
+
|
314 |
+
/**
|
315 |
+
* Return an array of GraphNode's.
|
316 |
+
*
|
317 |
+
* @param array $data The array of data to iterate over.
|
318 |
+
* @param string|null $subclassName The GraphNode subclass to cast each item in the list to.
|
319 |
+
* @param string|null $parentKey The key of this data (Graph edge).
|
320 |
+
* @param string|null $parentNodeId The parent Graph node ID.
|
321 |
+
*
|
322 |
+
* @return GraphEdge
|
323 |
+
*
|
324 |
+
* @throws FacebookSDKException
|
325 |
+
*/
|
326 |
+
public function safelyMakeGraphEdge(array $data, $subclassName = null, $parentKey = null, $parentNodeId = null)
|
327 |
+
{
|
328 |
+
if (!isset($data['data'])) {
|
329 |
+
throw new FacebookSDKException('Cannot cast data to GraphEdge. Expected a "data" key.', 620);
|
330 |
+
}
|
331 |
+
|
332 |
+
$dataList = [];
|
333 |
+
foreach ($data['data'] as $graphNode) {
|
334 |
+
$dataList[] = $this->safelyMakeGraphNode($graphNode, $subclassName);
|
335 |
+
}
|
336 |
+
|
337 |
+
$metaData = $this->getMetaData($data);
|
338 |
+
|
339 |
+
// We'll need to make an edge endpoint for this in case it's a GraphEdge (for cursor pagination)
|
340 |
+
$parentGraphEdgeEndpoint = $parentNodeId && $parentKey ? '/' . $parentNodeId . '/' . $parentKey : null;
|
341 |
+
$className = static::BASE_GRAPH_EDGE_CLASS;
|
342 |
+
|
343 |
+
return new $className($this->response->getRequest(), $dataList, $metaData, $parentGraphEdgeEndpoint, $subclassName);
|
344 |
+
}
|
345 |
+
|
346 |
+
/**
|
347 |
+
* Get the meta data from a list in a Graph response.
|
348 |
+
*
|
349 |
+
* @param array $data The Graph response.
|
350 |
+
*
|
351 |
+
* @return array
|
352 |
+
*/
|
353 |
+
public function getMetaData(array $data)
|
354 |
+
{
|
355 |
+
unset($data['data']);
|
356 |
+
|
357 |
+
return $data;
|
358 |
+
}
|
359 |
+
|
360 |
+
/**
|
361 |
+
* Determines whether or not the data should be cast as a GraphEdge.
|
362 |
+
*
|
363 |
+
* @param array $data
|
364 |
+
*
|
365 |
+
* @return boolean
|
366 |
+
*/
|
367 |
+
public static function isCastableAsGraphEdge(array $data)
|
368 |
+
{
|
369 |
+
if ($data === []) {
|
370 |
+
return true;
|
371 |
+
}
|
372 |
+
|
373 |
+
// Checks for a sequential numeric array which would be a GraphEdge
|
374 |
+
return array_keys($data) === range(0, count($data) - 1);
|
375 |
+
}
|
376 |
+
|
377 |
+
/**
|
378 |
+
* Ensures that the subclass in question is valid.
|
379 |
+
*
|
380 |
+
* @param string $subclassName The GraphNode subclass to validate.
|
381 |
+
*
|
382 |
+
* @throws FacebookSDKException
|
383 |
+
*/
|
384 |
+
public static function validateSubclass($subclassName)
|
385 |
+
{
|
386 |
+
if ($subclassName == static::BASE_GRAPH_NODE_CLASS || is_subclass_of($subclassName, static::BASE_GRAPH_NODE_CLASS)) {
|
387 |
+
return;
|
388 |
+
}
|
389 |
+
|
390 |
+
throw new FacebookSDKException('The given subclass "' . $subclassName . '" is not valid. Cannot cast to an object that is not a GraphNode subclass.', 620);
|
391 |
+
}
|
392 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphObject.php
ADDED
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\GraphNodes;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class GraphObject
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*
|
31 |
+
* @deprecated 5.0.0 GraphObject has been renamed to GraphNode
|
32 |
+
* @todo v6: Remove this class
|
33 |
+
*/
|
34 |
+
class GraphObject extends GraphNode
|
35 |
+
{
|
36 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphObjectFactory.php
ADDED
@@ -0,0 +1,88 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\GraphNodes;
|
25 |
+
|
26 |
+
use Facebook\Exceptions\FacebookSDKException;
|
27 |
+
|
28 |
+
/**
|
29 |
+
* Class GraphObjectFactory
|
30 |
+
*
|
31 |
+
* @package Facebook
|
32 |
+
*
|
33 |
+
* @deprecated 5.0.0 GraphObjectFactory has been renamed to GraphNodeFactory
|
34 |
+
* @todo v6: Remove this class
|
35 |
+
*/
|
36 |
+
class GraphObjectFactory extends GraphNodeFactory
|
37 |
+
{
|
38 |
+
/**
|
39 |
+
* @const string The base graph object class.
|
40 |
+
*/
|
41 |
+
const BASE_GRAPH_NODE_CLASS = '\Facebook\GraphNodes\GraphObject';
|
42 |
+
|
43 |
+
/**
|
44 |
+
* @const string The base graph edge class.
|
45 |
+
*/
|
46 |
+
const BASE_GRAPH_EDGE_CLASS = '\Facebook\GraphNodes\GraphList';
|
47 |
+
|
48 |
+
/**
|
49 |
+
* Tries to convert a FacebookResponse entity into a GraphNode.
|
50 |
+
*
|
51 |
+
* @param string|null $subclassName The GraphNode sub class to cast to.
|
52 |
+
*
|
53 |
+
* @return GraphNode
|
54 |
+
*
|
55 |
+
* @deprecated 5.0.0 GraphObjectFactory has been renamed to GraphNodeFactory
|
56 |
+
*/
|
57 |
+
public function makeGraphObject($subclassName = null)
|
58 |
+
{
|
59 |
+
return $this->makeGraphNode($subclassName);
|
60 |
+
}
|
61 |
+
|
62 |
+
/**
|
63 |
+
* Convenience method for creating a GraphEvent collection.
|
64 |
+
*
|
65 |
+
* @return GraphEvent
|
66 |
+
*
|
67 |
+
* @throws FacebookSDKException
|
68 |
+
*/
|
69 |
+
public function makeGraphEvent()
|
70 |
+
{
|
71 |
+
return $this->makeGraphNode(static::BASE_GRAPH_OBJECT_PREFIX . 'GraphEvent');
|
72 |
+
}
|
73 |
+
|
74 |
+
/**
|
75 |
+
* Tries to convert a FacebookResponse entity into a GraphEdge.
|
76 |
+
*
|
77 |
+
* @param string|null $subclassName The GraphNode sub class to cast the list items to.
|
78 |
+
* @param boolean $auto_prefix Toggle to auto-prefix the subclass name.
|
79 |
+
*
|
80 |
+
* @return GraphEdge
|
81 |
+
*
|
82 |
+
* @deprecated 5.0.0 GraphObjectFactory has been renamed to GraphNodeFactory
|
83 |
+
*/
|
84 |
+
public function makeGraphList($subclassName = null, $auto_prefix = true)
|
85 |
+
{
|
86 |
+
return $this->makeGraphEdge($subclassName, $auto_prefix);
|
87 |
+
}
|
88 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphPage.php
ADDED
@@ -0,0 +1,147 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\GraphNodes;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class GraphPage
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
class GraphPage extends GraphNode
|
32 |
+
{
|
33 |
+
/**
|
34 |
+
* @var array Maps object key names to Graph object types.
|
35 |
+
*/
|
36 |
+
protected static $graphObjectMap = [
|
37 |
+
'best_page' => '\Facebook\GraphNodes\GraphPage',
|
38 |
+
'global_brand_parent_page' => '\Facebook\GraphNodes\GraphPage',
|
39 |
+
'location' => '\Facebook\GraphNodes\GraphLocation',
|
40 |
+
'cover' => '\Facebook\GraphNodes\GraphCoverPhoto',
|
41 |
+
'picture' => '\Facebook\GraphNodes\GraphPicture',
|
42 |
+
];
|
43 |
+
|
44 |
+
/**
|
45 |
+
* Returns the ID for the user's page as a string if present.
|
46 |
+
*
|
47 |
+
* @return string|null
|
48 |
+
*/
|
49 |
+
public function getId()
|
50 |
+
{
|
51 |
+
return $this->getField('id');
|
52 |
+
}
|
53 |
+
|
54 |
+
/**
|
55 |
+
* Returns the Category for the user's page as a string if present.
|
56 |
+
*
|
57 |
+
* @return string|null
|
58 |
+
*/
|
59 |
+
public function getCategory()
|
60 |
+
{
|
61 |
+
return $this->getField('category');
|
62 |
+
}
|
63 |
+
|
64 |
+
/**
|
65 |
+
* Returns the Name of the user's page as a string if present.
|
66 |
+
*
|
67 |
+
* @return string|null
|
68 |
+
*/
|
69 |
+
public function getName()
|
70 |
+
{
|
71 |
+
return $this->getField('name');
|
72 |
+
}
|
73 |
+
|
74 |
+
/**
|
75 |
+
* Returns the best available Page on Facebook.
|
76 |
+
*
|
77 |
+
* @return GraphPage|null
|
78 |
+
*/
|
79 |
+
public function getBestPage()
|
80 |
+
{
|
81 |
+
return $this->getField('best_page');
|
82 |
+
}
|
83 |
+
|
84 |
+
/**
|
85 |
+
* Returns the brand's global (parent) Page.
|
86 |
+
*
|
87 |
+
* @return GraphPage|null
|
88 |
+
*/
|
89 |
+
public function getGlobalBrandParentPage()
|
90 |
+
{
|
91 |
+
return $this->getField('global_brand_parent_page');
|
92 |
+
}
|
93 |
+
|
94 |
+
/**
|
95 |
+
* Returns the location of this place.
|
96 |
+
*
|
97 |
+
* @return GraphLocation|null
|
98 |
+
*/
|
99 |
+
public function getLocation()
|
100 |
+
{
|
101 |
+
return $this->getField('location');
|
102 |
+
}
|
103 |
+
|
104 |
+
/**
|
105 |
+
* Returns CoverPhoto of the Page.
|
106 |
+
*
|
107 |
+
* @return GraphCoverPhoto|null
|
108 |
+
*/
|
109 |
+
public function getCover()
|
110 |
+
{
|
111 |
+
return $this->getField('cover');
|
112 |
+
}
|
113 |
+
|
114 |
+
/**
|
115 |
+
* Returns Picture of the Page.
|
116 |
+
*
|
117 |
+
* @return GraphPicture|null
|
118 |
+
*/
|
119 |
+
public function getPicture()
|
120 |
+
{
|
121 |
+
return $this->getField('picture');
|
122 |
+
}
|
123 |
+
|
124 |
+
/**
|
125 |
+
* Returns the page access token for the admin user.
|
126 |
+
*
|
127 |
+
* Only available in the `/me/accounts` context.
|
128 |
+
*
|
129 |
+
* @return string|null
|
130 |
+
*/
|
131 |
+
public function getAccessToken()
|
132 |
+
{
|
133 |
+
return $this->getField('access_token');
|
134 |
+
}
|
135 |
+
|
136 |
+
/**
|
137 |
+
* Returns the roles of the page admin user.
|
138 |
+
*
|
139 |
+
* Only available in the `/me/accounts` context.
|
140 |
+
*
|
141 |
+
* @return array|null
|
142 |
+
*/
|
143 |
+
public function getPerms()
|
144 |
+
{
|
145 |
+
return $this->getField('perms');
|
146 |
+
}
|
147 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphPicture.php
ADDED
@@ -0,0 +1,72 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\GraphNodes;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class GraphPicture
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
class GraphPicture extends GraphNode
|
32 |
+
{
|
33 |
+
/**
|
34 |
+
* Returns true if user picture is silhouette.
|
35 |
+
*
|
36 |
+
* @return bool|null
|
37 |
+
*/
|
38 |
+
public function isSilhouette()
|
39 |
+
{
|
40 |
+
return $this->getField('is_silhouette');
|
41 |
+
}
|
42 |
+
|
43 |
+
/**
|
44 |
+
* Returns the url of user picture if it exists
|
45 |
+
*
|
46 |
+
* @return string|null
|
47 |
+
*/
|
48 |
+
public function getUrl()
|
49 |
+
{
|
50 |
+
return $this->getField('url');
|
51 |
+
}
|
52 |
+
|
53 |
+
/**
|
54 |
+
* Returns the width of user picture if it exists
|
55 |
+
*
|
56 |
+
* @return int|null
|
57 |
+
*/
|
58 |
+
public function getWidth()
|
59 |
+
{
|
60 |
+
return $this->getField('width');
|
61 |
+
}
|
62 |
+
|
63 |
+
/**
|
64 |
+
* Returns the height of user picture if it exists
|
65 |
+
*
|
66 |
+
* @return int|null
|
67 |
+
*/
|
68 |
+
public function getHeight()
|
69 |
+
{
|
70 |
+
return $this->getField('height');
|
71 |
+
}
|
72 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphSessionInfo.php
ADDED
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\GraphNodes;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class GraphSessionInfo
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
class GraphSessionInfo extends GraphNode
|
32 |
+
{
|
33 |
+
/**
|
34 |
+
* Returns the application id the token was issued for.
|
35 |
+
*
|
36 |
+
* @return string|null
|
37 |
+
*/
|
38 |
+
public function getAppId()
|
39 |
+
{
|
40 |
+
return $this->getField('app_id');
|
41 |
+
}
|
42 |
+
|
43 |
+
/**
|
44 |
+
* Returns the application name the token was issued for.
|
45 |
+
*
|
46 |
+
* @return string|null
|
47 |
+
*/
|
48 |
+
public function getApplication()
|
49 |
+
{
|
50 |
+
return $this->getField('application');
|
51 |
+
}
|
52 |
+
|
53 |
+
/**
|
54 |
+
* Returns the date & time that the token expires.
|
55 |
+
*
|
56 |
+
* @return \DateTime|null
|
57 |
+
*/
|
58 |
+
public function getExpiresAt()
|
59 |
+
{
|
60 |
+
return $this->getField('expires_at');
|
61 |
+
}
|
62 |
+
|
63 |
+
/**
|
64 |
+
* Returns whether the token is valid.
|
65 |
+
*
|
66 |
+
* @return boolean
|
67 |
+
*/
|
68 |
+
public function getIsValid()
|
69 |
+
{
|
70 |
+
return $this->getField('is_valid');
|
71 |
+
}
|
72 |
+
|
73 |
+
/**
|
74 |
+
* Returns the date & time the token was issued at.
|
75 |
+
*
|
76 |
+
* @return \DateTime|null
|
77 |
+
*/
|
78 |
+
public function getIssuedAt()
|
79 |
+
{
|
80 |
+
return $this->getField('issued_at');
|
81 |
+
}
|
82 |
+
|
83 |
+
/**
|
84 |
+
* Returns the scope permissions associated with the token.
|
85 |
+
*
|
86 |
+
* @return array
|
87 |
+
*/
|
88 |
+
public function getScopes()
|
89 |
+
{
|
90 |
+
return $this->getField('scopes');
|
91 |
+
}
|
92 |
+
|
93 |
+
/**
|
94 |
+
* Returns the login id of the user associated with the token.
|
95 |
+
*
|
96 |
+
* @return string|null
|
97 |
+
*/
|
98 |
+
public function getUserId()
|
99 |
+
{
|
100 |
+
return $this->getField('user_id');
|
101 |
+
}
|
102 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/GraphNodes/GraphUser.php
ADDED
@@ -0,0 +1,172 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\GraphNodes;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class GraphUser
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
class GraphUser extends GraphNode
|
32 |
+
{
|
33 |
+
/**
|
34 |
+
* @var array Maps object key names to Graph object types.
|
35 |
+
*/
|
36 |
+
protected static $graphObjectMap = [
|
37 |
+
'hometown' => '\Facebook\GraphNodes\GraphPage',
|
38 |
+
'location' => '\Facebook\GraphNodes\GraphPage',
|
39 |
+
'significant_other' => '\Facebook\GraphNodes\GraphUser',
|
40 |
+
'picture' => '\Facebook\GraphNodes\GraphPicture',
|
41 |
+
];
|
42 |
+
|
43 |
+
/**
|
44 |
+
* Returns the ID for the user as a string if present.
|
45 |
+
*
|
46 |
+
* @return string|null
|
47 |
+
*/
|
48 |
+
public function getId()
|
49 |
+
{
|
50 |
+
return $this->getField('id');
|
51 |
+
}
|
52 |
+
|
53 |
+
/**
|
54 |
+
* Returns the name for the user as a string if present.
|
55 |
+
*
|
56 |
+
* @return string|null
|
57 |
+
*/
|
58 |
+
public function getName()
|
59 |
+
{
|
60 |
+
return $this->getField('name');
|
61 |
+
}
|
62 |
+
|
63 |
+
/**
|
64 |
+
* Returns the first name for the user as a string if present.
|
65 |
+
*
|
66 |
+
* @return string|null
|
67 |
+
*/
|
68 |
+
public function getFirstName()
|
69 |
+
{
|
70 |
+
return $this->getField('first_name');
|
71 |
+
}
|
72 |
+
|
73 |
+
/**
|
74 |
+
* Returns the middle name for the user as a string if present.
|
75 |
+
*
|
76 |
+
* @return string|null
|
77 |
+
*/
|
78 |
+
public function getMiddleName()
|
79 |
+
{
|
80 |
+
return $this->getField('middle_name');
|
81 |
+
}
|
82 |
+
|
83 |
+
/**
|
84 |
+
* Returns the last name for the user as a string if present.
|
85 |
+
*
|
86 |
+
* @return string|null
|
87 |
+
*/
|
88 |
+
public function getLastName()
|
89 |
+
{
|
90 |
+
return $this->getField('last_name');
|
91 |
+
}
|
92 |
+
|
93 |
+
/**
|
94 |
+
* Returns the email for the user as a string if present.
|
95 |
+
*
|
96 |
+
* @return string|null
|
97 |
+
*/
|
98 |
+
public function getEmail()
|
99 |
+
{
|
100 |
+
return $this->getField('email');
|
101 |
+
}
|
102 |
+
|
103 |
+
/**
|
104 |
+
* Returns the gender for the user as a string if present.
|
105 |
+
*
|
106 |
+
* @return string|null
|
107 |
+
*/
|
108 |
+
public function getGender()
|
109 |
+
{
|
110 |
+
return $this->getField('gender');
|
111 |
+
}
|
112 |
+
|
113 |
+
/**
|
114 |
+
* Returns the Facebook URL for the user as a string if available.
|
115 |
+
*
|
116 |
+
* @return string|null
|
117 |
+
*/
|
118 |
+
public function getLink()
|
119 |
+
{
|
120 |
+
return $this->getField('link');
|
121 |
+
}
|
122 |
+
|
123 |
+
/**
|
124 |
+
* Returns the users birthday, if available.
|
125 |
+
*
|
126 |
+
* @return \DateTime|null
|
127 |
+
*/
|
128 |
+
public function getBirthday()
|
129 |
+
{
|
130 |
+
return $this->getField('birthday');
|
131 |
+
}
|
132 |
+
|
133 |
+
/**
|
134 |
+
* Returns the current location of the user as a GraphPage.
|
135 |
+
*
|
136 |
+
* @return GraphPage|null
|
137 |
+
*/
|
138 |
+
public function getLocation()
|
139 |
+
{
|
140 |
+
return $this->getField('location');
|
141 |
+
}
|
142 |
+
|
143 |
+
/**
|
144 |
+
* Returns the current location of the user as a GraphPage.
|
145 |
+
*
|
146 |
+
* @return GraphPage|null
|
147 |
+
*/
|
148 |
+
public function getHometown()
|
149 |
+
{
|
150 |
+
return $this->getField('hometown');
|
151 |
+
}
|
152 |
+
|
153 |
+
/**
|
154 |
+
* Returns the current location of the user as a GraphUser.
|
155 |
+
*
|
156 |
+
* @return GraphUser|null
|
157 |
+
*/
|
158 |
+
public function getSignificantOther()
|
159 |
+
{
|
160 |
+
return $this->getField('significant_other');
|
161 |
+
}
|
162 |
+
|
163 |
+
/**
|
164 |
+
* Returns the picture of the user as a GraphPicture
|
165 |
+
*
|
166 |
+
* @return GraphPicture|null
|
167 |
+
*/
|
168 |
+
public function getPicture()
|
169 |
+
{
|
170 |
+
return $this->getField('picture');
|
171 |
+
}
|
172 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/Helpers/FacebookCanvasHelper.php
ADDED
@@ -0,0 +1,52 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\Helpers;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class FacebookCanvasLoginHelper
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
class FacebookCanvasHelper extends FacebookSignedRequestFromInputHelper
|
32 |
+
{
|
33 |
+
/**
|
34 |
+
* Returns the app data value.
|
35 |
+
*
|
36 |
+
* @return mixed|null
|
37 |
+
*/
|
38 |
+
public function getAppData()
|
39 |
+
{
|
40 |
+
return $this->signedRequest ? $this->signedRequest->get('app_data') : null;
|
41 |
+
}
|
42 |
+
|
43 |
+
/**
|
44 |
+
* Get raw signed request from POST.
|
45 |
+
*
|
46 |
+
* @return string|null
|
47 |
+
*/
|
48 |
+
public function getRawSignedRequest()
|
49 |
+
{
|
50 |
+
return $this->getRawSignedRequestFromPost() ?: null;
|
51 |
+
}
|
52 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/Helpers/FacebookJavaScriptHelper.php
ADDED
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\Helpers;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class FacebookJavaScriptLoginHelper
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
class FacebookJavaScriptHelper extends FacebookSignedRequestFromInputHelper
|
32 |
+
{
|
33 |
+
/**
|
34 |
+
* Get raw signed request from the cookie.
|
35 |
+
*
|
36 |
+
* @return string|null
|
37 |
+
*/
|
38 |
+
public function getRawSignedRequest()
|
39 |
+
{
|
40 |
+
return $this->getRawSignedRequestFromCookie();
|
41 |
+
}
|
42 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/Helpers/FacebookPageTabHelper.php
ADDED
@@ -0,0 +1,95 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\Helpers;
|
25 |
+
|
26 |
+
use Facebook\FacebookApp;
|
27 |
+
use Facebook\FacebookClient;
|
28 |
+
|
29 |
+
/**
|
30 |
+
* Class FacebookPageTabHelper
|
31 |
+
*
|
32 |
+
* @package Facebook
|
33 |
+
*/
|
34 |
+
class FacebookPageTabHelper extends FacebookCanvasHelper
|
35 |
+
{
|
36 |
+
/**
|
37 |
+
* @var array|null
|
38 |
+
*/
|
39 |
+
protected $pageData;
|
40 |
+
|
41 |
+
/**
|
42 |
+
* Initialize the helper and process available signed request data.
|
43 |
+
*
|
44 |
+
* @param FacebookApp $app The FacebookApp entity.
|
45 |
+
* @param FacebookClient $client The client to make HTTP requests.
|
46 |
+
* @param string|null $graphVersion The version of Graph to use.
|
47 |
+
*/
|
48 |
+
public function __construct(FacebookApp $app, FacebookClient $client, $graphVersion = null)
|
49 |
+
{
|
50 |
+
parent::__construct($app, $client, $graphVersion);
|
51 |
+
|
52 |
+
if (!$this->signedRequest) {
|
53 |
+
return;
|
54 |
+
}
|
55 |
+
|
56 |
+
$this->pageData = $this->signedRequest->get('page');
|
57 |
+
}
|
58 |
+
|
59 |
+
/**
|
60 |
+
* Returns a value from the page data.
|
61 |
+
*
|
62 |
+
* @param string $key
|
63 |
+
* @param mixed|null $default
|
64 |
+
*
|
65 |
+
* @return mixed|null
|
66 |
+
*/
|
67 |
+
public function getPageData($key, $default = null)
|
68 |
+
{
|
69 |
+
if (isset($this->pageData[$key])) {
|
70 |
+
return $this->pageData[$key];
|
71 |
+
}
|
72 |
+
|
73 |
+
return $default;
|
74 |
+
}
|
75 |
+
|
76 |
+
/**
|
77 |
+
* Returns true if the user is an admin.
|
78 |
+
*
|
79 |
+
* @return boolean
|
80 |
+
*/
|
81 |
+
public function isAdmin()
|
82 |
+
{
|
83 |
+
return $this->getPageData('admin') === true;
|
84 |
+
}
|
85 |
+
|
86 |
+
/**
|
87 |
+
* Returns the page id if available.
|
88 |
+
*
|
89 |
+
* @return string|null
|
90 |
+
*/
|
91 |
+
public function getPageId()
|
92 |
+
{
|
93 |
+
return $this->getPageData('id');
|
94 |
+
}
|
95 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/Helpers/FacebookRedirectLoginHelper.php
ADDED
@@ -0,0 +1,333 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\Helpers;
|
25 |
+
|
26 |
+
use Facebook\Authentication\AccessToken;
|
27 |
+
use Facebook\Authentication\OAuth2Client;
|
28 |
+
use Facebook\Exceptions\FacebookSDKException;
|
29 |
+
use Facebook\PersistentData\FacebookSessionPersistentDataHandler;
|
30 |
+
use Facebook\PersistentData\PersistentDataInterface;
|
31 |
+
use Facebook\PseudoRandomString\PseudoRandomStringGeneratorFactory;
|
32 |
+
use Facebook\PseudoRandomString\PseudoRandomStringGeneratorInterface;
|
33 |
+
use Facebook\Url\FacebookUrlDetectionHandler;
|
34 |
+
use Facebook\Url\FacebookUrlManipulator;
|
35 |
+
use Facebook\Url\UrlDetectionInterface;
|
36 |
+
|
37 |
+
/**
|
38 |
+
* Class FacebookRedirectLoginHelper
|
39 |
+
*
|
40 |
+
* @package Facebook
|
41 |
+
*/
|
42 |
+
class FacebookRedirectLoginHelper
|
43 |
+
{
|
44 |
+
/**
|
45 |
+
* @const int The length of CSRF string to validate the login link.
|
46 |
+
*/
|
47 |
+
const CSRF_LENGTH = 32;
|
48 |
+
|
49 |
+
/**
|
50 |
+
* @var OAuth2Client The OAuth 2.0 client service.
|
51 |
+
*/
|
52 |
+
protected $oAuth2Client;
|
53 |
+
|
54 |
+
/**
|
55 |
+
* @var UrlDetectionInterface The URL detection handler.
|
56 |
+
*/
|
57 |
+
protected $urlDetectionHandler;
|
58 |
+
|
59 |
+
/**
|
60 |
+
* @var PersistentDataInterface The persistent data handler.
|
61 |
+
*/
|
62 |
+
protected $persistentDataHandler;
|
63 |
+
|
64 |
+
/**
|
65 |
+
* @var PseudoRandomStringGeneratorInterface The cryptographically secure pseudo-random string generator.
|
66 |
+
*/
|
67 |
+
protected $pseudoRandomStringGenerator;
|
68 |
+
|
69 |
+
/**
|
70 |
+
* @param OAuth2Client $oAuth2Client The OAuth 2.0 client service.
|
71 |
+
* @param PersistentDataInterface|null $persistentDataHandler The persistent data handler.
|
72 |
+
* @param UrlDetectionInterface|null $urlHandler The URL detection handler.
|
73 |
+
* @param PseudoRandomStringGeneratorInterface|null $prsg The cryptographically secure pseudo-random string generator.
|
74 |
+
*/
|
75 |
+
public function __construct(OAuth2Client $oAuth2Client, PersistentDataInterface $persistentDataHandler = null, UrlDetectionInterface $urlHandler = null, PseudoRandomStringGeneratorInterface $prsg = null)
|
76 |
+
{
|
77 |
+
$this->oAuth2Client = $oAuth2Client;
|
78 |
+
$this->persistentDataHandler = $persistentDataHandler ?: new FacebookSessionPersistentDataHandler();
|
79 |
+
$this->urlDetectionHandler = $urlHandler ?: new FacebookUrlDetectionHandler();
|
80 |
+
$this->pseudoRandomStringGenerator = PseudoRandomStringGeneratorFactory::createPseudoRandomStringGenerator($prsg);
|
81 |
+
}
|
82 |
+
|
83 |
+
/**
|
84 |
+
* Returns the persistent data handler.
|
85 |
+
*
|
86 |
+
* @return PersistentDataInterface
|
87 |
+
*/
|
88 |
+
public function getPersistentDataHandler()
|
89 |
+
{
|
90 |
+
return $this->persistentDataHandler;
|
91 |
+
}
|
92 |
+
|
93 |
+
/**
|
94 |
+
* Returns the URL detection handler.
|
95 |
+
*
|
96 |
+
* @return UrlDetectionInterface
|
97 |
+
*/
|
98 |
+
public function getUrlDetectionHandler()
|
99 |
+
{
|
100 |
+
return $this->urlDetectionHandler;
|
101 |
+
}
|
102 |
+
|
103 |
+
/**
|
104 |
+
* Returns the cryptographically secure pseudo-random string generator.
|
105 |
+
*
|
106 |
+
* @return PseudoRandomStringGeneratorInterface
|
107 |
+
*/
|
108 |
+
public function getPseudoRandomStringGenerator()
|
109 |
+
{
|
110 |
+
return $this->pseudoRandomStringGenerator;
|
111 |
+
}
|
112 |
+
|
113 |
+
/**
|
114 |
+
* Stores CSRF state and returns a URL to which the user should be sent to in order to continue the login process with Facebook.
|
115 |
+
*
|
116 |
+
* @param string $redirectUrl The URL Facebook should redirect users to after login.
|
117 |
+
* @param array $scope List of permissions to request during login.
|
118 |
+
* @param array $params An array of parameters to generate URL.
|
119 |
+
* @param string $separator The separator to use in http_build_query().
|
120 |
+
*
|
121 |
+
* @return string
|
122 |
+
*/
|
123 |
+
private function makeUrl($redirectUrl, array $scope, array $params = [], $separator = '&')
|
124 |
+
{
|
125 |
+
$state = $this->persistentDataHandler->get('state') ?: $this->pseudoRandomStringGenerator->getPseudoRandomString(static::CSRF_LENGTH);
|
126 |
+
$this->persistentDataHandler->set('state', $state);
|
127 |
+
|
128 |
+
return $this->oAuth2Client->getAuthorizationUrl($redirectUrl, $state, $scope, $params, $separator);
|
129 |
+
}
|
130 |
+
|
131 |
+
/**
|
132 |
+
* Returns the URL to send the user in order to login to Facebook.
|
133 |
+
*
|
134 |
+
* @param string $redirectUrl The URL Facebook should redirect users to after login.
|
135 |
+
* @param array $scope List of permissions to request during login.
|
136 |
+
* @param string $separator The separator to use in http_build_query().
|
137 |
+
*
|
138 |
+
* @return string
|
139 |
+
*/
|
140 |
+
public function getLoginUrl($redirectUrl, array $scope = [], $separator = '&')
|
141 |
+
{
|
142 |
+
return $this->makeUrl($redirectUrl, $scope, [], $separator);
|
143 |
+
}
|
144 |
+
|
145 |
+
/**
|
146 |
+
* Returns the URL to send the user in order to log out of Facebook.
|
147 |
+
*
|
148 |
+
* @param AccessToken|string $accessToken The access token that will be logged out.
|
149 |
+
* @param string $next The url Facebook should redirect the user to after a successful logout.
|
150 |
+
* @param string $separator The separator to use in http_build_query().
|
151 |
+
*
|
152 |
+
* @return string
|
153 |
+
*
|
154 |
+
* @throws FacebookSDKException
|
155 |
+
*/
|
156 |
+
public function getLogoutUrl($accessToken, $next, $separator = '&')
|
157 |
+
{
|
158 |
+
if (!$accessToken instanceof AccessToken) {
|
159 |
+
$accessToken = new AccessToken($accessToken);
|
160 |
+
}
|
161 |
+
|
162 |
+
if ($accessToken->isAppAccessToken()) {
|
163 |
+
throw new FacebookSDKException('Cannot generate a logout URL with an app access token.', 722);
|
164 |
+
}
|
165 |
+
|
166 |
+
$params = [
|
167 |
+
'next' => $next,
|
168 |
+
'access_token' => $accessToken->getValue(),
|
169 |
+
];
|
170 |
+
|
171 |
+
return 'https://www.facebook.com/logout.php?' . http_build_query($params, null, $separator);
|
172 |
+
}
|
173 |
+
|
174 |
+
/**
|
175 |
+
* Returns the URL to send the user in order to login to Facebook with permission(s) to be re-asked.
|
176 |
+
*
|
177 |
+
* @param string $redirectUrl The URL Facebook should redirect users to after login.
|
178 |
+
* @param array $scope List of permissions to request during login.
|
179 |
+
* @param string $separator The separator to use in http_build_query().
|
180 |
+
*
|
181 |
+
* @return string
|
182 |
+
*/
|
183 |
+
public function getReRequestUrl($redirectUrl, array $scope = [], $separator = '&')
|
184 |
+
{
|
185 |
+
$params = ['auth_type' => 'rerequest'];
|
186 |
+
|
187 |
+
return $this->makeUrl($redirectUrl, $scope, $params, $separator);
|
188 |
+
}
|
189 |
+
|
190 |
+
/**
|
191 |
+
* Returns the URL to send the user in order to login to Facebook with user to be re-authenticated.
|
192 |
+
*
|
193 |
+
* @param string $redirectUrl The URL Facebook should redirect users to after login.
|
194 |
+
* @param array $scope List of permissions to request during login.
|
195 |
+
* @param string $separator The separator to use in http_build_query().
|
196 |
+
*
|
197 |
+
* @return string
|
198 |
+
*/
|
199 |
+
public function getReAuthenticationUrl($redirectUrl, array $scope = [], $separator = '&')
|
200 |
+
{
|
201 |
+
$params = ['auth_type' => 'reauthenticate'];
|
202 |
+
|
203 |
+
return $this->makeUrl($redirectUrl, $scope, $params, $separator);
|
204 |
+
}
|
205 |
+
|
206 |
+
/**
|
207 |
+
* Takes a valid code from a login redirect, and returns an AccessToken entity.
|
208 |
+
*
|
209 |
+
* @param string|null $redirectUrl The redirect URL.
|
210 |
+
*
|
211 |
+
* @return AccessToken|null
|
212 |
+
*
|
213 |
+
* @throws FacebookSDKException
|
214 |
+
*/
|
215 |
+
public function getAccessToken($redirectUrl = null)
|
216 |
+
{
|
217 |
+
if (!$code = $this->getCode()) {
|
218 |
+
return null;
|
219 |
+
}
|
220 |
+
|
221 |
+
$this->validateCsrf();
|
222 |
+
$this->resetCsrf();
|
223 |
+
|
224 |
+
$redirectUrl = $redirectUrl ?: $this->urlDetectionHandler->getCurrentUrl();
|
225 |
+
// At minimum we need to remove the state param
|
226 |
+
$redirectUrl = FacebookUrlManipulator::removeParamsFromUrl($redirectUrl, ['state']);
|
227 |
+
|
228 |
+
return $this->oAuth2Client->getAccessTokenFromCode($code, $redirectUrl);
|
229 |
+
}
|
230 |
+
|
231 |
+
/**
|
232 |
+
* Validate the request against a cross-site request forgery.
|
233 |
+
*
|
234 |
+
* @throws FacebookSDKException
|
235 |
+
*/
|
236 |
+
protected function validateCsrf()
|
237 |
+
{
|
238 |
+
$state = $this->getState();
|
239 |
+
if (!$state) {
|
240 |
+
throw new FacebookSDKException('Cross-site request forgery validation failed. Required GET param "state" missing.');
|
241 |
+
}
|
242 |
+
$savedState = $this->persistentDataHandler->get('state');
|
243 |
+
if (!$savedState) {
|
244 |
+
throw new FacebookSDKException('Cross-site request forgery validation failed. Required param "state" missing from persistent data.');
|
245 |
+
}
|
246 |
+
|
247 |
+
if (\hash_equals($savedState, $state)) {
|
248 |
+
return;
|
249 |
+
}
|
250 |
+
|
251 |
+
throw new FacebookSDKException('Cross-site request forgery validation failed. The "state" param from the URL and session do not match.');
|
252 |
+
}
|
253 |
+
|
254 |
+
/**
|
255 |
+
* Resets the CSRF so that it doesn't get reused.
|
256 |
+
*/
|
257 |
+
private function resetCsrf()
|
258 |
+
{
|
259 |
+
$this->persistentDataHandler->set('state', null);
|
260 |
+
}
|
261 |
+
|
262 |
+
/**
|
263 |
+
* Return the code.
|
264 |
+
*
|
265 |
+
* @return string|null
|
266 |
+
*/
|
267 |
+
protected function getCode()
|
268 |
+
{
|
269 |
+
return $this->getInput('code');
|
270 |
+
}
|
271 |
+
|
272 |
+
/**
|
273 |
+
* Return the state.
|
274 |
+
*
|
275 |
+
* @return string|null
|
276 |
+
*/
|
277 |
+
protected function getState()
|
278 |
+
{
|
279 |
+
return $this->getInput('state');
|
280 |
+
}
|
281 |
+
|
282 |
+
/**
|
283 |
+
* Return the error code.
|
284 |
+
*
|
285 |
+
* @return string|null
|
286 |
+
*/
|
287 |
+
public function getErrorCode()
|
288 |
+
{
|
289 |
+
return $this->getInput('error_code');
|
290 |
+
}
|
291 |
+
|
292 |
+
/**
|
293 |
+
* Returns the error.
|
294 |
+
*
|
295 |
+
* @return string|null
|
296 |
+
*/
|
297 |
+
public function getError()
|
298 |
+
{
|
299 |
+
return $this->getInput('error');
|
300 |
+
}
|
301 |
+
|
302 |
+
/**
|
303 |
+
* Returns the error reason.
|
304 |
+
*
|
305 |
+
* @return string|null
|
306 |
+
*/
|
307 |
+
public function getErrorReason()
|
308 |
+
{
|
309 |
+
return $this->getInput('error_reason');
|
310 |
+
}
|
311 |
+
|
312 |
+
/**
|
313 |
+
* Returns the error description.
|
314 |
+
*
|
315 |
+
* @return string|null
|
316 |
+
*/
|
317 |
+
public function getErrorDescription()
|
318 |
+
{
|
319 |
+
return $this->getInput('error_description');
|
320 |
+
}
|
321 |
+
|
322 |
+
/**
|
323 |
+
* Returns a value from a GET param.
|
324 |
+
*
|
325 |
+
* @param string $key
|
326 |
+
*
|
327 |
+
* @return string|null
|
328 |
+
*/
|
329 |
+
private function getInput($key)
|
330 |
+
{
|
331 |
+
return isset($_GET[$key]) ? $_GET[$key] : null;
|
332 |
+
}
|
333 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/Helpers/FacebookSignedRequestFromInputHelper.php
ADDED
@@ -0,0 +1,166 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\Helpers;
|
25 |
+
|
26 |
+
use Facebook\Facebook;
|
27 |
+
use Facebook\FacebookApp;
|
28 |
+
use Facebook\FacebookClient;
|
29 |
+
use Facebook\SignedRequest;
|
30 |
+
use Facebook\Authentication\AccessToken;
|
31 |
+
use Facebook\Authentication\OAuth2Client;
|
32 |
+
|
33 |
+
/**
|
34 |
+
* Class FacebookSignedRequestFromInputHelper
|
35 |
+
*
|
36 |
+
* @package Facebook
|
37 |
+
*/
|
38 |
+
abstract class FacebookSignedRequestFromInputHelper
|
39 |
+
{
|
40 |
+
/**
|
41 |
+
* @var SignedRequest|null The SignedRequest entity.
|
42 |
+
*/
|
43 |
+
protected $signedRequest;
|
44 |
+
|
45 |
+
/**
|
46 |
+
* @var FacebookApp The FacebookApp entity.
|
47 |
+
*/
|
48 |
+
protected $app;
|
49 |
+
|
50 |
+
/**
|
51 |
+
* @var OAuth2Client The OAuth 2.0 client service.
|
52 |
+
*/
|
53 |
+
protected $oAuth2Client;
|
54 |
+
|
55 |
+
/**
|
56 |
+
* Initialize the helper and process available signed request data.
|
57 |
+
*
|
58 |
+
* @param FacebookApp $app The FacebookApp entity.
|
59 |
+
* @param FacebookClient $client The client to make HTTP requests.
|
60 |
+
* @param string|null $graphVersion The version of Graph to use.
|
61 |
+
*/
|
62 |
+
public function __construct(FacebookApp $app, FacebookClient $client, $graphVersion = null)
|
63 |
+
{
|
64 |
+
$this->app = $app;
|
65 |
+
$graphVersion = $graphVersion ?: Facebook::DEFAULT_GRAPH_VERSION;
|
66 |
+
$this->oAuth2Client = new OAuth2Client($this->app, $client, $graphVersion);
|
67 |
+
|
68 |
+
$this->instantiateSignedRequest();
|
69 |
+
}
|
70 |
+
|
71 |
+
/**
|
72 |
+
* Instantiates a new SignedRequest entity.
|
73 |
+
*
|
74 |
+
* @param string|null
|
75 |
+
*/
|
76 |
+
public function instantiateSignedRequest($rawSignedRequest = null)
|
77 |
+
{
|
78 |
+
$rawSignedRequest = $rawSignedRequest ?: $this->getRawSignedRequest();
|
79 |
+
|
80 |
+
if (!$rawSignedRequest) {
|
81 |
+
return;
|
82 |
+
}
|
83 |
+
|
84 |
+
$this->signedRequest = new SignedRequest($this->app, $rawSignedRequest);
|
85 |
+
}
|
86 |
+
|
87 |
+
/**
|
88 |
+
* Returns an AccessToken entity from the signed request.
|
89 |
+
*
|
90 |
+
* @return AccessToken|null
|
91 |
+
*
|
92 |
+
* @throws \Facebook\Exceptions\FacebookSDKException
|
93 |
+
*/
|
94 |
+
public function getAccessToken()
|
95 |
+
{
|
96 |
+
if ($this->signedRequest && $this->signedRequest->hasOAuthData()) {
|
97 |
+
$code = $this->signedRequest->get('code');
|
98 |
+
$accessToken = $this->signedRequest->get('oauth_token');
|
99 |
+
|
100 |
+
if ($code && !$accessToken) {
|
101 |
+
return $this->oAuth2Client->getAccessTokenFromCode($code);
|
102 |
+
}
|
103 |
+
|
104 |
+
$expiresAt = $this->signedRequest->get('expires', 0);
|
105 |
+
|
106 |
+
return new AccessToken($accessToken, $expiresAt);
|
107 |
+
}
|
108 |
+
|
109 |
+
return null;
|
110 |
+
}
|
111 |
+
|
112 |
+
/**
|
113 |
+
* Returns the SignedRequest entity.
|
114 |
+
*
|
115 |
+
* @return SignedRequest|null
|
116 |
+
*/
|
117 |
+
public function getSignedRequest()
|
118 |
+
{
|
119 |
+
return $this->signedRequest;
|
120 |
+
}
|
121 |
+
|
122 |
+
/**
|
123 |
+
* Returns the user_id if available.
|
124 |
+
*
|
125 |
+
* @return string|null
|
126 |
+
*/
|
127 |
+
public function getUserId()
|
128 |
+
{
|
129 |
+
return $this->signedRequest ? $this->signedRequest->getUserId() : null;
|
130 |
+
}
|
131 |
+
|
132 |
+
/**
|
133 |
+
* Get raw signed request from input.
|
134 |
+
*
|
135 |
+
* @return string|null
|
136 |
+
*/
|
137 |
+
abstract public function getRawSignedRequest();
|
138 |
+
|
139 |
+
/**
|
140 |
+
* Get raw signed request from POST input.
|
141 |
+
*
|
142 |
+
* @return string|null
|
143 |
+
*/
|
144 |
+
public function getRawSignedRequestFromPost()
|
145 |
+
{
|
146 |
+
if (isset($_POST['signed_request'])) {
|
147 |
+
return $_POST['signed_request'];
|
148 |
+
}
|
149 |
+
|
150 |
+
return null;
|
151 |
+
}
|
152 |
+
|
153 |
+
/**
|
154 |
+
* Get raw signed request from cookie set from the Javascript SDK.
|
155 |
+
*
|
156 |
+
* @return string|null
|
157 |
+
*/
|
158 |
+
public function getRawSignedRequestFromCookie()
|
159 |
+
{
|
160 |
+
if (isset($_COOKIE['fbsr_' . $this->app->getId()])) {
|
161 |
+
return $_COOKIE['fbsr_' . $this->app->getId()];
|
162 |
+
}
|
163 |
+
|
164 |
+
return null;
|
165 |
+
}
|
166 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/Http/GraphRawResponse.php
ADDED
@@ -0,0 +1,137 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\Http;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class GraphRawResponse
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
class GraphRawResponse
|
32 |
+
{
|
33 |
+
/**
|
34 |
+
* @var array The response headers in the form of an associative array.
|
35 |
+
*/
|
36 |
+
protected $headers;
|
37 |
+
|
38 |
+
/**
|
39 |
+
* @var string The raw response body.
|
40 |
+
*/
|
41 |
+
protected $body;
|
42 |
+
|
43 |
+
/**
|
44 |
+
* @var int The HTTP status response code.
|
45 |
+
*/
|
46 |
+
protected $httpResponseCode;
|
47 |
+
|
48 |
+
/**
|
49 |
+
* Creates a new GraphRawResponse entity.
|
50 |
+
*
|
51 |
+
* @param string|array $headers The headers as a raw string or array.
|
52 |
+
* @param string $body The raw response body.
|
53 |
+
* @param int $httpStatusCode The HTTP response code (if sending headers as parsed array).
|
54 |
+
*/
|
55 |
+
public function __construct($headers, $body, $httpStatusCode = null)
|
56 |
+
{
|
57 |
+
if (is_numeric($httpStatusCode)) {
|
58 |
+
$this->httpResponseCode = (int)$httpStatusCode;
|
59 |
+
}
|
60 |
+
|
61 |
+
if (is_array($headers)) {
|
62 |
+
$this->headers = $headers;
|
63 |
+
} else {
|
64 |
+
$this->setHeadersFromString($headers);
|
65 |
+
}
|
66 |
+
|
67 |
+
$this->body = $body;
|
68 |
+
}
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Return the response headers.
|
72 |
+
*
|
73 |
+
* @return array
|
74 |
+
*/
|
75 |
+
public function getHeaders()
|
76 |
+
{
|
77 |
+
return $this->headers;
|
78 |
+
}
|
79 |
+
|
80 |
+
/**
|
81 |
+
* Return the body of the response.
|
82 |
+
*
|
83 |
+
* @return string
|
84 |
+
*/
|
85 |
+
public function getBody()
|
86 |
+
{
|
87 |
+
return $this->body;
|
88 |
+
}
|
89 |
+
|
90 |
+
/**
|
91 |
+
* Return the HTTP response code.
|
92 |
+
*
|
93 |
+
* @return int
|
94 |
+
*/
|
95 |
+
public function getHttpResponseCode()
|
96 |
+
{
|
97 |
+
return $this->httpResponseCode;
|
98 |
+
}
|
99 |
+
|
100 |
+
/**
|
101 |
+
* Sets the HTTP response code from a raw header.
|
102 |
+
*
|
103 |
+
* @param string $rawResponseHeader
|
104 |
+
*/
|
105 |
+
public function setHttpResponseCodeFromHeader($rawResponseHeader)
|
106 |
+
{
|
107 |
+
preg_match('|HTTP/\d\.\d\s+(\d+)\s+.*|', $rawResponseHeader, $match);
|
108 |
+
$this->httpResponseCode = (int)$match[1];
|
109 |
+
}
|
110 |
+
|
111 |
+
/**
|
112 |
+
* Parse the raw headers and set as an array.
|
113 |
+
*
|
114 |
+
* @param string $rawHeaders The raw headers from the response.
|
115 |
+
*/
|
116 |
+
protected function setHeadersFromString($rawHeaders)
|
117 |
+
{
|
118 |
+
// Normalize line breaks
|
119 |
+
$rawHeaders = str_replace("\r\n", "\n", $rawHeaders);
|
120 |
+
|
121 |
+
// There will be multiple headers if a 301 was followed
|
122 |
+
// or a proxy was followed, etc
|
123 |
+
$headerCollection = explode("\n\n", trim($rawHeaders));
|
124 |
+
// We just want the last response (at the end)
|
125 |
+
$rawHeader = array_pop($headerCollection);
|
126 |
+
|
127 |
+
$headerComponents = explode("\n", $rawHeader);
|
128 |
+
foreach ($headerComponents as $line) {
|
129 |
+
if (strpos($line, ': ') === false) {
|
130 |
+
$this->setHttpResponseCodeFromHeader($line);
|
131 |
+
} else {
|
132 |
+
list($key, $value) = explode(': ', $line, 2);
|
133 |
+
$this->headers[$key] = $value;
|
134 |
+
}
|
135 |
+
}
|
136 |
+
}
|
137 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/Http/RequestBodyInterface.php
ADDED
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\Http;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Interface
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
interface RequestBodyInterface
|
32 |
+
{
|
33 |
+
/**
|
34 |
+
* Get the body of the request to send to Graph.
|
35 |
+
*
|
36 |
+
* @return string
|
37 |
+
*/
|
38 |
+
public function getBody();
|
39 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/Http/RequestBodyMultipart.php
ADDED
@@ -0,0 +1,170 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\Http;
|
25 |
+
|
26 |
+
use Facebook\FileUpload\FacebookFile;
|
27 |
+
|
28 |
+
/**
|
29 |
+
* Class RequestBodyMultipartt
|
30 |
+
*
|
31 |
+
* Some things copied from Guzzle
|
32 |
+
*
|
33 |
+
* @package Facebook
|
34 |
+
*
|
35 |
+
* @see https://github.com/guzzle/guzzle/blob/master/src/Post/MultipartBody.php
|
36 |
+
*/
|
37 |
+
class RequestBodyMultipart implements RequestBodyInterface
|
38 |
+
{
|
39 |
+
/**
|
40 |
+
* @var string The boundary.
|
41 |
+
*/
|
42 |
+
private $boundary;
|
43 |
+
|
44 |
+
/**
|
45 |
+
* @var array The parameters to send with this request.
|
46 |
+
*/
|
47 |
+
private $params;
|
48 |
+
|
49 |
+
/**
|
50 |
+
* @var array The files to send with this request.
|
51 |
+
*/
|
52 |
+
private $files = [];
|
53 |
+
|
54 |
+
/**
|
55 |
+
* @param array $params The parameters to send with this request.
|
56 |
+
* @param array $files The files to send with this request.
|
57 |
+
* @param string $boundary Provide a specific boundary.
|
58 |
+
*/
|
59 |
+
public function __construct(array $params = [], array $files = [], $boundary = null)
|
60 |
+
{
|
61 |
+
$this->params = $params;
|
62 |
+
$this->files = $files;
|
63 |
+
$this->boundary = $boundary ?: uniqid();
|
64 |
+
}
|
65 |
+
|
66 |
+
/**
|
67 |
+
* @inheritdoc
|
68 |
+
*/
|
69 |
+
public function getBody()
|
70 |
+
{
|
71 |
+
$body = '';
|
72 |
+
|
73 |
+
// Compile normal params
|
74 |
+
$params = $this->getNestedParams($this->params);
|
75 |
+
foreach ($params as $k => $v) {
|
76 |
+
$body .= $this->getParamString($k, $v);
|
77 |
+
}
|
78 |
+
|
79 |
+
// Compile files
|
80 |
+
foreach ($this->files as $k => $v) {
|
81 |
+
$body .= $this->getFileString($k, $v);
|
82 |
+
}
|
83 |
+
|
84 |
+
// Peace out
|
85 |
+
$body .= "--{$this->boundary}--\r\n";
|
86 |
+
|
87 |
+
return $body;
|
88 |
+
}
|
89 |
+
|
90 |
+
/**
|
91 |
+
* Get the boundary
|
92 |
+
*
|
93 |
+
* @return string
|
94 |
+
*/
|
95 |
+
public function getBoundary()
|
96 |
+
{
|
97 |
+
return $this->boundary;
|
98 |
+
}
|
99 |
+
|
100 |
+
/**
|
101 |
+
* Get the string needed to transfer a file.
|
102 |
+
*
|
103 |
+
* @param string $name
|
104 |
+
* @param FacebookFile $file
|
105 |
+
*
|
106 |
+
* @return string
|
107 |
+
*/
|
108 |
+
private function getFileString($name, FacebookFile $file)
|
109 |
+
{
|
110 |
+
return sprintf(
|
111 |
+
"--%s\r\nContent-Disposition: form-data; name=\"%s\"; filename=\"%s\"%s\r\n\r\n%s\r\n",
|
112 |
+
$this->boundary,
|
113 |
+
$name,
|
114 |
+
$file->getFileName(),
|
115 |
+
$this->getFileHeaders($file),
|
116 |
+
$file->getContents()
|
117 |
+
);
|
118 |
+
}
|
119 |
+
|
120 |
+
/**
|
121 |
+
* Get the string needed to transfer a POST field.
|
122 |
+
*
|
123 |
+
* @param string $name
|
124 |
+
* @param string $value
|
125 |
+
*
|
126 |
+
* @return string
|
127 |
+
*/
|
128 |
+
private function getParamString($name, $value)
|
129 |
+
{
|
130 |
+
return sprintf(
|
131 |
+
"--%s\r\nContent-Disposition: form-data; name=\"%s\"\r\n\r\n%s\r\n",
|
132 |
+
$this->boundary,
|
133 |
+
$name,
|
134 |
+
$value
|
135 |
+
);
|
136 |
+
}
|
137 |
+
|
138 |
+
/**
|
139 |
+
* Returns the params as an array of nested params.
|
140 |
+
*
|
141 |
+
* @param array $params
|
142 |
+
*
|
143 |
+
* @return array
|
144 |
+
*/
|
145 |
+
private function getNestedParams(array $params)
|
146 |
+
{
|
147 |
+
$query = http_build_query($params, null, '&');
|
148 |
+
$params = explode('&', $query);
|
149 |
+
$result = [];
|
150 |
+
|
151 |
+
foreach ($params as $param) {
|
152 |
+
list($key, $value) = explode('=', $param, 2);
|
153 |
+
$result[urldecode($key)] = urldecode($value);
|
154 |
+
}
|
155 |
+
|
156 |
+
return $result;
|
157 |
+
}
|
158 |
+
|
159 |
+
/**
|
160 |
+
* Get the headers needed before transferring the content of a POST file.
|
161 |
+
*
|
162 |
+
* @param FacebookFile $file
|
163 |
+
*
|
164 |
+
* @return string
|
165 |
+
*/
|
166 |
+
protected function getFileHeaders(FacebookFile $file)
|
167 |
+
{
|
168 |
+
return "\r\nContent-Type: {$file->getMimetype()}";
|
169 |
+
}
|
170 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/Http/RequestBodyUrlEncoded.php
ADDED
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\Http;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class RequestBodyUrlEncoded
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
class RequestBodyUrlEncoded implements RequestBodyInterface
|
32 |
+
{
|
33 |
+
/**
|
34 |
+
* @var array The parameters to send with this request.
|
35 |
+
*/
|
36 |
+
protected $params = [];
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Creates a new GraphUrlEncodedBody entity.
|
40 |
+
*
|
41 |
+
* @param array $params
|
42 |
+
*/
|
43 |
+
public function __construct(array $params)
|
44 |
+
{
|
45 |
+
$this->params = $params;
|
46 |
+
}
|
47 |
+
|
48 |
+
/**
|
49 |
+
* @inheritdoc
|
50 |
+
*/
|
51 |
+
public function getBody()
|
52 |
+
{
|
53 |
+
return http_build_query($this->params, null, '&');
|
54 |
+
}
|
55 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/HttpClients/FacebookCurl.php
ADDED
@@ -0,0 +1,129 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\HttpClients;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class FacebookCurl
|
28 |
+
*
|
29 |
+
* Abstraction for the procedural curl elements so that curl can be mocked and the implementation can be tested.
|
30 |
+
*
|
31 |
+
* @package Facebook
|
32 |
+
*/
|
33 |
+
class FacebookCurl
|
34 |
+
{
|
35 |
+
|
36 |
+
/**
|
37 |
+
* @var resource Curl resource instance
|
38 |
+
*/
|
39 |
+
protected $curl;
|
40 |
+
|
41 |
+
/**
|
42 |
+
* Make a new curl reference instance
|
43 |
+
*/
|
44 |
+
public function init()
|
45 |
+
{
|
46 |
+
$this->curl = curl_init();
|
47 |
+
}
|
48 |
+
|
49 |
+
/**
|
50 |
+
* Set a curl option
|
51 |
+
*
|
52 |
+
* @param $key
|
53 |
+
* @param $value
|
54 |
+
*/
|
55 |
+
public function setopt($key, $value)
|
56 |
+
{
|
57 |
+
curl_setopt($this->curl, $key, $value);
|
58 |
+
}
|
59 |
+
|
60 |
+
/**
|
61 |
+
* Set an array of options to a curl resource
|
62 |
+
*
|
63 |
+
* @param array $options
|
64 |
+
*/
|
65 |
+
public function setoptArray(array $options)
|
66 |
+
{
|
67 |
+
curl_setopt_array($this->curl, $options);
|
68 |
+
}
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Send a curl request
|
72 |
+
*
|
73 |
+
* @return mixed
|
74 |
+
*/
|
75 |
+
public function exec()
|
76 |
+
{
|
77 |
+
return curl_exec($this->curl);
|
78 |
+
}
|
79 |
+
|
80 |
+
/**
|
81 |
+
* Return the curl error number
|
82 |
+
*
|
83 |
+
* @return int
|
84 |
+
*/
|
85 |
+
public function errno()
|
86 |
+
{
|
87 |
+
return curl_errno($this->curl);
|
88 |
+
}
|
89 |
+
|
90 |
+
/**
|
91 |
+
* Return the curl error message
|
92 |
+
*
|
93 |
+
* @return string
|
94 |
+
*/
|
95 |
+
public function error()
|
96 |
+
{
|
97 |
+
return curl_error($this->curl);
|
98 |
+
}
|
99 |
+
|
100 |
+
/**
|
101 |
+
* Get info from a curl reference
|
102 |
+
*
|
103 |
+
* @param $type
|
104 |
+
*
|
105 |
+
* @return mixed
|
106 |
+
*/
|
107 |
+
public function getinfo($type)
|
108 |
+
{
|
109 |
+
return curl_getinfo($this->curl, $type);
|
110 |
+
}
|
111 |
+
|
112 |
+
/**
|
113 |
+
* Get the currently installed curl version
|
114 |
+
*
|
115 |
+
* @return array
|
116 |
+
*/
|
117 |
+
public function version()
|
118 |
+
{
|
119 |
+
return curl_version();
|
120 |
+
}
|
121 |
+
|
122 |
+
/**
|
123 |
+
* Close the resource connection to curl
|
124 |
+
*/
|
125 |
+
public function close()
|
126 |
+
{
|
127 |
+
curl_close($this->curl);
|
128 |
+
}
|
129 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/HttpClients/FacebookCurlHttpClient.php
ADDED
@@ -0,0 +1,163 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\HttpClients;
|
25 |
+
|
26 |
+
use Facebook\Http\GraphRawResponse;
|
27 |
+
use Facebook\Exceptions\FacebookSDKException;
|
28 |
+
|
29 |
+
/**
|
30 |
+
* Class FacebookCurlHttpClient
|
31 |
+
*
|
32 |
+
* @package Facebook
|
33 |
+
*/
|
34 |
+
class FacebookCurlHttpClient implements FacebookHttpClientInterface
|
35 |
+
{
|
36 |
+
/**
|
37 |
+
* @var string The client error message
|
38 |
+
*/
|
39 |
+
protected $curlErrorMessage = '';
|
40 |
+
|
41 |
+
/**
|
42 |
+
* @var int The curl client error code
|
43 |
+
*/
|
44 |
+
protected $curlErrorCode = 0;
|
45 |
+
|
46 |
+
/**
|
47 |
+
* @var string|boolean The raw response from the server
|
48 |
+
*/
|
49 |
+
protected $rawResponse;
|
50 |
+
|
51 |
+
/**
|
52 |
+
* @var FacebookCurl Procedural curl as object
|
53 |
+
*/
|
54 |
+
protected $facebookCurl;
|
55 |
+
|
56 |
+
/**
|
57 |
+
* @param FacebookCurl|null Procedural curl as object
|
58 |
+
*/
|
59 |
+
public function __construct(FacebookCurl $facebookCurl = null)
|
60 |
+
{
|
61 |
+
$this->facebookCurl = $facebookCurl ?: new FacebookCurl();
|
62 |
+
}
|
63 |
+
|
64 |
+
/**
|
65 |
+
* @inheritdoc
|
66 |
+
*/
|
67 |
+
public function send($url, $method, $body, array $headers, $timeOut)
|
68 |
+
{
|
69 |
+
$this->openConnection($url, $method, $body, $headers, $timeOut);
|
70 |
+
$this->sendRequest();
|
71 |
+
|
72 |
+
if ($curlErrorCode = $this->facebookCurl->errno()) {
|
73 |
+
throw new FacebookSDKException($this->facebookCurl->error(), $curlErrorCode);
|
74 |
+
}
|
75 |
+
|
76 |
+
// Separate the raw headers from the raw body
|
77 |
+
list($rawHeaders, $rawBody) = $this->extractResponseHeadersAndBody();
|
78 |
+
|
79 |
+
$this->closeConnection();
|
80 |
+
|
81 |
+
return new GraphRawResponse($rawHeaders, $rawBody);
|
82 |
+
}
|
83 |
+
|
84 |
+
/**
|
85 |
+
* Opens a new curl connection.
|
86 |
+
*
|
87 |
+
* @param string $url The endpoint to send the request to.
|
88 |
+
* @param string $method The request method.
|
89 |
+
* @param string $body The body of the request.
|
90 |
+
* @param array $headers The request headers.
|
91 |
+
* @param int $timeOut The timeout in seconds for the request.
|
92 |
+
*/
|
93 |
+
public function openConnection($url, $method, $body, array $headers, $timeOut)
|
94 |
+
{
|
95 |
+
$options = [
|
96 |
+
CURLOPT_CUSTOMREQUEST => $method,
|
97 |
+
CURLOPT_HTTPHEADER => $this->compileRequestHeaders($headers),
|
98 |
+
CURLOPT_URL => $url,
|
99 |
+
CURLOPT_CONNECTTIMEOUT => 10,
|
100 |
+
CURLOPT_TIMEOUT => $timeOut,
|
101 |
+
CURLOPT_RETURNTRANSFER => true, // Follow 301 redirects
|
102 |
+
CURLOPT_HEADER => true, // Enable header processing
|
103 |
+
CURLOPT_SSL_VERIFYHOST => 2,
|
104 |
+
CURLOPT_SSL_VERIFYPEER => true,
|
105 |
+
CURLOPT_CAINFO => __DIR__ . '/certs/DigiCertHighAssuranceEVRootCA.pem',
|
106 |
+
];
|
107 |
+
|
108 |
+
if ($method !== "GET") {
|
109 |
+
$options[CURLOPT_POSTFIELDS] = $body;
|
110 |
+
}
|
111 |
+
|
112 |
+
$this->facebookCurl->init();
|
113 |
+
$this->facebookCurl->setoptArray($options);
|
114 |
+
}
|
115 |
+
|
116 |
+
/**
|
117 |
+
* Closes an existing curl connection
|
118 |
+
*/
|
119 |
+
public function closeConnection()
|
120 |
+
{
|
121 |
+
$this->facebookCurl->close();
|
122 |
+
}
|
123 |
+
|
124 |
+
/**
|
125 |
+
* Send the request and get the raw response from curl
|
126 |
+
*/
|
127 |
+
public function sendRequest()
|
128 |
+
{
|
129 |
+
$this->rawResponse = $this->facebookCurl->exec();
|
130 |
+
}
|
131 |
+
|
132 |
+
/**
|
133 |
+
* Compiles the request headers into a curl-friendly format.
|
134 |
+
*
|
135 |
+
* @param array $headers The request headers.
|
136 |
+
*
|
137 |
+
* @return array
|
138 |
+
*/
|
139 |
+
public function compileRequestHeaders(array $headers)
|
140 |
+
{
|
141 |
+
$return = [];
|
142 |
+
|
143 |
+
foreach ($headers as $key => $value) {
|
144 |
+
$return[] = $key . ': ' . $value;
|
145 |
+
}
|
146 |
+
|
147 |
+
return $return;
|
148 |
+
}
|
149 |
+
|
150 |
+
/**
|
151 |
+
* Extracts the headers and the body into a two-part array
|
152 |
+
*
|
153 |
+
* @return array
|
154 |
+
*/
|
155 |
+
public function extractResponseHeadersAndBody()
|
156 |
+
{
|
157 |
+
$parts = explode("\r\n\r\n", $this->rawResponse);
|
158 |
+
$rawBody = array_pop($parts);
|
159 |
+
$rawHeaders = implode("\r\n\r\n", $parts);
|
160 |
+
|
161 |
+
return [trim($rawHeaders), trim($rawBody)];
|
162 |
+
}
|
163 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/HttpClients/FacebookGuzzleHttpClient.php
ADDED
@@ -0,0 +1,97 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\HttpClients;
|
25 |
+
|
26 |
+
use Facebook\Http\GraphRawResponse;
|
27 |
+
use Facebook\Exceptions\FacebookSDKException;
|
28 |
+
|
29 |
+
use GuzzleHttp\Client;
|
30 |
+
use GuzzleHttp\Message\ResponseInterface;
|
31 |
+
use GuzzleHttp\Ring\Exception\RingException;
|
32 |
+
use GuzzleHttp\Exception\RequestException;
|
33 |
+
|
34 |
+
class FacebookGuzzleHttpClient implements FacebookHttpClientInterface
|
35 |
+
{
|
36 |
+
/**
|
37 |
+
* @var \GuzzleHttp\Client The Guzzle client.
|
38 |
+
*/
|
39 |
+
protected $guzzleClient;
|
40 |
+
|
41 |
+
/**
|
42 |
+
* @param \GuzzleHttp\Client|null The Guzzle client.
|
43 |
+
*/
|
44 |
+
public function __construct(Client $guzzleClient = null)
|
45 |
+
{
|
46 |
+
$this->guzzleClient = $guzzleClient ?: new Client();
|
47 |
+
}
|
48 |
+
|
49 |
+
/**
|
50 |
+
* @inheritdoc
|
51 |
+
*/
|
52 |
+
public function send($url, $method, $body, array $headers, $timeOut)
|
53 |
+
{
|
54 |
+
$options = [
|
55 |
+
'headers' => $headers,
|
56 |
+
'body' => $body,
|
57 |
+
'timeout' => $timeOut,
|
58 |
+
'connect_timeout' => 10,
|
59 |
+
'verify' => __DIR__ . '/certs/DigiCertHighAssuranceEVRootCA.pem',
|
60 |
+
];
|
61 |
+
$request = $this->guzzleClient->createRequest($method, $url, $options);
|
62 |
+
|
63 |
+
try {
|
64 |
+
$rawResponse = $this->guzzleClient->send($request);
|
65 |
+
} catch (RequestException $e) {
|
66 |
+
$rawResponse = $e->getResponse();
|
67 |
+
|
68 |
+
if ($e->getPrevious() instanceof RingException || !$rawResponse instanceof ResponseInterface) {
|
69 |
+
throw new FacebookSDKException($e->getMessage(), $e->getCode());
|
70 |
+
}
|
71 |
+
}
|
72 |
+
|
73 |
+
$rawHeaders = $this->getHeadersAsString($rawResponse);
|
74 |
+
$rawBody = $rawResponse->getBody();
|
75 |
+
$httpStatusCode = $rawResponse->getStatusCode();
|
76 |
+
|
77 |
+
return new GraphRawResponse($rawHeaders, $rawBody, $httpStatusCode);
|
78 |
+
}
|
79 |
+
|
80 |
+
/**
|
81 |
+
* Returns the Guzzle array of headers as a string.
|
82 |
+
*
|
83 |
+
* @param ResponseInterface $response The Guzzle response.
|
84 |
+
*
|
85 |
+
* @return string
|
86 |
+
*/
|
87 |
+
public function getHeadersAsString(ResponseInterface $response)
|
88 |
+
{
|
89 |
+
$headers = $response->getHeaders();
|
90 |
+
$rawHeaders = [];
|
91 |
+
foreach ($headers as $name => $values) {
|
92 |
+
$rawHeaders[] = $name . ": " . implode(", ", $values);
|
93 |
+
}
|
94 |
+
|
95 |
+
return implode("\r\n", $rawHeaders);
|
96 |
+
}
|
97 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/HttpClients/FacebookHttpClientInterface.php
ADDED
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\HttpClients;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Interface FacebookHttpClientInterface
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
interface FacebookHttpClientInterface
|
32 |
+
{
|
33 |
+
/**
|
34 |
+
* Sends a request to the server and returns the raw response.
|
35 |
+
*
|
36 |
+
* @param string $url The endpoint to send the request to.
|
37 |
+
* @param string $method The request method.
|
38 |
+
* @param string $body The body of the request.
|
39 |
+
* @param array $headers The request headers.
|
40 |
+
* @param int $timeOut The timeout in seconds for the request.
|
41 |
+
*
|
42 |
+
* @return \Facebook\Http\GraphRawResponse Raw response from the server.
|
43 |
+
*
|
44 |
+
* @throws \Facebook\Exceptions\FacebookSDKException
|
45 |
+
*/
|
46 |
+
public function send($url, $method, $body, array $headers, $timeOut);
|
47 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/HttpClients/FacebookStream.php
ADDED
@@ -0,0 +1,80 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\HttpClients;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class FacebookStream
|
28 |
+
*
|
29 |
+
* Abstraction for the procedural stream elements so that the functions can be
|
30 |
+
* mocked and the implementation can be tested.
|
31 |
+
*
|
32 |
+
* @package Facebook
|
33 |
+
*/
|
34 |
+
class FacebookStream
|
35 |
+
{
|
36 |
+
/**
|
37 |
+
* @var resource Context stream resource instance
|
38 |
+
*/
|
39 |
+
protected $stream;
|
40 |
+
|
41 |
+
/**
|
42 |
+
* @var array Response headers from the stream wrapper
|
43 |
+
*/
|
44 |
+
protected $responseHeaders = [];
|
45 |
+
|
46 |
+
/**
|
47 |
+
* Make a new context stream reference instance
|
48 |
+
*
|
49 |
+
* @param array $options
|
50 |
+
*/
|
51 |
+
public function streamContextCreate(array $options)
|
52 |
+
{
|
53 |
+
$this->stream = stream_context_create($options);
|
54 |
+
}
|
55 |
+
|
56 |
+
/**
|
57 |
+
* The response headers from the stream wrapper
|
58 |
+
*
|
59 |
+
* @return array
|
60 |
+
*/
|
61 |
+
public function getResponseHeaders()
|
62 |
+
{
|
63 |
+
return $this->responseHeaders;
|
64 |
+
}
|
65 |
+
|
66 |
+
/**
|
67 |
+
* Send a stream wrapped request
|
68 |
+
*
|
69 |
+
* @param string $url
|
70 |
+
*
|
71 |
+
* @return mixed
|
72 |
+
*/
|
73 |
+
public function fileGetContents($url)
|
74 |
+
{
|
75 |
+
$rawResponse = file_get_contents($url, false, $this->stream);
|
76 |
+
$this->responseHeaders = $http_response_header ?: [];
|
77 |
+
|
78 |
+
return $rawResponse;
|
79 |
+
}
|
80 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/HttpClients/FacebookStreamHttpClient.php
ADDED
@@ -0,0 +1,94 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\HttpClients;
|
25 |
+
|
26 |
+
use Facebook\Http\GraphRawResponse;
|
27 |
+
use Facebook\Exceptions\FacebookSDKException;
|
28 |
+
|
29 |
+
class FacebookStreamHttpClient implements FacebookHttpClientInterface
|
30 |
+
{
|
31 |
+
/**
|
32 |
+
* @var FacebookStream Procedural stream wrapper as object.
|
33 |
+
*/
|
34 |
+
protected $facebookStream;
|
35 |
+
|
36 |
+
/**
|
37 |
+
* @param FacebookStream|null Procedural stream wrapper as object.
|
38 |
+
*/
|
39 |
+
public function __construct(FacebookStream $facebookStream = null)
|
40 |
+
{
|
41 |
+
$this->facebookStream = $facebookStream ?: new FacebookStream();
|
42 |
+
}
|
43 |
+
|
44 |
+
/**
|
45 |
+
* @inheritdoc
|
46 |
+
*/
|
47 |
+
public function send($url, $method, $body, array $headers, $timeOut)
|
48 |
+
{
|
49 |
+
$options = [
|
50 |
+
'http' => [
|
51 |
+
'method' => $method,
|
52 |
+
'header' => $this->compileHeader($headers),
|
53 |
+
'content' => $body,
|
54 |
+
'timeout' => $timeOut,
|
55 |
+
'ignore_errors' => true
|
56 |
+
],
|
57 |
+
'ssl' => [
|
58 |
+
'verify_peer' => true,
|
59 |
+
'verify_peer_name' => true,
|
60 |
+
'allow_self_signed' => true, // All root certificates are self-signed
|
61 |
+
'cafile' => __DIR__ . '/certs/DigiCertHighAssuranceEVRootCA.pem',
|
62 |
+
],
|
63 |
+
];
|
64 |
+
|
65 |
+
$this->facebookStream->streamContextCreate($options);
|
66 |
+
$rawBody = $this->facebookStream->fileGetContents($url);
|
67 |
+
$rawHeaders = $this->facebookStream->getResponseHeaders();
|
68 |
+
|
69 |
+
if ($rawBody === false || empty($rawHeaders)) {
|
70 |
+
throw new FacebookSDKException('Stream returned an empty response', 660);
|
71 |
+
}
|
72 |
+
|
73 |
+
$rawHeaders = implode("\r\n", $rawHeaders);
|
74 |
+
|
75 |
+
return new GraphRawResponse($rawHeaders, $rawBody);
|
76 |
+
}
|
77 |
+
|
78 |
+
/**
|
79 |
+
* Formats the headers for use in the stream wrapper.
|
80 |
+
*
|
81 |
+
* @param array $headers The request headers.
|
82 |
+
*
|
83 |
+
* @return string
|
84 |
+
*/
|
85 |
+
public function compileHeader(array $headers)
|
86 |
+
{
|
87 |
+
$header = [];
|
88 |
+
foreach ($headers as $k => $v) {
|
89 |
+
$header[] = $k . ': ' . $v;
|
90 |
+
}
|
91 |
+
|
92 |
+
return implode("\r\n", $header);
|
93 |
+
}
|
94 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/HttpClients/HttpClientsFactory.php
ADDED
@@ -0,0 +1,99 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\HttpClients;
|
25 |
+
|
26 |
+
use GuzzleHttp\Client;
|
27 |
+
use InvalidArgumentException;
|
28 |
+
use Exception;
|
29 |
+
|
30 |
+
class HttpClientsFactory
|
31 |
+
{
|
32 |
+
private function __construct()
|
33 |
+
{
|
34 |
+
// a factory constructor should never be invoked
|
35 |
+
}
|
36 |
+
|
37 |
+
/**
|
38 |
+
* HTTP client generation.
|
39 |
+
*
|
40 |
+
* @param FacebookHttpClientInterface|Client|string|null $handler
|
41 |
+
*
|
42 |
+
* @throws Exception If the cURL extension or the Guzzle client aren't available (if required).
|
43 |
+
* @throws InvalidArgumentException If the http client handler isn't "curl", "stream", "guzzle", or an instance of Facebook\HttpClients\FacebookHttpClientInterface.
|
44 |
+
*
|
45 |
+
* @return FacebookHttpClientInterface
|
46 |
+
*/
|
47 |
+
public static function createHttpClient($handler)
|
48 |
+
{
|
49 |
+
if (!$handler) {
|
50 |
+
return self::detectDefaultClient();
|
51 |
+
}
|
52 |
+
|
53 |
+
if ($handler instanceof FacebookHttpClientInterface) {
|
54 |
+
return $handler;
|
55 |
+
}
|
56 |
+
|
57 |
+
if ('stream' === $handler) {
|
58 |
+
return new FacebookStreamHttpClient();
|
59 |
+
}
|
60 |
+
if ('curl' === $handler) {
|
61 |
+
if (!extension_loaded('curl')) {
|
62 |
+
throw new Exception('The cURL extension must be loaded in order to use the "curl" handler.');
|
63 |
+
}
|
64 |
+
|
65 |
+
return new FacebookCurlHttpClient();
|
66 |
+
}
|
67 |
+
|
68 |
+
if ('guzzle' === $handler && !class_exists('GuzzleHttp\Client')) {
|
69 |
+
throw new Exception('The Guzzle HTTP client must be included in order to use the "guzzle" handler.');
|
70 |
+
}
|
71 |
+
|
72 |
+
if ($handler instanceof Client) {
|
73 |
+
return new FacebookGuzzleHttpClient($handler);
|
74 |
+
}
|
75 |
+
if ('guzzle' === $handler) {
|
76 |
+
return new FacebookGuzzleHttpClient();
|
77 |
+
}
|
78 |
+
|
79 |
+
throw new InvalidArgumentException('The http client handler must be set to "curl", "stream", "guzzle", be an instance of GuzzleHttp\Client or an instance of Facebook\HttpClients\FacebookHttpClientInterface');
|
80 |
+
}
|
81 |
+
|
82 |
+
/**
|
83 |
+
* Detect default HTTP client.
|
84 |
+
*
|
85 |
+
* @return FacebookHttpClientInterface
|
86 |
+
*/
|
87 |
+
private static function detectDefaultClient()
|
88 |
+
{
|
89 |
+
if (extension_loaded('curl')) {
|
90 |
+
return new FacebookCurlHttpClient();
|
91 |
+
}
|
92 |
+
|
93 |
+
if (class_exists('GuzzleHttp\Client')) {
|
94 |
+
return new FacebookGuzzleHttpClient();
|
95 |
+
}
|
96 |
+
|
97 |
+
return new FacebookStreamHttpClient();
|
98 |
+
}
|
99 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/HttpClients/certs/DigiCertHighAssuranceEVRootCA.pem
ADDED
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
-----BEGIN CERTIFICATE-----
|
2 |
+
MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
|
3 |
+
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
4 |
+
d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
|
5 |
+
ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
|
6 |
+
MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
|
7 |
+
LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
|
8 |
+
RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
|
9 |
+
+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
|
10 |
+
PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
|
11 |
+
xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
|
12 |
+
Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
|
13 |
+
hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
|
14 |
+
EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
|
15 |
+
MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
|
16 |
+
FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
|
17 |
+
nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
|
18 |
+
eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
|
19 |
+
hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
|
20 |
+
Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
|
21 |
+
vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
|
22 |
+
+OkuE6N36B9K
|
23 |
+
-----END CERTIFICATE-----
|
hybridauth/Hybrid/thirdparty/Facebook/PersistentData/FacebookMemoryPersistentDataHandler.php
ADDED
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\PersistentData;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class FacebookMemoryPersistentDataHandler
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
class FacebookMemoryPersistentDataHandler implements PersistentDataInterface
|
32 |
+
{
|
33 |
+
/**
|
34 |
+
* @var array The session data to keep in memory.
|
35 |
+
*/
|
36 |
+
protected $sessionData = [];
|
37 |
+
|
38 |
+
/**
|
39 |
+
* @inheritdoc
|
40 |
+
*/
|
41 |
+
public function get($key)
|
42 |
+
{
|
43 |
+
return isset($this->sessionData[$key]) ? $this->sessionData[$key] : null;
|
44 |
+
}
|
45 |
+
|
46 |
+
/**
|
47 |
+
* @inheritdoc
|
48 |
+
*/
|
49 |
+
public function set($key, $value)
|
50 |
+
{
|
51 |
+
$this->sessionData[$key] = $value;
|
52 |
+
}
|
53 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/PersistentData/FacebookSessionPersistentDataHandler.php
ADDED
@@ -0,0 +1,76 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\PersistentData;
|
25 |
+
|
26 |
+
use Facebook\Exceptions\FacebookSDKException;
|
27 |
+
|
28 |
+
/**
|
29 |
+
* Class FacebookSessionPersistentDataHandler
|
30 |
+
*
|
31 |
+
* @package Facebook
|
32 |
+
*/
|
33 |
+
class FacebookSessionPersistentDataHandler implements PersistentDataInterface
|
34 |
+
{
|
35 |
+
/**
|
36 |
+
* @var string Prefix to use for session variables.
|
37 |
+
*/
|
38 |
+
protected $sessionPrefix = 'FBRLH_';
|
39 |
+
|
40 |
+
/**
|
41 |
+
* Init the session handler.
|
42 |
+
*
|
43 |
+
* @param boolean $enableSessionCheck
|
44 |
+
*
|
45 |
+
* @throws FacebookSDKException
|
46 |
+
*/
|
47 |
+
public function __construct($enableSessionCheck = true)
|
48 |
+
{
|
49 |
+
if ($enableSessionCheck && session_status() !== PHP_SESSION_ACTIVE) {
|
50 |
+
throw new FacebookSDKException(
|
51 |
+
'Sessions are not active. Please make sure session_start() is at the top of your script.',
|
52 |
+
720
|
53 |
+
);
|
54 |
+
}
|
55 |
+
}
|
56 |
+
|
57 |
+
/**
|
58 |
+
* @inheritdoc
|
59 |
+
*/
|
60 |
+
public function get($key)
|
61 |
+
{
|
62 |
+
if (isset($_SESSION[$this->sessionPrefix . $key])) {
|
63 |
+
return $_SESSION[$this->sessionPrefix . $key];
|
64 |
+
}
|
65 |
+
|
66 |
+
return null;
|
67 |
+
}
|
68 |
+
|
69 |
+
/**
|
70 |
+
* @inheritdoc
|
71 |
+
*/
|
72 |
+
public function set($key, $value)
|
73 |
+
{
|
74 |
+
$_SESSION[$this->sessionPrefix . $key] = $value;
|
75 |
+
}
|
76 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/PersistentData/PersistentDataFactory.php
ADDED
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\PersistentData;
|
25 |
+
|
26 |
+
use InvalidArgumentException;
|
27 |
+
|
28 |
+
class PersistentDataFactory
|
29 |
+
{
|
30 |
+
private function __construct()
|
31 |
+
{
|
32 |
+
// a factory constructor should never be invoked
|
33 |
+
}
|
34 |
+
|
35 |
+
/**
|
36 |
+
* PersistentData generation.
|
37 |
+
*
|
38 |
+
* @param PersistentDataInterface|string|null $handler
|
39 |
+
*
|
40 |
+
* @throws InvalidArgumentException If the persistent data handler isn't "session", "memory", or an instance of Facebook\PersistentData\PersistentDataInterface.
|
41 |
+
*
|
42 |
+
* @return PersistentDataInterface
|
43 |
+
*/
|
44 |
+
public static function createPersistentDataHandler($handler)
|
45 |
+
{
|
46 |
+
if (!$handler) {
|
47 |
+
return session_status() === PHP_SESSION_ACTIVE
|
48 |
+
? new FacebookSessionPersistentDataHandler()
|
49 |
+
: new FacebookMemoryPersistentDataHandler();
|
50 |
+
}
|
51 |
+
|
52 |
+
if ($handler instanceof PersistentDataInterface) {
|
53 |
+
return $handler;
|
54 |
+
}
|
55 |
+
|
56 |
+
if ('session' === $handler) {
|
57 |
+
return new FacebookSessionPersistentDataHandler();
|
58 |
+
}
|
59 |
+
if ('memory' === $handler) {
|
60 |
+
return new FacebookMemoryPersistentDataHandler();
|
61 |
+
}
|
62 |
+
|
63 |
+
throw new InvalidArgumentException('The persistent data handler must be set to "session", "memory", or be an instance of Facebook\PersistentData\PersistentDataInterface');
|
64 |
+
}
|
65 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/PersistentData/PersistentDataInterface.php
ADDED
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\PersistentData;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Interface PersistentDataInterface
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
interface PersistentDataInterface
|
32 |
+
{
|
33 |
+
/**
|
34 |
+
* Get a value from a persistent data store.
|
35 |
+
*
|
36 |
+
* @param string $key
|
37 |
+
*
|
38 |
+
* @return mixed
|
39 |
+
*/
|
40 |
+
public function get($key);
|
41 |
+
|
42 |
+
/**
|
43 |
+
* Set a value in the persistent data store.
|
44 |
+
*
|
45 |
+
* @param string $key
|
46 |
+
* @param mixed $value
|
47 |
+
*/
|
48 |
+
public function set($key, $value);
|
49 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/PseudoRandomString/McryptPseudoRandomStringGenerator.php
ADDED
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\PseudoRandomString;
|
25 |
+
|
26 |
+
use Facebook\Exceptions\FacebookSDKException;
|
27 |
+
|
28 |
+
class McryptPseudoRandomStringGenerator implements PseudoRandomStringGeneratorInterface
|
29 |
+
{
|
30 |
+
use PseudoRandomStringGeneratorTrait;
|
31 |
+
|
32 |
+
/**
|
33 |
+
* @const string The error message when generating the string fails.
|
34 |
+
*/
|
35 |
+
const ERROR_MESSAGE = 'Unable to generate a cryptographically secure pseudo-random string from mcrypt_create_iv(). ';
|
36 |
+
|
37 |
+
/**
|
38 |
+
* @throws FacebookSDKException
|
39 |
+
*/
|
40 |
+
public function __construct()
|
41 |
+
{
|
42 |
+
if (!function_exists('mcrypt_create_iv')) {
|
43 |
+
throw new FacebookSDKException(
|
44 |
+
static::ERROR_MESSAGE .
|
45 |
+
'The function mcrypt_create_iv() does not exist.'
|
46 |
+
);
|
47 |
+
}
|
48 |
+
}
|
49 |
+
|
50 |
+
/**
|
51 |
+
* @inheritdoc
|
52 |
+
*/
|
53 |
+
public function getPseudoRandomString($length)
|
54 |
+
{
|
55 |
+
$this->validateLength($length);
|
56 |
+
|
57 |
+
$binaryString = mcrypt_create_iv($length, MCRYPT_DEV_URANDOM);
|
58 |
+
|
59 |
+
if ($binaryString === false) {
|
60 |
+
throw new FacebookSDKException(
|
61 |
+
static::ERROR_MESSAGE .
|
62 |
+
'mcrypt_create_iv() returned an error.'
|
63 |
+
);
|
64 |
+
}
|
65 |
+
|
66 |
+
return $this->binToHex($binaryString, $length);
|
67 |
+
}
|
68 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/PseudoRandomString/OpenSslPseudoRandomStringGenerator.php
ADDED
@@ -0,0 +1,67 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\PseudoRandomString;
|
25 |
+
|
26 |
+
use Facebook\Exceptions\FacebookSDKException;
|
27 |
+
|
28 |
+
class OpenSslPseudoRandomStringGenerator implements PseudoRandomStringGeneratorInterface
|
29 |
+
{
|
30 |
+
use PseudoRandomStringGeneratorTrait;
|
31 |
+
|
32 |
+
/**
|
33 |
+
* @const string The error message when generating the string fails.
|
34 |
+
*/
|
35 |
+
const ERROR_MESSAGE = 'Unable to generate a cryptographically secure pseudo-random string from openssl_random_pseudo_bytes().';
|
36 |
+
|
37 |
+
/**
|
38 |
+
* @throws FacebookSDKException
|
39 |
+
*/
|
40 |
+
public function __construct()
|
41 |
+
{
|
42 |
+
if (!function_exists('openssl_random_pseudo_bytes')) {
|
43 |
+
throw new FacebookSDKException(static::ERROR_MESSAGE . 'The function openssl_random_pseudo_bytes() does not exist.');
|
44 |
+
}
|
45 |
+
}
|
46 |
+
|
47 |
+
/**
|
48 |
+
* @inheritdoc
|
49 |
+
*/
|
50 |
+
public function getPseudoRandomString($length)
|
51 |
+
{
|
52 |
+
$this->validateLength($length);
|
53 |
+
|
54 |
+
$wasCryptographicallyStrong = false;
|
55 |
+
$binaryString = openssl_random_pseudo_bytes($length, $wasCryptographicallyStrong);
|
56 |
+
|
57 |
+
if ($binaryString === false) {
|
58 |
+
throw new FacebookSDKException(static::ERROR_MESSAGE . 'openssl_random_pseudo_bytes() returned an unknown error.');
|
59 |
+
}
|
60 |
+
|
61 |
+
if ($wasCryptographicallyStrong !== true) {
|
62 |
+
throw new FacebookSDKException(static::ERROR_MESSAGE . 'openssl_random_pseudo_bytes() returned a pseudo-random string but it was not cryptographically secure and cannot be used.');
|
63 |
+
}
|
64 |
+
|
65 |
+
return $this->binToHex($binaryString, $length);
|
66 |
+
}
|
67 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/PseudoRandomString/PseudoRandomStringGeneratorFactory.php
ADDED
@@ -0,0 +1,101 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\PseudoRandomString;
|
25 |
+
|
26 |
+
use Facebook\Exceptions\FacebookSDKException;
|
27 |
+
use InvalidArgumentException;
|
28 |
+
|
29 |
+
class PseudoRandomStringGeneratorFactory
|
30 |
+
{
|
31 |
+
private function __construct()
|
32 |
+
{
|
33 |
+
// a factory constructor should never be invoked
|
34 |
+
}
|
35 |
+
|
36 |
+
/**
|
37 |
+
* Pseudo random string generator creation.
|
38 |
+
*
|
39 |
+
* @param PseudoRandomStringGeneratorInterface|string|null $generator
|
40 |
+
*
|
41 |
+
* @throws InvalidArgumentException If the pseudo random string generator must be set to "random_bytes", "mcrypt", "openssl", or "urandom", or be an instance of Facebook\PseudoRandomString\PseudoRandomStringGeneratorInterface.
|
42 |
+
*
|
43 |
+
* @return PseudoRandomStringGeneratorInterface
|
44 |
+
*/
|
45 |
+
public static function createPseudoRandomStringGenerator($generator)
|
46 |
+
{
|
47 |
+
if (!$generator) {
|
48 |
+
return self::detectDefaultPseudoRandomStringGenerator();
|
49 |
+
}
|
50 |
+
|
51 |
+
if ($generator instanceof PseudoRandomStringGeneratorInterface) {
|
52 |
+
return $generator;
|
53 |
+
}
|
54 |
+
|
55 |
+
if ('random_bytes' === $generator) {
|
56 |
+
return new RandomBytesPseudoRandomStringGenerator();
|
57 |
+
}
|
58 |
+
if ('mcrypt' === $generator) {
|
59 |
+
return new McryptPseudoRandomStringGenerator();
|
60 |
+
}
|
61 |
+
if ('openssl' === $generator) {
|
62 |
+
return new OpenSslPseudoRandomStringGenerator();
|
63 |
+
}
|
64 |
+
if ('urandom' === $generator) {
|
65 |
+
return new UrandomPseudoRandomStringGenerator();
|
66 |
+
}
|
67 |
+
|
68 |
+
throw new InvalidArgumentException('The pseudo random string generator must be set to "random_bytes", "mcrypt", "openssl", or "urandom", or be an instance of Facebook\PseudoRandomString\PseudoRandomStringGeneratorInterface');
|
69 |
+
}
|
70 |
+
|
71 |
+
/**
|
72 |
+
* Detects which pseudo-random string generator to use.
|
73 |
+
*
|
74 |
+
* @throws FacebookSDKException If unable to detect a cryptographically secure pseudo-random string generator.
|
75 |
+
*
|
76 |
+
* @return PseudoRandomStringGeneratorInterface
|
77 |
+
*/
|
78 |
+
private static function detectDefaultPseudoRandomStringGenerator()
|
79 |
+
{
|
80 |
+
// Check for PHP 7's CSPRNG first to keep mcrypt deprecation messages from appearing in PHP 7.1.
|
81 |
+
if (function_exists('random_bytes')) {
|
82 |
+
return new RandomBytesPseudoRandomStringGenerator();
|
83 |
+
}
|
84 |
+
|
85 |
+
// Since openssl_random_pseudo_bytes() can sometimes return non-cryptographically
|
86 |
+
// secure pseudo-random strings (in rare cases), we check for mcrypt_create_iv() next.
|
87 |
+
if (function_exists('mcrypt_create_iv')) {
|
88 |
+
return new McryptPseudoRandomStringGenerator();
|
89 |
+
}
|
90 |
+
|
91 |
+
if (function_exists('openssl_random_pseudo_bytes')) {
|
92 |
+
return new OpenSslPseudoRandomStringGenerator();
|
93 |
+
}
|
94 |
+
|
95 |
+
if (!ini_get('open_basedir') && is_readable('/dev/urandom')) {
|
96 |
+
return new UrandomPseudoRandomStringGenerator();
|
97 |
+
}
|
98 |
+
|
99 |
+
throw new FacebookSDKException('Unable to detect a cryptographically secure pseudo-random string generator.');
|
100 |
+
}
|
101 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/PseudoRandomString/PseudoRandomStringGeneratorInterface.php
ADDED
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\PseudoRandomString;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Interface
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
interface PseudoRandomStringGeneratorInterface
|
32 |
+
{
|
33 |
+
/**
|
34 |
+
* Get a cryptographically secure pseudo-random string of arbitrary length.
|
35 |
+
*
|
36 |
+
* @see http://sockpuppet.org/blog/2014/02/25/safely-generate-random-numbers/
|
37 |
+
*
|
38 |
+
* @param int $length The length of the string to return.
|
39 |
+
*
|
40 |
+
* @return string
|
41 |
+
*
|
42 |
+
* @throws \Facebook\Exceptions\FacebookSDKException|\InvalidArgumentException
|
43 |
+
*/
|
44 |
+
public function getPseudoRandomString($length);
|
45 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/PseudoRandomString/PseudoRandomStringGeneratorTrait.php
ADDED
@@ -0,0 +1,58 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\PseudoRandomString;
|
25 |
+
|
26 |
+
trait PseudoRandomStringGeneratorTrait
|
27 |
+
{
|
28 |
+
/**
|
29 |
+
* Validates the length argument of a random string.
|
30 |
+
*
|
31 |
+
* @param int $length The length to validate.
|
32 |
+
*
|
33 |
+
* @throws \InvalidArgumentException
|
34 |
+
*/
|
35 |
+
public function validateLength($length)
|
36 |
+
{
|
37 |
+
if (!is_int($length)) {
|
38 |
+
throw new \InvalidArgumentException('getPseudoRandomString() expects an integer for the string length');
|
39 |
+
}
|
40 |
+
|
41 |
+
if ($length < 1) {
|
42 |
+
throw new \InvalidArgumentException('getPseudoRandomString() expects a length greater than 1');
|
43 |
+
}
|
44 |
+
}
|
45 |
+
|
46 |
+
/**
|
47 |
+
* Converts binary data to hexadecimal of arbitrary length.
|
48 |
+
*
|
49 |
+
* @param string $binaryData The binary data to convert to hex.
|
50 |
+
* @param int $length The length of the string to return.
|
51 |
+
*
|
52 |
+
* @return string
|
53 |
+
*/
|
54 |
+
public function binToHex($binaryData, $length)
|
55 |
+
{
|
56 |
+
return \substr(\bin2hex($binaryData), 0, $length);
|
57 |
+
}
|
58 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/PseudoRandomString/RandomBytesPseudoRandomStringGenerator.php
ADDED
@@ -0,0 +1,59 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\PseudoRandomString;
|
25 |
+
|
26 |
+
use Facebook\Exceptions\FacebookSDKException;
|
27 |
+
|
28 |
+
class RandomBytesPseudoRandomStringGenerator implements PseudoRandomStringGeneratorInterface
|
29 |
+
{
|
30 |
+
use PseudoRandomStringGeneratorTrait;
|
31 |
+
|
32 |
+
/**
|
33 |
+
* @const string The error message when generating the string fails.
|
34 |
+
*/
|
35 |
+
const ERROR_MESSAGE = 'Unable to generate a cryptographically secure pseudo-random string from random_bytes(). ';
|
36 |
+
|
37 |
+
/**
|
38 |
+
* @throws FacebookSDKException
|
39 |
+
*/
|
40 |
+
public function __construct()
|
41 |
+
{
|
42 |
+
if (!function_exists('random_bytes')) {
|
43 |
+
throw new FacebookSDKException(
|
44 |
+
static::ERROR_MESSAGE .
|
45 |
+
'The function random_bytes() does not exist.'
|
46 |
+
);
|
47 |
+
}
|
48 |
+
}
|
49 |
+
|
50 |
+
/**
|
51 |
+
* @inheritdoc
|
52 |
+
*/
|
53 |
+
public function getPseudoRandomString($length)
|
54 |
+
{
|
55 |
+
$this->validateLength($length);
|
56 |
+
|
57 |
+
return $this->binToHex(random_bytes($length), $length);
|
58 |
+
}
|
59 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/PseudoRandomString/UrandomPseudoRandomStringGenerator.php
ADDED
@@ -0,0 +1,89 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\PseudoRandomString;
|
25 |
+
|
26 |
+
use Facebook\Exceptions\FacebookSDKException;
|
27 |
+
|
28 |
+
class UrandomPseudoRandomStringGenerator implements PseudoRandomStringGeneratorInterface
|
29 |
+
{
|
30 |
+
|
31 |
+
use PseudoRandomStringGeneratorTrait;
|
32 |
+
|
33 |
+
/**
|
34 |
+
* @const string The error message when generating the string fails.
|
35 |
+
*/
|
36 |
+
const ERROR_MESSAGE = 'Unable to generate a cryptographically secure pseudo-random string from /dev/urandom. ';
|
37 |
+
|
38 |
+
/**
|
39 |
+
* @throws FacebookSDKException
|
40 |
+
*/
|
41 |
+
public function __construct()
|
42 |
+
{
|
43 |
+
if (ini_get('open_basedir')) {
|
44 |
+
throw new FacebookSDKException(
|
45 |
+
static::ERROR_MESSAGE .
|
46 |
+
'There is an open_basedir constraint that prevents access to /dev/urandom.'
|
47 |
+
);
|
48 |
+
}
|
49 |
+
|
50 |
+
if (!is_readable('/dev/urandom')) {
|
51 |
+
throw new FacebookSDKException(
|
52 |
+
static::ERROR_MESSAGE .
|
53 |
+
'Unable to read from /dev/urandom.'
|
54 |
+
);
|
55 |
+
}
|
56 |
+
}
|
57 |
+
|
58 |
+
/**
|
59 |
+
* @inheritdoc
|
60 |
+
*/
|
61 |
+
public function getPseudoRandomString($length)
|
62 |
+
{
|
63 |
+
$this->validateLength($length);
|
64 |
+
|
65 |
+
$stream = fopen('/dev/urandom', 'rb');
|
66 |
+
if (!is_resource($stream)) {
|
67 |
+
throw new FacebookSDKException(
|
68 |
+
static::ERROR_MESSAGE .
|
69 |
+
'Unable to open stream to /dev/urandom.'
|
70 |
+
);
|
71 |
+
}
|
72 |
+
|
73 |
+
if (!defined('HHVM_VERSION')) {
|
74 |
+
stream_set_read_buffer($stream, 0);
|
75 |
+
}
|
76 |
+
|
77 |
+
$binaryString = fread($stream, $length);
|
78 |
+
fclose($stream);
|
79 |
+
|
80 |
+
if (!$binaryString) {
|
81 |
+
throw new FacebookSDKException(
|
82 |
+
static::ERROR_MESSAGE .
|
83 |
+
'Stream to /dev/urandom returned no data.'
|
84 |
+
);
|
85 |
+
}
|
86 |
+
|
87 |
+
return $this->binToHex($binaryString, $length);
|
88 |
+
}
|
89 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/SignedRequest.php
ADDED
@@ -0,0 +1,326 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook;
|
25 |
+
|
26 |
+
use Facebook\Exceptions\FacebookSDKException;
|
27 |
+
|
28 |
+
/**
|
29 |
+
* Class SignedRequest
|
30 |
+
*
|
31 |
+
* @package Facebook
|
32 |
+
*/
|
33 |
+
class SignedRequest
|
34 |
+
{
|
35 |
+
/**
|
36 |
+
* @var FacebookApp The FacebookApp entity.
|
37 |
+
*/
|
38 |
+
protected $app;
|
39 |
+
|
40 |
+
/**
|
41 |
+
* @var string The raw encrypted signed request.
|
42 |
+
*/
|
43 |
+
protected $rawSignedRequest;
|
44 |
+
|
45 |
+
/**
|
46 |
+
* @var array The payload from the decrypted signed request.
|
47 |
+
*/
|
48 |
+
protected $payload;
|
49 |
+
|
50 |
+
/**
|
51 |
+
* Instantiate a new SignedRequest entity.
|
52 |
+
*
|
53 |
+
* @param FacebookApp $facebookApp The FacebookApp entity.
|
54 |
+
* @param string|null $rawSignedRequest The raw signed request.
|
55 |
+
*/
|
56 |
+
public function __construct(FacebookApp $facebookApp, $rawSignedRequest = null)
|
57 |
+
{
|
58 |
+
$this->app = $facebookApp;
|
59 |
+
|
60 |
+
if (!$rawSignedRequest) {
|
61 |
+
return;
|
62 |
+
}
|
63 |
+
|
64 |
+
$this->rawSignedRequest = $rawSignedRequest;
|
65 |
+
|
66 |
+
$this->parse();
|
67 |
+
}
|
68 |
+
|
69 |
+
/**
|
70 |
+
* Returns the raw signed request data.
|
71 |
+
*
|
72 |
+
* @return string|null
|
73 |
+
*/
|
74 |
+
public function getRawSignedRequest()
|
75 |
+
{
|
76 |
+
return $this->rawSignedRequest;
|
77 |
+
}
|
78 |
+
|
79 |
+
/**
|
80 |
+
* Returns the parsed signed request data.
|
81 |
+
*
|
82 |
+
* @return array|null
|
83 |
+
*/
|
84 |
+
public function getPayload()
|
85 |
+
{
|
86 |
+
return $this->payload;
|
87 |
+
}
|
88 |
+
|
89 |
+
/**
|
90 |
+
* Returns a property from the signed request data if available.
|
91 |
+
*
|
92 |
+
* @param string $key
|
93 |
+
* @param mixed|null $default
|
94 |
+
*
|
95 |
+
* @return mixed|null
|
96 |
+
*/
|
97 |
+
public function get($key, $default = null)
|
98 |
+
{
|
99 |
+
if (isset($this->payload[$key])) {
|
100 |
+
return $this->payload[$key];
|
101 |
+
}
|
102 |
+
|
103 |
+
return $default;
|
104 |
+
}
|
105 |
+
|
106 |
+
/**
|
107 |
+
* Returns user_id from signed request data if available.
|
108 |
+
*
|
109 |
+
* @return string|null
|
110 |
+
*/
|
111 |
+
public function getUserId()
|
112 |
+
{
|
113 |
+
return $this->get('user_id');
|
114 |
+
}
|
115 |
+
|
116 |
+
/**
|
117 |
+
* Checks for OAuth data in the payload.
|
118 |
+
*
|
119 |
+
* @return boolean
|
120 |
+
*/
|
121 |
+
public function hasOAuthData()
|
122 |
+
{
|
123 |
+
return $this->get('oauth_token') || $this->get('code');
|
124 |
+
}
|
125 |
+
|
126 |
+
/**
|
127 |
+
* Creates a signed request from an array of data.
|
128 |
+
*
|
129 |
+
* @param array $payload
|
130 |
+
*
|
131 |
+
* @return string
|
132 |
+
*/
|
133 |
+
public function make(array $payload)
|
134 |
+
{
|
135 |
+
$payload['algorithm'] = isset($payload['algorithm']) ? $payload['algorithm'] : 'HMAC-SHA256';
|
136 |
+
$payload['issued_at'] = isset($payload['issued_at']) ? $payload['issued_at'] : time();
|
137 |
+
$encodedPayload = $this->base64UrlEncode(json_encode($payload));
|
138 |
+
|
139 |
+
$hashedSig = $this->hashSignature($encodedPayload);
|
140 |
+
$encodedSig = $this->base64UrlEncode($hashedSig);
|
141 |
+
|
142 |
+
return $encodedSig . '.' . $encodedPayload;
|
143 |
+
}
|
144 |
+
|
145 |
+
/**
|
146 |
+
* Validates and decodes a signed request and saves
|
147 |
+
* the payload to an array.
|
148 |
+
*/
|
149 |
+
protected function parse()
|
150 |
+
{
|
151 |
+
list($encodedSig, $encodedPayload) = $this->split();
|
152 |
+
|
153 |
+
// Signature validation
|
154 |
+
$sig = $this->decodeSignature($encodedSig);
|
155 |
+
$hashedSig = $this->hashSignature($encodedPayload);
|
156 |
+
$this->validateSignature($hashedSig, $sig);
|
157 |
+
|
158 |
+
$this->payload = $this->decodePayload($encodedPayload);
|
159 |
+
|
160 |
+
// Payload validation
|
161 |
+
$this->validateAlgorithm();
|
162 |
+
}
|
163 |
+
|
164 |
+
/**
|
165 |
+
* Splits a raw signed request into signature and payload.
|
166 |
+
*
|
167 |
+
* @returns array
|
168 |
+
*
|
169 |
+
* @throws FacebookSDKException
|
170 |
+
*/
|
171 |
+
protected function split()
|
172 |
+
{
|
173 |
+
if (strpos($this->rawSignedRequest, '.') === false) {
|
174 |
+
throw new FacebookSDKException('Malformed signed request.', 606);
|
175 |
+
}
|
176 |
+
|
177 |
+
return explode('.', $this->rawSignedRequest, 2);
|
178 |
+
}
|
179 |
+
|
180 |
+
/**
|
181 |
+
* Decodes the raw signature from a signed request.
|
182 |
+
*
|
183 |
+
* @param string $encodedSig
|
184 |
+
*
|
185 |
+
* @returns string
|
186 |
+
*
|
187 |
+
* @throws FacebookSDKException
|
188 |
+
*/
|
189 |
+
protected function decodeSignature($encodedSig)
|
190 |
+
{
|
191 |
+
$sig = $this->base64UrlDecode($encodedSig);
|
192 |
+
|
193 |
+
if (!$sig) {
|
194 |
+
throw new FacebookSDKException('Signed request has malformed encoded signature data.', 607);
|
195 |
+
}
|
196 |
+
|
197 |
+
return $sig;
|
198 |
+
}
|
199 |
+
|
200 |
+
/**
|
201 |
+
* Decodes the raw payload from a signed request.
|
202 |
+
*
|
203 |
+
* @param string $encodedPayload
|
204 |
+
*
|
205 |
+
* @returns array
|
206 |
+
*
|
207 |
+
* @throws FacebookSDKException
|
208 |
+
*/
|
209 |
+
protected function decodePayload($encodedPayload)
|
210 |
+
{
|
211 |
+
$payload = $this->base64UrlDecode($encodedPayload);
|
212 |
+
|
213 |
+
if ($payload) {
|
214 |
+
$payload = json_decode($payload, true);
|
215 |
+
}
|
216 |
+
|
217 |
+
if (!is_array($payload)) {
|
218 |
+
throw new FacebookSDKException('Signed request has malformed encoded payload data.', 607);
|
219 |
+
}
|
220 |
+
|
221 |
+
return $payload;
|
222 |
+
}
|
223 |
+
|
224 |
+
/**
|
225 |
+
* Validates the algorithm used in a signed request.
|
226 |
+
*
|
227 |
+
* @throws FacebookSDKException
|
228 |
+
*/
|
229 |
+
protected function validateAlgorithm()
|
230 |
+
{
|
231 |
+
if ($this->get('algorithm') !== 'HMAC-SHA256') {
|
232 |
+
throw new FacebookSDKException('Signed request is using the wrong algorithm.', 605);
|
233 |
+
}
|
234 |
+
}
|
235 |
+
|
236 |
+
/**
|
237 |
+
* Hashes the signature used in a signed request.
|
238 |
+
*
|
239 |
+
* @param string $encodedData
|
240 |
+
*
|
241 |
+
* @return string
|
242 |
+
*
|
243 |
+
* @throws FacebookSDKException
|
244 |
+
*/
|
245 |
+
protected function hashSignature($encodedData)
|
246 |
+
{
|
247 |
+
$hashedSig = hash_hmac(
|
248 |
+
'sha256',
|
249 |
+
$encodedData,
|
250 |
+
$this->app->getSecret(),
|
251 |
+
$raw_output = true
|
252 |
+
);
|
253 |
+
|
254 |
+
if (!$hashedSig) {
|
255 |
+
throw new FacebookSDKException('Unable to hash signature from encoded payload data.', 602);
|
256 |
+
}
|
257 |
+
|
258 |
+
return $hashedSig;
|
259 |
+
}
|
260 |
+
|
261 |
+
/**
|
262 |
+
* Validates the signature used in a signed request.
|
263 |
+
*
|
264 |
+
* @param string $hashedSig
|
265 |
+
* @param string $sig
|
266 |
+
*
|
267 |
+
* @throws FacebookSDKException
|
268 |
+
*/
|
269 |
+
protected function validateSignature($hashedSig, $sig)
|
270 |
+
{
|
271 |
+
if (\hash_equals($hashedSig, $sig)) {
|
272 |
+
return;
|
273 |
+
}
|
274 |
+
|
275 |
+
throw new FacebookSDKException('Signed request has an invalid signature.', 602);
|
276 |
+
}
|
277 |
+
|
278 |
+
/**
|
279 |
+
* Base64 decoding which replaces characters:
|
280 |
+
* + instead of -
|
281 |
+
* / instead of _
|
282 |
+
*
|
283 |
+
* @link http://en.wikipedia.org/wiki/Base64#URL_applications
|
284 |
+
*
|
285 |
+
* @param string $input base64 url encoded input
|
286 |
+
*
|
287 |
+
* @return string decoded string
|
288 |
+
*/
|
289 |
+
public function base64UrlDecode($input)
|
290 |
+
{
|
291 |
+
$urlDecodedBase64 = strtr($input, '-_', '+/');
|
292 |
+
$this->validateBase64($urlDecodedBase64);
|
293 |
+
|
294 |
+
return base64_decode($urlDecodedBase64);
|
295 |
+
}
|
296 |
+
|
297 |
+
/**
|
298 |
+
* Base64 encoding which replaces characters:
|
299 |
+
* + instead of -
|
300 |
+
* / instead of _
|
301 |
+
*
|
302 |
+
* @link http://en.wikipedia.org/wiki/Base64#URL_applications
|
303 |
+
*
|
304 |
+
* @param string $input string to encode
|
305 |
+
*
|
306 |
+
* @return string base64 url encoded input
|
307 |
+
*/
|
308 |
+
public function base64UrlEncode($input)
|
309 |
+
{
|
310 |
+
return strtr(base64_encode($input), '+/', '-_');
|
311 |
+
}
|
312 |
+
|
313 |
+
/**
|
314 |
+
* Validates a base64 string.
|
315 |
+
*
|
316 |
+
* @param string $input base64 value to validate
|
317 |
+
*
|
318 |
+
* @throws FacebookSDKException
|
319 |
+
*/
|
320 |
+
protected function validateBase64($input)
|
321 |
+
{
|
322 |
+
if (!preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $input)) {
|
323 |
+
throw new FacebookSDKException('Signed request contains malformed base64 encoding.', 608);
|
324 |
+
}
|
325 |
+
}
|
326 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/Url/FacebookUrlDetectionHandler.php
ADDED
@@ -0,0 +1,182 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\Url;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class FacebookUrlDetectionHandler
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
class FacebookUrlDetectionHandler implements UrlDetectionInterface
|
32 |
+
{
|
33 |
+
/**
|
34 |
+
* @inheritdoc
|
35 |
+
*/
|
36 |
+
public function getCurrentUrl()
|
37 |
+
{
|
38 |
+
return $this->getHttpScheme() . '://' . $this->getHostName() . $this->getServerVar('REQUEST_URI');
|
39 |
+
}
|
40 |
+
|
41 |
+
/**
|
42 |
+
* Get the currently active URL scheme.
|
43 |
+
*
|
44 |
+
* @return string
|
45 |
+
*/
|
46 |
+
protected function getHttpScheme()
|
47 |
+
{
|
48 |
+
return $this->isBehindSsl() ? 'https' : 'http';
|
49 |
+
}
|
50 |
+
|
51 |
+
/**
|
52 |
+
* Tries to detect if the server is running behind an SSL.
|
53 |
+
*
|
54 |
+
* @return boolean
|
55 |
+
*/
|
56 |
+
protected function isBehindSsl()
|
57 |
+
{
|
58 |
+
// Check for proxy first
|
59 |
+
$protocol = $this->getHeader('X_FORWARDED_PROTO');
|
60 |
+
if ($protocol) {
|
61 |
+
return $this->protocolWithActiveSsl($protocol);
|
62 |
+
}
|
63 |
+
|
64 |
+
$protocol = $this->getServerVar('HTTPS');
|
65 |
+
if ($protocol) {
|
66 |
+
return $this->protocolWithActiveSsl($protocol);
|
67 |
+
}
|
68 |
+
|
69 |
+
return (string)$this->getServerVar('SERVER_PORT') === '443';
|
70 |
+
}
|
71 |
+
|
72 |
+
/**
|
73 |
+
* Detects an active SSL protocol value.
|
74 |
+
*
|
75 |
+
* @param string $protocol
|
76 |
+
*
|
77 |
+
* @return boolean
|
78 |
+
*/
|
79 |
+
protected function protocolWithActiveSsl($protocol)
|
80 |
+
{
|
81 |
+
$protocol = strtolower((string)$protocol);
|
82 |
+
|
83 |
+
return in_array($protocol, ['on', '1', 'https', 'ssl'], true);
|
84 |
+
}
|
85 |
+
|
86 |
+
/**
|
87 |
+
* Tries to detect the host name of the server.
|
88 |
+
*
|
89 |
+
* Some elements adapted from
|
90 |
+
*
|
91 |
+
* @see https://github.com/symfony/HttpFoundation/blob/master/Request.php
|
92 |
+
*
|
93 |
+
* @return string
|
94 |
+
*/
|
95 |
+
protected function getHostName()
|
96 |
+
{
|
97 |
+
// Check for proxy first
|
98 |
+
$header = $this->getHeader('X_FORWARDED_HOST');
|
99 |
+
if ($header && $this->isValidForwardedHost($header)) {
|
100 |
+
$elements = explode(',', $header);
|
101 |
+
$host = $elements[count($elements) - 1];
|
102 |
+
} elseif (!$host = $this->getHeader('HOST')) {
|
103 |
+
if (!$host = $this->getServerVar('SERVER_NAME')) {
|
104 |
+
$host = $this->getServerVar('SERVER_ADDR');
|
105 |
+
}
|
106 |
+
}
|
107 |
+
|
108 |
+
// trim and remove port number from host
|
109 |
+
// host is lowercase as per RFC 952/2181
|
110 |
+
$host = strtolower(preg_replace('/:\d+$/', '', trim($host)));
|
111 |
+
|
112 |
+
// Port number
|
113 |
+
$scheme = $this->getHttpScheme();
|
114 |
+
$port = $this->getCurrentPort();
|
115 |
+
$appendPort = ':' . $port;
|
116 |
+
|
117 |
+
// Don't append port number if a normal port.
|
118 |
+
if (($scheme == 'http' && $port == '80') || ($scheme == 'https' && $port == '443')) {
|
119 |
+
$appendPort = '';
|
120 |
+
}
|
121 |
+
|
122 |
+
return $host . $appendPort;
|
123 |
+
}
|
124 |
+
|
125 |
+
protected function getCurrentPort()
|
126 |
+
{
|
127 |
+
// Check for proxy first
|
128 |
+
$port = $this->getHeader('X_FORWARDED_PORT');
|
129 |
+
if ($port) {
|
130 |
+
return (string)$port;
|
131 |
+
}
|
132 |
+
|
133 |
+
$protocol = (string)$this->getHeader('X_FORWARDED_PROTO');
|
134 |
+
if ($protocol === 'https') {
|
135 |
+
return '443';
|
136 |
+
}
|
137 |
+
|
138 |
+
return (string)$this->getServerVar('SERVER_PORT');
|
139 |
+
}
|
140 |
+
|
141 |
+
/**
|
142 |
+
* Returns the a value from the $_SERVER super global.
|
143 |
+
*
|
144 |
+
* @param string $key
|
145 |
+
*
|
146 |
+
* @return string
|
147 |
+
*/
|
148 |
+
protected function getServerVar($key)
|
149 |
+
{
|
150 |
+
return isset($_SERVER[$key]) ? $_SERVER[$key] : '';
|
151 |
+
}
|
152 |
+
|
153 |
+
/**
|
154 |
+
* Gets a value from the HTTP request headers.
|
155 |
+
*
|
156 |
+
* @param string $key
|
157 |
+
*
|
158 |
+
* @return string
|
159 |
+
*/
|
160 |
+
protected function getHeader($key)
|
161 |
+
{
|
162 |
+
return $this->getServerVar('HTTP_' . $key);
|
163 |
+
}
|
164 |
+
|
165 |
+
/**
|
166 |
+
* Checks if the value in X_FORWARDED_HOST is a valid hostname
|
167 |
+
* Could prevent unintended redirections
|
168 |
+
*
|
169 |
+
* @param string $header
|
170 |
+
*
|
171 |
+
* @return boolean
|
172 |
+
*/
|
173 |
+
protected function isValidForwardedHost($header)
|
174 |
+
{
|
175 |
+
$elements = explode(',', $header);
|
176 |
+
$host = $elements[count($elements) - 1];
|
177 |
+
|
178 |
+
return preg_match("/^([a-z\d](-*[a-z\d])*)(\.([a-z\d](-*[a-z\d])*))*$/i", $host) //valid chars check
|
179 |
+
&& 0 < strlen($host) && strlen($host) < 254 //overall length check
|
180 |
+
&& preg_match("/^[^\.]{1,63}(\.[^\.]{1,63})*$/", $host); //length of each label
|
181 |
+
}
|
182 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/Url/FacebookUrlManipulator.php
ADDED
@@ -0,0 +1,167 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\Url;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Class FacebookUrlManipulator
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
class FacebookUrlManipulator
|
32 |
+
{
|
33 |
+
/**
|
34 |
+
* Remove params from a URL.
|
35 |
+
*
|
36 |
+
* @param string $url The URL to filter.
|
37 |
+
* @param array $paramsToFilter The params to filter from the URL.
|
38 |
+
*
|
39 |
+
* @return string The URL with the params removed.
|
40 |
+
*/
|
41 |
+
public static function removeParamsFromUrl($url, array $paramsToFilter)
|
42 |
+
{
|
43 |
+
$parts = parse_url($url);
|
44 |
+
|
45 |
+
$query = '';
|
46 |
+
if (isset($parts['query'])) {
|
47 |
+
$params = [];
|
48 |
+
parse_str($parts['query'], $params);
|
49 |
+
|
50 |
+
// Remove query params
|
51 |
+
foreach ($paramsToFilter as $paramName) {
|
52 |
+
unset($params[$paramName]);
|
53 |
+
}
|
54 |
+
|
55 |
+
if (count($params) > 0) {
|
56 |
+
$query = '?' . http_build_query($params, null, '&');
|
57 |
+
}
|
58 |
+
}
|
59 |
+
|
60 |
+
$scheme = isset($parts['scheme']) ? $parts['scheme'] . '://' : '';
|
61 |
+
$host = isset($parts['host']) ? $parts['host'] : '';
|
62 |
+
$port = isset($parts['port']) ? ':' . $parts['port'] : '';
|
63 |
+
$path = isset($parts['path']) ? $parts['path'] : '';
|
64 |
+
$fragment = isset($parts['fragment']) ? '#' . $parts['fragment'] : '';
|
65 |
+
|
66 |
+
return $scheme . $host . $port . $path . $query . $fragment;
|
67 |
+
}
|
68 |
+
|
69 |
+
/**
|
70 |
+
* Gracefully appends params to the URL.
|
71 |
+
*
|
72 |
+
* @param string $url The URL that will receive the params.
|
73 |
+
* @param array $newParams The params to append to the URL.
|
74 |
+
*
|
75 |
+
* @return string
|
76 |
+
*/
|
77 |
+
public static function appendParamsToUrl($url, array $newParams = [])
|
78 |
+
{
|
79 |
+
if (empty($newParams)) {
|
80 |
+
return $url;
|
81 |
+
}
|
82 |
+
|
83 |
+
if (strpos($url, '?') === false) {
|
84 |
+
return $url . '?' . http_build_query($newParams, null, '&');
|
85 |
+
}
|
86 |
+
|
87 |
+
list($path, $query) = explode('?', $url, 2);
|
88 |
+
$existingParams = [];
|
89 |
+
parse_str($query, $existingParams);
|
90 |
+
|
91 |
+
// Favor params from the original URL over $newParams
|
92 |
+
$newParams = array_merge($newParams, $existingParams);
|
93 |
+
|
94 |
+
// Sort for a predicable order
|
95 |
+
ksort($newParams);
|
96 |
+
|
97 |
+
return $path . '?' . http_build_query($newParams, null, '&');
|
98 |
+
}
|
99 |
+
|
100 |
+
/**
|
101 |
+
* Returns the params from a URL in the form of an array.
|
102 |
+
*
|
103 |
+
* @param string $url The URL to parse the params from.
|
104 |
+
*
|
105 |
+
* @return array
|
106 |
+
*/
|
107 |
+
public static function getParamsAsArray($url)
|
108 |
+
{
|
109 |
+
$query = parse_url($url, PHP_URL_QUERY);
|
110 |
+
if (!$query) {
|
111 |
+
return [];
|
112 |
+
}
|
113 |
+
$params = [];
|
114 |
+
parse_str($query, $params);
|
115 |
+
|
116 |
+
return $params;
|
117 |
+
}
|
118 |
+
|
119 |
+
/**
|
120 |
+
* Adds the params of the first URL to the second URL.
|
121 |
+
*
|
122 |
+
* Any params that already exist in the second URL will go untouched.
|
123 |
+
*
|
124 |
+
* @param string $urlToStealFrom The URL harvest the params from.
|
125 |
+
* @param string $urlToAddTo The URL that will receive the new params.
|
126 |
+
*
|
127 |
+
* @return string The $urlToAddTo with any new params from $urlToStealFrom.
|
128 |
+
*/
|
129 |
+
public static function mergeUrlParams($urlToStealFrom, $urlToAddTo)
|
130 |
+
{
|
131 |
+
$newParams = static::getParamsAsArray($urlToStealFrom);
|
132 |
+
// Nothing new to add, return as-is
|
133 |
+
if (!$newParams) {
|
134 |
+
return $urlToAddTo;
|
135 |
+
}
|
136 |
+
|
137 |
+
return static::appendParamsToUrl($urlToAddTo, $newParams);
|
138 |
+
}
|
139 |
+
|
140 |
+
/**
|
141 |
+
* Check for a "/" prefix and prepend it if not exists.
|
142 |
+
*
|
143 |
+
* @param string|null $string
|
144 |
+
*
|
145 |
+
* @return string|null
|
146 |
+
*/
|
147 |
+
public static function forceSlashPrefix($string)
|
148 |
+
{
|
149 |
+
if (!$string) {
|
150 |
+
return $string;
|
151 |
+
}
|
152 |
+
|
153 |
+
return strpos($string, '/') === 0 ? $string : '/' . $string;
|
154 |
+
}
|
155 |
+
|
156 |
+
/**
|
157 |
+
* Trims off the hostname and Graph version from a URL.
|
158 |
+
*
|
159 |
+
* @param string $urlToTrim The URL the needs the surgery.
|
160 |
+
*
|
161 |
+
* @return string The $urlToTrim with the hostname and Graph version removed.
|
162 |
+
*/
|
163 |
+
public static function baseGraphUrlEndpoint($urlToTrim)
|
164 |
+
{
|
165 |
+
return '/' . preg_replace('/^https:\/\/.+\.facebook\.com(\/v.+?)?\//', '', $urlToTrim);
|
166 |
+
}
|
167 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/Url/UrlDetectionInterface.php
ADDED
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
namespace Facebook\Url;
|
25 |
+
|
26 |
+
/**
|
27 |
+
* Interface UrlDetectionInterface
|
28 |
+
*
|
29 |
+
* @package Facebook
|
30 |
+
*/
|
31 |
+
interface UrlDetectionInterface
|
32 |
+
{
|
33 |
+
/**
|
34 |
+
* Get the currently active URL.
|
35 |
+
*
|
36 |
+
* @return string
|
37 |
+
*/
|
38 |
+
public function getCurrentUrl();
|
39 |
+
}
|
hybridauth/Hybrid/thirdparty/Facebook/autoload.php
ADDED
@@ -0,0 +1,81 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
+
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
+
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
+
*
|
23 |
+
*/
|
24 |
+
|
25 |
+
/**
|
26 |
+
* You only need this file if you are not using composer.
|
27 |
+
* Why are you not using composer?
|
28 |
+
* https://getcomposer.org/
|
29 |
+
*/
|
30 |
+
|
31 |
+
if (version_compare(PHP_VERSION, '5.4.0', '<')) {
|
32 |
+
throw new Exception('The Facebook SDK requires PHP version 5.4 or higher.');
|
33 |
+
}
|
34 |
+
|
35 |
+
require_once __DIR__ . '/polyfills.php';
|
36 |
+
|
37 |
+
/**
|
38 |
+
* Register the autoloader for the Facebook SDK classes.
|
39 |
+
*
|
40 |
+
* Based off the official PSR-4 autoloader example found here:
|
41 |
+
* https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md
|
42 |
+
*
|
43 |
+
* @param string $class The fully-qualified class name.
|
44 |
+
*
|
45 |
+
* @return void
|
46 |
+
*/
|
47 |
+
spl_autoload_register(function ($class) {
|
48 |
+
// project-specific namespace prefix
|
49 |
+
$prefix = 'Facebook\\';
|
50 |
+
|
51 |
+
// For backwards compatibility
|
52 |
+
$customBaseDir = '';
|
53 |
+
// @todo v6: Remove support for 'FACEBOOK_SDK_V4_SRC_DIR'
|
54 |
+
if (defined('FACEBOOK_SDK_V4_SRC_DIR')) {
|
55 |
+
$customBaseDir = FACEBOOK_SDK_V4_SRC_DIR;
|
56 |
+
} elseif (defined('FACEBOOK_SDK_SRC_DIR')) {
|
57 |
+
$customBaseDir = FACEBOOK_SDK_SRC_DIR;
|
58 |
+
}
|
59 |
+
// base directory for the namespace prefix
|
60 |
+
$baseDir = $customBaseDir ?: __DIR__ . '/';
|
61 |
+
|
62 |
+
// does the class use the namespace prefix?
|
63 |
+
$len = strlen($prefix);
|
64 |
+
if (strncmp($prefix, $class, $len) !== 0) {
|
65 |
+
// no, move to the next registered autoloader
|
66 |
+
return;
|
67 |
+
}
|
68 |
+
|
69 |
+
// get the relative class name
|
70 |
+
$relativeClass = substr($class, $len);
|
71 |
+
|
72 |
+
// replace the namespace prefix with the base directory, replace namespace
|
73 |
+
// separators with directory separators in the relative class name, append
|
74 |
+
// with .php
|
75 |
+
$file = rtrim($baseDir, '/') . '/' . str_replace('\\', '/', $relativeClass) . '.php';
|
76 |
+
|
77 |
+
// if the file exists, require it
|
78 |
+
if (file_exists($file)) {
|
79 |
+
require $file;
|
80 |
+
}
|
81 |
+
});
|
hybridauth/Hybrid/thirdparty/Facebook/base_facebook.php
DELETED
@@ -1,1574 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Copyright 2011 Facebook, Inc.
|
4 |
-
*
|
5 |
-
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
6 |
-
* not use this file except in compliance with the License. You may obtain
|
7 |
-
* a copy of the License at
|
8 |
-
*
|
9 |
-
* http://www.apache.org/licenses/LICENSE-2.0
|
10 |
-
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
13 |
-
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
14 |
-
* License for the specific language governing permissions and limitations
|
15 |
-
* under the License.
|
16 |
-
*/
|
17 |
-
|
18 |
-
//-
|
19 |
-
define( 'GRAPH_API_VERSION', 'v2.0' );
|
20 |
-
//-
|
21 |
-
|
22 |
-
/**
|
23 |
-
* Thrown when an API call returns an exception.
|
24 |
-
*
|
25 |
-
* @author Naitik Shah <naitik@facebook.com>
|
26 |
-
*/
|
27 |
-
class FacebookApiException extends Exception
|
28 |
-
{
|
29 |
-
/**
|
30 |
-
* The result from the API server that represents the exception information.
|
31 |
-
*
|
32 |
-
* @var mixed
|
33 |
-
*/
|
34 |
-
protected $result;
|
35 |
-
|
36 |
-
/**
|
37 |
-
* Make a new API Exception with the given result.
|
38 |
-
*
|
39 |
-
* @param array $result The result from the API server
|
40 |
-
*/
|
41 |
-
public function __construct($result) {
|
42 |
-
$this->result = $result;
|
43 |
-
|
44 |
-
$code = 0;
|
45 |
-
if (isset($result['error_code']) && is_int($result['error_code'])) {
|
46 |
-
$code = $result['error_code'];
|
47 |
-
}
|
48 |
-
|
49 |
-
if (isset($result['error_description'])) {
|
50 |
-
// OAuth 2.0 Draft 10 style
|
51 |
-
$msg = $result['error_description'];
|
52 |
-
} else if (isset($result['error']) && is_array($result['error'])) {
|
53 |
-
// OAuth 2.0 Draft 00 style
|
54 |
-
$msg = $result['error']['message'];
|
55 |
-
} else if (isset($result['error_msg'])) {
|
56 |
-
// Rest server style
|
57 |
-
$msg = $result['error_msg'];
|
58 |
-
} else {
|
59 |
-
$msg = 'Unknown Error. Check getResult()';
|
60 |
-
}
|
61 |
-
|
62 |
-
parent::__construct($msg, $code);
|
63 |
-
}
|
64 |
-
|
65 |
-
/**
|
66 |
-
* Return the associated result object returned by the API server.
|
67 |
-
*
|
68 |
-
* @return array The result from the API server
|
69 |
-
*/
|
70 |
-
public function getResult() {
|
71 |
-
return $this->result;
|
72 |
-
}
|
73 |
-
|
74 |
-
/**
|
75 |
-
* Returns the associated type for the error. This will default to
|
76 |
-
* 'Exception' when a type is not available.
|
77 |
-
*
|
78 |
-
* @return string
|
79 |
-
*/
|
80 |
-
public function getType() {
|
81 |
-
if (isset($this->result['error'])) {
|
82 |
-
$error = $this->result['error'];
|
83 |
-
if (is_string($error)) {
|
84 |
-
// OAuth 2.0 Draft 10 style
|
85 |
-
return $error;
|
86 |
-
} else if (is_array($error)) {
|
87 |
-
// OAuth 2.0 Draft 00 style
|
88 |
-
if (isset($error['type'])) {
|
89 |
-
return $error['type'];
|
90 |
-
}
|
91 |
-
}
|
92 |
-
}
|
93 |
-
|
94 |
-
return 'Exception';
|
95 |
-
}
|
96 |
-
|
97 |
-
/**
|
98 |
-
* To make debugging easier.
|
99 |
-
*
|
100 |
-
* @return string The string representation of the error
|
101 |
-
*/
|
102 |
-
public function __toString() {
|
103 |
-
$str = $this->getType() . ': ';
|
104 |
-
if ($this->code != 0) {
|
105 |
-
$str .= $this->code . ': ';
|
106 |
-
}
|
107 |
-
return $str . $this->message;
|
108 |
-
}
|
109 |
-
}
|
110 |
-
|
111 |
-
/**
|
112 |
-
* Provides access to the Facebook Platform. This class provides
|
113 |
-
* a majority of the functionality needed, but the class is abstract
|
114 |
-
* because it is designed to be sub-classed. The subclass must
|
115 |
-
* implement the four abstract methods listed at the bottom of
|
116 |
-
* the file.
|
117 |
-
*
|
118 |
-
* @author Naitik Shah <naitik@facebook.com>
|
119 |
-
*/
|
120 |
-
abstract class BaseFacebook
|
121 |
-
{
|
122 |
-
//-
|
123 |
-
public $api_base_url = '';
|
124 |
-
public function get( $url ){ return $this->api( str_ireplace( 'https://graph.facebook.com/' . GRAPH_API_VERSION . '/', '', $url ) ); }
|
125 |
-
public function post( $url, $parameters = array() ){ return $this->api( str_ireplace( 'https://graph.facebook.com/' . GRAPH_API_VERSION . '/', '', $url ), "post", $parameters ); }
|
126 |
-
//-
|
127 |
-
|
128 |
-
/**
|
129 |
-
* Version.
|
130 |
-
*/
|
131 |
-
const VERSION = '3.2.3';
|
132 |
-
|
133 |
-
/**
|
134 |
-
* Signed Request Algorithm.
|
135 |
-
*/
|
136 |
-
const SIGNED_REQUEST_ALGORITHM = 'HMAC-SHA256';
|
137 |
-
|
138 |
-
/**
|
139 |
-
* Default options for curl.
|
140 |
-
*
|
141 |
-
* @var array
|
142 |
-
*/
|
143 |
-
public static $CURL_OPTS = array(
|
144 |
-
CURLOPT_CONNECTTIMEOUT => 30,
|
145 |
-
CURLOPT_RETURNTRANSFER => true,
|
146 |
-
CURLOPT_TIMEOUT => 60,
|
147 |
-
CURLOPT_USERAGENT => 'facebook-php-3.2',
|
148 |
-
CURLOPT_SSL_VERIFYPEER => false,
|
149 |
-
);
|
150 |
-
|
151 |
-
/**
|
152 |
-
* List of query parameters that get automatically dropped when rebuilding
|
153 |
-
* the current URL.
|
154 |
-
*
|
155 |
-
* @var array
|
156 |
-
*/
|
157 |
-
protected static $DROP_QUERY_PARAMS = array(
|
158 |
-
'code',
|
159 |
-
'state',
|
160 |
-
'signed_request',
|
161 |
-
);
|
162 |
-
|
163 |
-
/**
|
164 |
-
* Maps aliases to Facebook domains.
|
165 |
-
*
|
166 |
-
* @var array
|
167 |
-
*/
|
168 |
-
public static $DOMAIN_MAP = array(
|
169 |
-
'api' => 'https://api.facebook.com/',
|
170 |
-
'api_video' => 'https://api-video.facebook.com/',
|
171 |
-
'api_read' => 'https://api-read.facebook.com/',
|
172 |
-
'graph' => 'https://graph.facebook.com/',
|
173 |
-
'graph_video' => 'https://graph-video.facebook.com/',
|
174 |
-
'www' => 'https://www.facebook.com/',
|
175 |
-
);
|
176 |
-
|
177 |
-
/**
|
178 |
-
* The Application ID.
|
179 |
-
*
|
180 |
-
* @var string
|
181 |
-
*/
|
182 |
-
protected $appId;
|
183 |
-
|
184 |
-
/**
|
185 |
-
* The Application App Secret.
|
186 |
-
*
|
187 |
-
* @var string
|
188 |
-
*/
|
189 |
-
protected $appSecret;
|
190 |
-
|
191 |
-
/**
|
192 |
-
* The ID of the Facebook user, or 0 if the user is logged out.
|
193 |
-
*
|
194 |
-
* @var integer
|
195 |
-
*/
|
196 |
-
protected $user;
|
197 |
-
|
198 |
-
/**
|
199 |
-
* The data from the signed_request token.
|
200 |
-
*
|
201 |
-
* @var string
|
202 |
-
*/
|
203 |
-
protected $signedRequest;
|
204 |
-
|
205 |
-
/**
|
206 |
-
* A CSRF state variable to assist in the defense against CSRF attacks.
|
207 |
-
*
|
208 |
-
* @var string
|
209 |
-
*/
|
210 |
-
protected $state;
|
211 |
-
|
212 |
-
/**
|
213 |
-
* The OAuth access token received in exchange for a valid authorization
|
214 |
-
* code. null means the access token has yet to be determined.
|
215 |
-
*
|
216 |
-
* @var string
|
217 |
-
*/
|
218 |
-
protected $accessToken = null;
|
219 |
-
|
220 |
-
/**
|
221 |
-
* Indicates if the CURL based @ syntax for file uploads is enabled.
|
222 |
-
*
|
223 |
-
* @var boolean
|
224 |
-
*/
|
225 |
-
protected $fileUploadSupport = false;
|
226 |
-
|
227 |
-
/**
|
228 |
-
* Indicates if we trust HTTP_X_FORWARDED_* headers.
|
229 |
-
*
|
230 |
-
* @var boolean
|
231 |
-
*/
|
232 |
-
protected $trustForwarded = false;
|
233 |
-
|
234 |
-
/**
|
235 |
-
* Indicates if signed_request is allowed in query parameters.
|
236 |
-
*
|
237 |
-
* @var boolean
|
238 |
-
*/
|
239 |
-
protected $allowSignedRequest = true;
|
240 |
-
|
241 |
-
/**
|
242 |
-
* Initialize a Facebook Application.
|
243 |
-
*
|
244 |
-
* The configuration:
|
245 |
-
* - appId: the application ID
|
246 |
-
* - secret: the application secret
|
247 |
-
* - fileUpload: (optional) boolean indicating if file uploads are enabled
|
248 |
-
* - allowSignedRequest: (optional) boolean indicating if signed_request is
|
249 |
-
* allowed in query parameters or POST body. Should be
|
250 |
-
* false for non-canvas apps. Defaults to true.
|
251 |
-
*
|
252 |
-
* @param array $config The application configuration
|
253 |
-
*/
|
254 |
-
public function __construct($config) {
|
255 |
-
//-
|
256 |
-
$this->api_base_url = 'https://graph.facebook.com/' . GRAPH_API_VERSION . '/';
|
257 |
-
//-
|
258 |
-
|
259 |
-
$this->setAppId($config['appId']);
|
260 |
-
$this->setAppSecret($config['secret']);
|
261 |
-
if (isset($config['fileUpload'])) {
|
262 |
-
$this->setFileUploadSupport($config['fileUpload']);
|
263 |
-
}
|
264 |
-
if (isset($config['trustForwarded']) && $config['trustForwarded']) {
|
265 |
-
$this->trustForwarded = true;
|
266 |
-
}
|
267 |
-
if (isset($config['allowSignedRequest'])
|
268 |
-
&& !$config['allowSignedRequest']) {
|
269 |
-
$this->allowSignedRequest = false;
|
270 |
-
}
|
271 |
-
$state = $this->getPersistentData('state');
|
272 |
-
if (!empty($state)) {
|
273 |
-
$this->state = $state;
|
274 |
-
}
|
275 |
-
}
|
276 |
-
|
277 |
-
/**
|
278 |
-
* Set the Application ID.
|
279 |
-
*
|
280 |
-
* @param string $appId The Application ID
|
281 |
-
*
|
282 |
-
* @return BaseFacebook
|
283 |
-
*/
|
284 |
-
public function setAppId($appId) {
|
285 |
-
$this->appId = $appId;
|
286 |
-
return $this;
|
287 |
-
}
|
288 |
-
|
289 |
-
/**
|
290 |
-
* Get the Application ID.
|
291 |
-
*
|
292 |
-
* @return string the Application ID
|
293 |
-
*/
|
294 |
-
public function getAppId() {
|
295 |
-
return $this->appId;
|
296 |
-
}
|
297 |
-
|
298 |
-
/**
|
299 |
-
* Set the App Secret.
|
300 |
-
*
|
301 |
-
* @param string $apiSecret The App Secret
|
302 |
-
*
|
303 |
-
* @return BaseFacebook
|
304 |
-
* @deprecated Use setAppSecret instead.
|
305 |
-
* @see setAppSecret()
|
306 |
-
*/
|
307 |
-
public function setApiSecret($apiSecret) {
|
308 |
-
$this->setAppSecret($apiSecret);
|
309 |
-
return $this;
|
310 |
-
}
|
311 |
-
|
312 |
-
/**
|
313 |
-
* Set the App Secret.
|
314 |
-
*
|
315 |
-
* @param string $appSecret The App Secret
|
316 |
-
*
|
317 |
-
* @return BaseFacebook
|
318 |
-
*/
|
319 |
-
public function setAppSecret($appSecret) {
|
320 |
-
$this->appSecret = $appSecret;
|
321 |
-
return $this;
|
322 |
-
}
|
323 |
-
|
324 |
-
/**
|
325 |
-
* Get the App Secret.
|
326 |
-
*
|
327 |
-
* @return string the App Secret
|
328 |
-
*
|
329 |
-
* @deprecated Use getAppSecret instead.
|
330 |
-
* @see getAppSecret()
|
331 |
-
*/
|
332 |
-
public function getApiSecret() {
|
333 |
-
return $this->getAppSecret();
|
334 |
-
}
|
335 |
-
|
336 |
-
/**
|
337 |
-
* Get the App Secret.
|
338 |
-
*
|
339 |
-
* @return string the App Secret
|
340 |
-
*/
|
341 |
-
public function getAppSecret() {
|
342 |
-
return $this->appSecret;
|
343 |
-
}
|
344 |
-
|
345 |
-
/**
|
346 |
-
* Set the file upload support status.
|
347 |
-
*
|
348 |
-
* @param boolean $fileUploadSupport The file upload support status.
|
349 |
-
*
|
350 |
-
* @return BaseFacebook
|
351 |
-
*/
|
352 |
-
public function setFileUploadSupport($fileUploadSupport) {
|
353 |
-
$this->fileUploadSupport = $fileUploadSupport;
|
354 |
-
return $this;
|
355 |
-
}
|
356 |
-
|
357 |
-
/**
|
358 |
-
* Get the file upload support status.
|
359 |
-
*
|
360 |
-
* @return boolean true if and only if the server supports file upload.
|
361 |
-
*/
|
362 |
-
public function getFileUploadSupport() {
|
363 |
-
return $this->fileUploadSupport;
|
364 |
-
}
|
365 |
-
|
366 |
-
/**
|
367 |
-
* Get the file upload support status.
|
368 |
-
*
|
369 |
-
* @return boolean true if and only if the server supports file upload.
|
370 |
-
*
|
371 |
-
* @deprecated Use getFileUploadSupport instead.
|
372 |
-
* @see getFileUploadSupport()
|
373 |
-
*/
|
374 |
-
public function useFileUploadSupport() {
|
375 |
-
return $this->getFileUploadSupport();
|
376 |
-
}
|
377 |
-
|
378 |
-
/**
|
379 |
-
* Sets the access token for api calls. Use this if you get
|
380 |
-
* your access token by other means and just want the SDK
|
381 |
-
* to use it.
|
382 |
-
*
|
383 |
-
* @param string $access_token an access token.
|
384 |
-
*
|
385 |
-
* @return BaseFacebook
|
386 |
-
*/
|
387 |
-
public function setAccessToken($access_token) {
|
388 |
-
$this->accessToken = $access_token;
|
389 |
-
return $this;
|
390 |
-
}
|
391 |
-
|
392 |
-
/**
|
393 |
-
* Extend an access token, while removing the short-lived token that might
|
394 |
-
* have been generated via client-side flow. Thanks to http://bit.ly/b0Pt0H
|
395 |
-
* for the workaround.
|
396 |
-
*/
|
397 |
-
public function setExtendedAccessToken() {
|
398 |
-
try {
|
399 |
-
// need to circumvent json_decode by calling _oauthRequest
|
400 |
-
// directly, since response isn't JSON format.
|
401 |
-
$access_token_response = $this->_oauthRequest(
|
402 |
-
$this->getUrl('graph', '/oauth/access_token'),
|
403 |
-
$params = array(
|
404 |
-
'client_id' => $this->getAppId(),
|
405 |
-
'client_secret' => $this->getAppSecret(),
|
406 |
-
'grant_type' => 'fb_exchange_token',
|
407 |
-
'fb_exchange_token' => $this->getAccessToken(),
|
408 |
-
)
|
409 |
-
);
|
410 |
-
}
|
411 |
-
catch (FacebookApiException $e) {
|
412 |
-
// most likely that user very recently revoked authorization.
|
413 |
-
// In any event, we don't have an access token, so say so.
|
414 |
-
return false;
|
415 |
-
}
|
416 |
-
|
417 |
-
if (empty($access_token_response)) {
|
418 |
-
return false;
|
419 |
-
}
|
420 |
-
|
421 |
-
$response_params = array();
|
422 |
-
parse_str($access_token_response, $response_params);
|
423 |
-
|
424 |
-
if (!isset($response_params['access_token'])) {
|
425 |
-
return false;
|
426 |
-
}
|
427 |
-
|
428 |
-
$this->destroySession();
|
429 |
-
|
430 |
-
$this->setPersistentData(
|
431 |
-
'access_token', $response_params['access_token']
|
432 |
-
);
|
433 |
-
}
|
434 |
-
|
435 |
-
/**
|
436 |
-
* Determines the access token that should be used for API calls.
|
437 |
-
* The first time this is called, $this->accessToken is set equal
|
438 |
-
* to either a valid user access token, or it's set to the application
|
439 |
-
* access token if a valid user access token wasn't available. Subsequent
|
440 |
-
* calls return whatever the first call returned.
|
441 |
-
*
|
442 |
-
* @return string The access token
|
443 |
-
*/
|
444 |
-
public function getAccessToken() {
|
445 |
-
if ($this->accessToken !== null) {
|
446 |
-
// we've done this already and cached it. Just return.
|
447 |
-
return $this->accessToken;
|
448 |
-
}
|
449 |
-
|
450 |
-
// first establish access token to be the application
|
451 |
-
// access token, in case we navigate to the /oauth/access_token
|
452 |
-
// endpoint, where SOME access token is required.
|
453 |
-
$this->setAccessToken($this->getApplicationAccessToken());
|
454 |
-
$user_access_token = $this->getUserAccessToken();
|
455 |
-
if ($user_access_token) {
|
456 |
-
$this->setAccessToken($user_access_token);
|
457 |
-
}
|
458 |
-
|
459 |
-
return $this->accessToken;
|
460 |
-
}
|
461 |
-
|
462 |
-
/**
|
463 |
-
* Determines and returns the user access token, first using
|
464 |
-
* the signed request if present, and then falling back on
|
465 |
-
* the authorization code if present. The intent is to
|
466 |
-
* return a valid user access token, or false if one is determined
|
467 |
-
* to not be available.
|
468 |
-
*
|
469 |
-
* @return string A valid user access token, or false if one
|
470 |
-
* could not be determined.
|
471 |
-
*/
|
472 |
-
protected function getUserAccessToken() {
|
473 |
-
// first, consider a signed request if it's supplied.
|
474 |
-
// if there is a signed request, then it alone determines
|
475 |
-
// the access token.
|
476 |
-
$signed_request = $this->getSignedRequest();
|
477 |
-
if ($signed_request) {
|
478 |
-
// apps.facebook.com hands the access_token in the signed_request
|
479 |
-
if (array_key_exists('oauth_token', $signed_request)) {
|
480 |
-
$access_token = $signed_request['oauth_token'];
|
481 |
-
$this->setPersistentData('access_token', $access_token);
|
482 |
-
return $access_token;
|
483 |
-
}
|
484 |
-
|
485 |
-
// the JS SDK puts a code in with the redirect_uri of ''
|
486 |
-
if (array_key_exists('code', $signed_request)) {
|
487 |
-
$code = $signed_request['code'];
|
488 |
-
if ($code && $code == $this->getPersistentData('code')) {
|
489 |
-
// short-circuit if the code we have is the same as the one presented
|
490 |
-
return $this->getPersistentData('access_token');
|
491 |
-
}
|
492 |
-
|
493 |
-
$access_token = $this->getAccessTokenFromCode($code, '');
|
494 |
-
if ($access_token) {
|
495 |
-
$this->setPersistentData('code', $code);
|
496 |
-
$this->setPersistentData('access_token', $access_token);
|
497 |
-
return $access_token;
|
498 |
-
}
|
499 |
-
}
|
500 |
-
|
501 |
-
// signed request states there's no access token, so anything
|
502 |
-
// stored should be cleared.
|
503 |
-
$this->clearAllPersistentData();
|
504 |
-
return false; // respect the signed request's data, even
|
505 |
-
// if there's an authorization code or something else
|
506 |
-
}
|
507 |
-
|
508 |
-
$code = $this->getCode();
|
509 |
-
if ($code && $code != $this->getPersistentData('code')) {
|
510 |
-
$access_token = $this->getAccessTokenFromCode($code);
|
511 |
-
if ($access_token) {
|
512 |
-
$this->setPersistentData('code', $code);
|
513 |
-
$this->setPersistentData('access_token', $access_token);
|
514 |
-
return $access_token;
|
515 |
-
}
|
516 |
-
|
517 |
-
// code was bogus, so everything based on it should be invalidated.
|
518 |
-
$this->clearAllPersistentData();
|
519 |
-
return false;
|
520 |
-
}
|
521 |
-
|
522 |
-
// as a fallback, just return whatever is in the persistent
|
523 |
-
// store, knowing nothing explicit (signed request, authorization
|
524 |
-
// code, etc.) was present to shadow it (or we saw a code in $_REQUEST,
|
525 |
-
// but it's the same as what's in the persistent store)
|
526 |
-
return $this->getPersistentData('access_token');
|
527 |
-
}
|
528 |
-
|
529 |
-
/**
|
530 |
-
* Retrieve the signed request, either from a request parameter or,
|
531 |
-
* if not present, from a cookie.
|
532 |
-
*
|
533 |
-
* @return string the signed request, if available, or null otherwise.
|
534 |
-
*/
|
535 |
-
public function getSignedRequest() {
|
536 |
-
if (!$this->signedRequest) {
|
537 |
-
if ($this->allowSignedRequest && !empty($_REQUEST['signed_request'])) {
|
538 |
-
$this->signedRequest = $this->parseSignedRequest(
|
539 |
-
$_REQUEST['signed_request']
|
540 |
-
);
|
541 |
-
} else if (!empty($_COOKIE[$this->getSignedRequestCookieName()])) {
|
542 |
-
$this->signedRequest = $this->parseSignedRequest(
|
543 |
-
$_COOKIE[$this->getSignedRequestCookieName()]);
|
544 |
-
}
|
545 |
-
}
|
546 |
-
return $this->signedRequest;
|
547 |
-
}
|
548 |
-
|
549 |
-
/**
|
550 |
-
* Get the UID of the connected user, or 0
|
551 |
-
* if the Facebook user is not connected.
|
552 |
-
*
|
553 |
-
* @return string the UID if available.
|
554 |
-
*/
|
555 |
-
public function getUser() {
|
556 |
-
if ($this->user !== null) {
|
557 |
-
// we've already determined this and cached the value.
|
558 |
-
return $this->user;
|
559 |
-
}
|
560 |
-
|
561 |
-
return $this->user = $this->getUserFromAvailableData();
|
562 |
-
}
|
563 |
-
|
564 |
-
/**
|
565 |
-
* Determines the connected user by first examining any signed
|
566 |
-
* requests, then considering an authorization code, and then
|
567 |
-
* falling back to any persistent store storing the user.
|
568 |
-
*
|
569 |
-
* @return integer The id of the connected Facebook user,
|
570 |
-
* or 0 if no such user exists.
|
571 |
-
*/
|
572 |
-
protected function getUserFromAvailableData() {
|
573 |
-
// if a signed request is supplied, then it solely determines
|
574 |
-
// who the user is.
|
575 |
-
$signed_request = $this->getSignedRequest();
|
576 |
-
if ($signed_request) {
|
577 |
-
if (array_key_exists('user_id', $signed_request)) {
|
578 |
-
$user = $signed_request['user_id'];
|
579 |
-
|
580 |
-
if($user != $this->getPersistentData('user_id')){
|
581 |
-
$this->clearAllPersistentData();
|
582 |
-
}
|
583 |
-
|
584 |
-
$this->setPersistentData('user_id', $signed_request['user_id']);
|
585 |
-
return $user;
|
586 |
-
}
|
587 |
-
|
588 |
-
// if the signed request didn't present a user id, then invalidate
|
589 |
-
// all entries in any persistent store.
|
590 |
-
$this->clearAllPersistentData();
|
591 |
-
return 0;
|
592 |
-
}
|
593 |
-
|
594 |
-
$user = $this->getPersistentData('user_id', $default = 0);
|
595 |
-
$persisted_access_token = $this->getPersistentData('access_token');
|
596 |
-
|
597 |
-
// use access_token to fetch user id if we have a user access_token, or if
|
598 |
-
// the cached access token has changed.
|
599 |
-
$access_token = $this->getAccessToken();
|
600 |
-
if ($access_token &&
|
601 |
-
$access_token != $this->getApplicationAccessToken() &&
|
602 |
-
!($user && $persisted_access_token == $access_token)) {
|
603 |
-
$user = $this->getUserFromAccessToken();
|
604 |
-
if ($user) {
|
605 |
-
$this->setPersistentData('user_id', $user);
|
606 |
-
} else {
|
607 |
-
$this->clearAllPersistentData();
|
608 |
-
}
|
609 |
-
}
|
610 |
-
|
611 |
-
return $user;
|
612 |
-
}
|
613 |
-
|
614 |
-
/**
|
615 |
-
* Get a Login URL for use with redirects. By default, full page redirect is
|
616 |
-
* assumed. If you are using the generated URL with a window.open() call in
|
617 |
-
* JavaScript, you can pass in display=popup as part of the $params.
|
618 |
-
*
|
619 |
-
* The parameters:
|
620 |
-
* - redirect_uri: the url to go to after a successful login
|
621 |
-
* - scope: comma separated list of requested extended perms
|
622 |
-
*
|
623 |
-
* @param array $params Provide custom parameters
|
624 |
-
* @return string The URL for the login flow
|
625 |
-
*/
|
626 |
-
public function getLoginUrl($params=array()) {
|
627 |
-
$this->establishCSRFTokenState();
|
628 |
-
$currentUrl = $this->getCurrentUrl();
|
629 |
-
|
630 |
-
// if 'scope' is passed as an array, convert to comma separated list
|
631 |
-
$scopeParams = isset($params['scope']) ? $params['scope'] : null;
|
632 |
-
if ($scopeParams && is_array($scopeParams)) {
|
633 |
-
$params['scope'] = implode(',', $scopeParams);
|
634 |
-
}
|
635 |
-
|
636 |
-
return $this->getUrl(
|
637 |
-
'www',
|
638 |
-
'dialog/oauth',
|
639 |
-
array_merge(
|
640 |
-
array(
|
641 |
-
'client_id' => $this->getAppId(),
|
642 |
-
'redirect_uri' => $currentUrl, // possibly overwritten
|
643 |
-
'state' => $this->state,
|
644 |
-
'sdk' => 'php-sdk-'.self::VERSION
|
645 |
-
),
|
646 |
-
$params
|
647 |
-
));
|
648 |
-
}
|
649 |
-
|
650 |
-
/**
|
651 |
-
* Get a Logout URL suitable for use with redirects.
|
652 |
-
*
|
653 |
-
* The parameters:
|
654 |
-
* - next: the url to go to after a successful logout
|
655 |
-
*
|
656 |
-
* @param array $params Provide custom parameters
|
657 |
-
* @return string The URL for the logout flow
|
658 |
-
*/
|
659 |
-
public function getLogoutUrl($params=array()) {
|
660 |
-
return $this->getUrl(
|
661 |
-
'www',
|
662 |
-
'logout.php',
|
663 |
-
array_merge(array(
|
664 |
-
'next' => $this->getCurrentUrl(),
|
665 |
-
'access_token' => $this->getUserAccessToken(),
|
666 |
-
), $params)
|
667 |
-
);
|
668 |
-
}
|
669 |
-
|
670 |
-
/**
|
671 |
-
* Get a login status URL to fetch the status from Facebook.
|
672 |
-
*
|
673 |
-
* @param array $params Provide custom parameters
|
674 |
-
* @return string The URL for the logout flow
|
675 |
-
*/
|
676 |
-
public function getLoginStatusUrl($params=array()) {
|
677 |
-
return $this->getLoginUrl(
|
678 |
-
array_merge(array(
|
679 |
-
'response_type' => 'code',
|
680 |
-
'display' => 'none',
|
681 |
-
), $params)
|
682 |
-
);
|
683 |
-
}
|
684 |
-
|
685 |
-
/**
|
686 |
-
* Make an API call.
|
687 |
-
*
|
688 |
-
* @return mixed The decoded response
|
689 |
-
*/
|
690 |
-
public function api(/* polymorphic */) {
|
691 |
-
$args = func_get_args();
|
692 |
-
// print_r( func_get_args() ); die();
|
693 |
-
if (is_array($args[0])) {
|
694 |
-
return $this->_restserver($args[0]);
|
695 |
-
} else {
|
696 |
-
return call_user_func_array(array($this, '_graph'), $args);
|
697 |
-
}
|
698 |
-
}
|
699 |
-
|
700 |
-
/**
|
701 |
-
* Constructs and returns the name of the cookie that
|
702 |
-
* potentially houses the signed request for the app user.
|
703 |
-
* The cookie is not set by the BaseFacebook class, but
|
704 |
-
* it may be set by the JavaScript SDK.
|
705 |
-
*
|
706 |
-
* @return string the name of the cookie that would house
|
707 |
-
* the signed request value.
|
708 |
-
*/
|
709 |
-
protected function getSignedRequestCookieName() {
|
710 |
-
return 'fbsr_'.$this->getAppId();
|
711 |
-
}
|
712 |
-
|
713 |
-
/**
|
714 |
-
* Constructs and returns the name of the cookie that potentially contain
|
715 |
-
* metadata. The cookie is not set by the BaseFacebook class, but it may be
|
716 |
-
* set by the JavaScript SDK.
|
717 |
-
*
|
718 |
-
* @return string the name of the cookie that would house metadata.
|
719 |
-
*/
|
720 |
-
protected function getMetadataCookieName() {
|
721 |
-
return 'fbm_'.$this->getAppId();
|
722 |
-
}
|
723 |
-
|
724 |
-
/**
|
725 |
-
* Get the authorization code from the query parameters, if it exists,
|
726 |
-
* and otherwise return false to signal no authorization code was
|
727 |
-
* discoverable.
|
728 |
-
*
|
729 |
-
* @return mixed The authorization code, or false if the authorization
|
730 |
-
* code could not be determined.
|
731 |
-
*/
|
732 |
-
protected function getCode() {
|
733 |
-
if (!isset($_REQUEST['code']) || !isset($_REQUEST['state'])) {
|
734 |
-
return false;
|
735 |
-
}
|
736 |
-
if ($this->state === $_REQUEST['state']) {
|
737 |
-
// CSRF state has done its job, so clear it
|
738 |
-
$this->state = null;
|
739 |
-
$this->clearPersistentData('state');
|
740 |
-
return $_REQUEST['code'];
|
741 |
-
}
|
742 |
-
self::errorLog('CSRF state token does not match one provided.');
|
743 |
-
|
744 |
-
return false;
|
745 |
-
}
|
746 |
-
|
747 |
-
/**
|
748 |
-
* Retrieves the UID with the understanding that
|
749 |
-
* $this->accessToken has already been set and is
|
750 |
-
* seemingly legitimate. It relies on Facebook's Graph API
|
751 |
-
* to retrieve user information and then extract
|
752 |
-
* the user ID.
|
753 |
-
*
|
754 |
-
* @return integer Returns the UID of the Facebook user, or 0
|
755 |
-
* if the Facebook user could not be determined.
|
756 |
-
*/
|
757 |
-
protected function getUserFromAccessToken() {
|
758 |
-
try {
|
759 |
-
$user_info = $this->api('/me');
|
760 |
-
return $user_info['id'];
|
761 |
-
} catch (FacebookApiException $e) {
|
762 |
-
return 0;
|
763 |
-
}
|
764 |
-
}
|
765 |
-
|
766 |
-
/**
|
767 |
-
* Returns the access token that should be used for logged out
|
768 |
-
* users when no authorization code is available.
|
769 |
-
*
|
770 |
-
* @return string The application access token, useful for gathering
|
771 |
-
* public information about users and applications.
|
772 |
-
*/
|
773 |
-
public function getApplicationAccessToken() {
|
774 |
-
return $this->appId.'|'.$this->appSecret;
|
775 |
-
}
|
776 |
-
|
777 |
-
/**
|
778 |
-
* Lays down a CSRF state token for this process.
|
779 |
-
*
|
780 |
-
* @return void
|
781 |
-
*/
|
782 |
-
protected function establishCSRFTokenState() {
|
783 |
-
if ($this->state === null) {
|
784 |
-
$this->state = md5(uniqid(mt_rand(), true));
|
785 |
-
$this->setPersistentData('state', $this->state);
|
786 |
-
}
|
787 |
-
}
|
788 |
-
|
789 |
-
/**
|
790 |
-
* Retrieves an access token for the given authorization code
|
791 |
-
* (previously generated from www.facebook.com on behalf of
|
792 |
-
* a specific user). The authorization code is sent to graph.facebook.com
|
793 |
-
* and a legitimate access token is generated provided the access token
|
794 |
-
* and the user for which it was generated all match, and the user is
|
795 |
-
* either logged in to Facebook or has granted an offline access permission.
|
796 |
-
*
|
797 |
-
* @param string $code An authorization code.
|
798 |
-
* @param string $redirect_uri Optional redirect URI. Default null
|
799 |
-
*
|
800 |
-
* @return mixed An access token exchanged for the authorization code, or
|
801 |
-
* false if an access token could not be generated.
|
802 |
-
*/
|
803 |
-
protected function getAccessTokenFromCode($code, $redirect_uri = null) {
|
804 |
-
if (empty($code)) {
|
805 |
-
return false;
|
806 |
-
}
|
807 |
-
|
808 |
-
if ($redirect_uri === null) {
|
809 |
-
$redirect_uri = $this->getCurrentUrl();
|
810 |
-
}
|
811 |
-
|
812 |
-
try {
|
813 |
-
// need to circumvent json_decode by calling _oauthRequest
|
814 |
-
// directly, since response isn't JSON format.
|
815 |
-
$access_token_response =
|
816 |
-
$this->_oauthRequest(
|
817 |
-
$this->getUrl('graph', '/oauth/access_token'),
|
818 |
-
$params = array('client_id' => $this->getAppId(),
|
819 |
-
'client_secret' => $this->getAppSecret(),
|
820 |
-
'redirect_uri' => $redirect_uri,
|
821 |
-
'code' => $code));
|
822 |
-
} catch (FacebookApiException $e) {
|
823 |
-
// most likely that user very recently revoked authorization.
|
824 |
-
// In any event, we don't have an access token, so say so.
|
825 |
-
return false;
|
826 |
-
}
|
827 |
-
|
828 |
-
if (empty($access_token_response)) {
|
829 |
-
return false;
|
830 |
-
}
|
831 |
-
|
832 |
-
$response_params = array();
|
833 |
-
parse_str($access_token_response, $response_params);
|
834 |
-
if (!isset($response_params['access_token'])) {
|
835 |
-
return false;
|
836 |
-
}
|
837 |
-
|
838 |
-
return $response_params['access_token'];
|
839 |
-
}
|
840 |
-
|
841 |
-
/**
|
842 |
-
* Invoke the old restserver.php endpoint.
|
843 |
-
*
|
844 |
-
* @param array $params Method call object
|
845 |
-
*
|
846 |
-
* @return mixed The decoded response object
|
847 |
-
* @throws FacebookApiException
|
848 |
-
*/
|
849 |
-
protected function _restserver($params) {
|
850 |
-
// generic application level parameters
|
851 |
-
$params['api_key'] = $this->getAppId();
|
852 |
-
$params['format'] = 'json-strings';
|
853 |
-
|
854 |
-
$result = json_decode($this->_oauthRequest(
|
855 |
-
$this->getApiUrl($params['method']),
|
856 |
-
$params
|
857 |
-
), true);
|
858 |
-
|
859 |
-
// results are returned, errors are thrown
|
860 |
-
if (is_array($result) && isset($result['error_code'])) {
|
861 |
-
$this->throwAPIException($result);
|
862 |
-
// @codeCoverageIgnoreStart
|
863 |
-
}
|
864 |
-
// @codeCoverageIgnoreEnd
|
865 |
-
|
866 |
-
$method = strtolower($params['method']);
|
867 |
-
if ($method === 'auth.expiresession' ||
|
868 |
-
$method === 'auth.revokeauthorization') {
|
869 |
-
$this->destroySession();
|
870 |
-
}
|
871 |
-
|
872 |
-
return $result;
|
873 |
-
}
|
874 |
-
|
875 |
-
/**
|
876 |
-
* Return true if this is video post.
|
877 |
-
*
|
878 |
-
* @param string $path The path
|
879 |
-
* @param string $method The http method (default 'GET')
|
880 |
-
*
|
881 |
-
* @return boolean true if this is video post
|
882 |
-
*/
|
883 |
-
protected function isVideoPost($path, $method = 'GET') {
|
884 |
-
if ($method == 'POST' && preg_match("/^(\/)(.+)(\/)(videos)$/", $path)) {
|
885 |
-
return true;
|
886 |
-
}
|
887 |
-
return false;
|
888 |
-
}
|
889 |
-
|
890 |
-
/**
|
891 |
-
* Invoke the Graph API.
|
892 |
-
*
|
893 |
-
* @param string $path The path (required)
|
894 |
-
* @param string $method The http method (default 'GET')
|
895 |
-
* @param array $params The query/post data
|
896 |
-
*
|
897 |
-
* @return mixed The decoded response object
|
898 |
-
* @throws FacebookApiException
|
899 |
-
*/
|
900 |
-
protected function _graph($path, $method = 'GET', $params = array()) {
|
901 |
-
if (is_array($method) && empty($params)) {
|
902 |
-
$params = $method;
|
903 |
-
$method = 'GET';
|
904 |
-
}
|
905 |
-
$params['method'] = $method; // method override as we always do a POST
|
906 |
-
|
907 |
-
if ($this->isVideoPost($path, $method)) {
|
908 |
-
$domainKey = 'graph_video';
|
909 |
-
} else {
|
910 |
-
$domainKey = 'graph';
|
911 |
-
}
|
912 |
-
|
913 |
-
$result = json_decode($this->_oauthRequest(
|
914 |
-
$this->getUrl($domainKey, $path),
|
915 |
-
$params
|
916 |
-
), true);
|
917 |
-
|
918 |
-
// results are returned, errors are thrown
|
919 |
-
if (is_array($result) && isset($result['error'])) {
|
920 |
-
$this->throwAPIException($result);
|
921 |
-
// @codeCoverageIgnoreStart
|
922 |
-
}
|
923 |
-
// @codeCoverageIgnoreEnd
|
924 |
-
|
925 |
-
return $result;
|
926 |
-
}
|
927 |
-
|
928 |
-
/**
|
929 |
-
* Make a OAuth Request.
|
930 |
-
*
|
931 |
-
* @param string $url The path (required)
|
932 |
-
* @param array $params The query/post data
|
933 |
-
*
|
934 |
-
* @return string The decoded response object
|
935 |
-
* @throws FacebookApiException
|
936 |
-
*/
|
937 |
-
protected function _oauthRequest($url, $params) {
|
938 |
-
if (!isset($params['access_token'])) {
|
939 |
-
$params['access_token'] = $this->getAccessToken();
|
940 |
-
}
|
941 |
-
|
942 |
-
if (isset($params['access_token']) && !isset($params['appsecret_proof'])) {
|
943 |
-
$params['appsecret_proof'] = $this->getAppSecretProof($params['access_token']);
|
944 |
-
}
|
945 |
-
|
946 |
-
// json_encode all params values that are not strings
|
947 |
-
foreach ($params as $key => $value) {
|
948 |
-
if (!is_string($value) && !($value instanceof CURLFile)) {
|
949 |
-
$params[$key] = json_encode($value);
|
950 |
-
}
|
951 |
-
}
|
952 |
-
|
953 |
-
return $this->makeRequest($url, $params);
|
954 |
-
}
|
955 |
-
|
956 |
-
/**
|
957 |
-
* Generate a proof of App Secret
|
958 |
-
* This is required for all API calls originating from a server
|
959 |
-
* It is a sha256 hash of the access_token made using the app secret
|
960 |
-
*
|
961 |
-
* @param string $access_token The access_token to be hashed (required)
|
962 |
-
*
|
963 |
-
* @return string The sha256 hash of the access_token
|
964 |
-
*/
|
965 |
-
protected function getAppSecretProof($access_token) {
|
966 |
-
return hash_hmac('sha256', $access_token, $this->getAppSecret());
|
967 |
-
}
|
968 |
-
|
969 |
-
/**
|
970 |
-
* Makes an HTTP request. This method can be overridden by subclasses if
|
971 |
-
* developers want to do fancier things or use something other than curl to
|
972 |
-
* make the request.
|
973 |
-
*
|
974 |
-
* @param string $url The URL to make the request to
|
975 |
-
* @param array $params The parameters to use for the POST body
|
976 |
-
* @param CurlHandler $ch Initialized curl handle
|
977 |
-
*
|
978 |
-
* @return string The response text
|
979 |
-
*/
|
980 |
-
protected function makeRequest($url, $params, $ch=null) {
|
981 |
-
if (!$ch) {
|
982 |
-
$ch = curl_init();
|
983 |
-
}
|
984 |
-
|
985 |
-
$opts = self::$CURL_OPTS;
|
986 |
-
if ($this->getFileUploadSupport()) {
|
987 |
-
$opts[CURLOPT_POSTFIELDS] = $params;
|
988 |
-
} else {
|
989 |
-
$opts[CURLOPT_POSTFIELDS] = http_build_query($params, null, '&');
|
990 |
-
}
|
991 |
-
$opts[CURLOPT_URL] = $url;
|
992 |
-
|
993 |
-
// disable the 'Expect: 100-continue' behaviour. This causes CURL to wait
|
994 |
-
// for 2 seconds if the server does not support this header.
|
995 |
-
if (isset($opts[CURLOPT_HTTPHEADER])) {
|
996 |
-
$existing_headers = $opts[CURLOPT_HTTPHEADER];
|
997 |
-
$existing_headers[] = 'Expect:';
|
998 |
-
$opts[CURLOPT_HTTPHEADER] = $existing_headers;
|
999 |
-
} else {
|
1000 |
-
$opts[CURLOPT_HTTPHEADER] = array('Expect:');
|
1001 |
-
}
|
1002 |
-
|
1003 |
-
curl_setopt_array($ch, $opts);
|
1004 |
-
$result = curl_exec($ch);
|
1005 |
-
|
1006 |
-
$errno = curl_errno($ch);
|
1007 |
-
// CURLE_SSL_CACERT || CURLE_SSL_CACERT_BADFILE
|
1008 |
-
if ($errno == 60 || $errno == 77) {
|
1009 |
-
self::errorLog('Invalid or no certificate authority found, '.
|
1010 |
-
'using bundled information');
|
1011 |
-
curl_setopt($ch, CURLOPT_CAINFO,
|
1012 |
-
dirname(__FILE__) . DIRECTORY_SEPARATOR . 'fb_ca_chain_bundle.crt');
|
1013 |
-
$result = curl_exec($ch);
|
1014 |
-
}
|
1015 |
-
|
1016 |
-
// With dual stacked DNS responses, it's possible for a server to
|
1017 |
-
// have IPv6 enabled but not have IPv6 connectivity. If this is
|
1018 |
-
// the case, curl will try IPv4 first and if that fails, then it will
|
1019 |
-
// fall back to IPv6 and the error EHOSTUNREACH is returned by the
|
1020 |
-
// operating system.
|
1021 |
-
if ($result === false && empty($opts[CURLOPT_IPRESOLVE])) {
|
1022 |
-
$matches = array();
|
1023 |
-
$regex = '/Failed to connect to ([^:].*): Network is unreachable/';
|
1024 |
-
if (preg_match($regex, curl_error($ch), $matches)) {
|
1025 |
-
if (strlen(@inet_pton($matches[1])) === 16) {
|
1026 |
-
self::errorLog('Invalid IPv6 configuration on server, '.
|
1027 |
-
'Please disable or get native IPv6 on your server.');
|
1028 |
-
self::$CURL_OPTS[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V4;
|
1029 |
-
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
|
1030 |
-
$result = curl_exec($ch);
|
1031 |
-
}
|
1032 |
-
}
|
1033 |
-
}
|
1034 |
-
|
1035 |
-
//-
|
1036 |
-
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
1037 |
-
|
1038 |
-
Hybrid_Error::deleteApiError();
|
1039 |
-
|
1040 |
-
if( $http_code != 200 )
|
1041 |
-
{
|
1042 |
-
Hybrid_Error::setApiError( $http_code . '. ' . preg_replace('/\s+/', ' ', $result ) );
|
1043 |
-
}
|
1044 |
-
|
1045 |
-
if( defined( 'WORDPRESS_SOCIAL_LOGIN_DEBUG_API_CALLS' ) )
|
1046 |
-
{
|
1047 |
-
do_action( 'wsl_log_provider_api_call', 'OAuth2.Facebook', $opts[CURLOPT_URL], null, $opts[CURLOPT_POSTFIELDS], $http_code, curl_getinfo($ch), $result );
|
1048 |
-
}
|
1049 |
-
//-
|
1050 |
-
|
1051 |
-
if ($result === false) {
|
1052 |
-
$e = new FacebookApiException(array(
|
1053 |
-
'error_code' => curl_errno($ch),
|
1054 |
-
'error' => array(
|
1055 |
-
'message' => curl_error($ch),
|
1056 |
-
'type' => 'CurlException',
|
1057 |
-
),
|
1058 |
-
));
|
1059 |
-
curl_close($ch);
|
1060 |
-
throw $e;
|
1061 |
-
}
|
1062 |
-
curl_close($ch);
|
1063 |
-
|
1064 |
-
|
1065 |
-
return $result;
|
1066 |
-
}
|
1067 |
-
|
1068 |
-
/**
|
1069 |
-
* Parses a signed_request and validates the signature.
|
1070 |
-
*
|
1071 |
-
* @param string $signed_request A signed token
|
1072 |
-
*
|
1073 |
-
* @return array The payload inside it or null if the sig is wrong
|
1074 |
-
*/
|
1075 |
-
protected function parseSignedRequest($signed_request) {
|
1076 |
-
|
1077 |
-
if (!$signed_request || strpos($signed_request, '.') === false) {
|
1078 |
-
self::errorLog('Signed request was invalid!');
|
1079 |
-
return null;
|
1080 |
-
}
|
1081 |
-
|
1082 |
-
list($encoded_sig, $payload) = explode('.', $signed_request, 2);
|
1083 |
-
|
1084 |
-
// decode the data
|
1085 |
-
$sig = self::base64UrlDecode($encoded_sig);
|
1086 |
-
$data = json_decode(self::base64UrlDecode($payload), true);
|
1087 |
-
|
1088 |
-
if (!isset($data['algorithm'])
|
1089 |
-
|| strtoupper($data['algorithm']) !== self::SIGNED_REQUEST_ALGORITHM
|
1090 |
-
) {
|
1091 |
-
self::errorLog(
|
1092 |
-
'Unknown algorithm. Expected ' . self::SIGNED_REQUEST_ALGORITHM);
|
1093 |
-
return null;
|
1094 |
-
}
|
1095 |
-
|
1096 |
-
// check sig
|
1097 |
-
$expected_sig = hash_hmac('sha256', $payload,
|
1098 |
-
$this->getAppSecret(), $raw = true);
|
1099 |
-
|
1100 |
-
if (strlen($expected_sig) !== strlen($sig)) {
|
1101 |
-
self::errorLog('Bad Signed JSON signature!');
|
1102 |
-
return null;
|
1103 |
-
}
|
1104 |
-
|
1105 |
-
$result = 0;
|
1106 |
-
for ($i = 0; $i < strlen($expected_sig); $i++) {
|
1107 |
-
$result |= ord($expected_sig[$i]) ^ ord($sig[$i]);
|
1108 |
-
}
|
1109 |
-
|
1110 |
-
if ($result == 0) {
|
1111 |
-
return $data;
|
1112 |
-
} else {
|
1113 |
-
self::errorLog('Bad Signed JSON signature!');
|
1114 |
-
return null;
|
1115 |
-
}
|
1116 |
-
}
|
1117 |
-
|
1118 |
-
/**
|
1119 |
-
* Makes a signed_request blob using the given data.
|
1120 |
-
*
|
1121 |
-
* @param array $data The data array.
|
1122 |
-
*
|
1123 |
-
* @return string The signed request.
|
1124 |
-
*/
|
1125 |
-
protected function makeSignedRequest($data) {
|
1126 |
-
if (!is_array($data)) {
|
1127 |
-
throw new InvalidArgumentException(
|
1128 |
-
'makeSignedRequest expects an array. Got: ' . print_r($data, true));
|
1129 |
-
}
|
1130 |
-
$data['algorithm'] = self::SIGNED_REQUEST_ALGORITHM;
|
1131 |
-
$data['issued_at'] = time();
|
1132 |
-
$json = json_encode($data);
|
1133 |
-
$b64 = self::base64UrlEncode($json);
|
1134 |
-
$raw_sig = hash_hmac('sha256', $b64, $this->getAppSecret(), $raw = true);
|
1135 |
-
$sig = self::base64UrlEncode($raw_sig);
|
1136 |
-
return $sig.'.'.$b64;
|
1137 |
-
}
|
1138 |
-
|
1139 |
-
/**
|
1140 |
-
* Build the URL for api given parameters.
|
1141 |
-
*
|
1142 |
-
* @param string $method The method name.
|
1143 |
-
*
|
1144 |
-
* @return string The URL for the given parameters
|
1145 |
-
*/
|
1146 |
-
protected function getApiUrl($method) {
|
1147 |
-
static $READ_ONLY_CALLS =
|
1148 |
-
array('admin.getallocation' => 1,
|
1149 |
-
'admin.getappproperties' => 1,
|
1150 |
-
'admin.getbannedusers' => 1,
|
1151 |
-
'admin.getlivestreamvialink' => 1,
|
1152 |
-
'admin.getmetrics' => 1,
|
1153 |
-
'admin.getrestrictioninfo' => 1,
|
1154 |
-
'application.getpublicinfo' => 1,
|
1155 |
-
'auth.getapppublickey' => 1,
|
1156 |
-
'auth.getsession' => 1,
|
1157 |
-
'auth.getsignedpublicsessiondata' => 1,
|
1158 |
-
'comments.get' => 1,
|
1159 |
-
'connect.getunconnectedfriendscount' => 1,
|
1160 |
-
'dashboard.getactivity' => 1,
|
1161 |
-
'dashboard.getcount' => 1,
|
1162 |
-
'dashboard.getglobalnews' => 1,
|
1163 |
-
'dashboard.getnews' => 1,
|
1164 |
-
'dashboard.multigetcount' => 1,
|
1165 |
-
'dashboard.multigetnews' => 1,
|
1166 |
-
'data.getcookies' => 1,
|
1167 |
-
'events.get' => 1,
|
1168 |
-
'events.getmembers' => 1,
|
1169 |
-
'fbml.getcustomtags' => 1,
|
1170 |
-
'feed.getappfriendstories' => 1,
|
1171 |
-
'feed.getregisteredtemplatebundlebyid' => 1,
|
1172 |
-
'feed.getregisteredtemplatebundles' => 1,
|
1173 |
-
'fql.multiquery' => 1,
|
1174 |
-
'fql.query' => 1,
|
1175 |
-
'friends.arefriends' => 1,
|
1176 |
-
'friends.get' => 1,
|
1177 |
-
'friends.getappusers' => 1,
|
1178 |
-
'friends.getlists' => 1,
|
1179 |
-
'friends.getmutualfriends' => 1,
|
1180 |
-
'gifts.get' => 1,
|
1181 |
-
'groups.get' => 1,
|
1182 |
-
'groups.getmembers' => 1,
|
1183 |
-
'intl.gettranslations' => 1,
|
1184 |
-
'links.get' => 1,
|
1185 |
-
'notes.get' => 1,
|
1186 |
-
'notifications.get' => 1,
|
1187 |
-
'pages.getinfo' => 1,
|
1188 |
-
'pages.isadmin' => 1,
|
1189 |
-
'pages.isappadded' => 1,
|
1190 |
-
'pages.isfan' => 1,
|
1191 |
-
'permissions.checkavailableapiaccess' => 1,
|
1192 |
-
'permissions.checkgrantedapiaccess' => 1,
|
1193 |
-
'photos.get' => 1,
|
1194 |
-
'photos.getalbums' => 1,
|
1195 |
-
'photos.gettags' => 1,
|
1196 |
-
'profile.getinfo' => 1,
|
1197 |
-
'profile.getinfooptions' => 1,
|
1198 |
-
'stream.get' => 1,
|
1199 |
-
'stream.getcomments' => 1,
|
1200 |
-
'stream.getfilters' => 1,
|
1201 |
-
'users.getinfo' => 1,
|
1202 |
-
'users.getloggedinuser' => 1,
|
1203 |
-
'users.getstandardinfo' => 1,
|
1204 |
-
'users.hasapppermission' => 1,
|
1205 |
-
'users.isappuser' => 1,
|
1206 |
-
'users.isverified' => 1,
|
1207 |
-
'video.getuploadlimits' => 1);
|
1208 |
-
$name = 'api';
|
1209 |
-
if (isset($READ_ONLY_CALLS[strtolower($method)])) {
|
1210 |
-
$name = 'api_read';
|
1211 |
-
} else if (strtolower($method) == 'video.upload') {
|
1212 |
-
$name = 'api_video';
|
1213 |
-
}
|
1214 |
-
return self::getUrl($name, 'restserver.php');
|
1215 |
-
}
|
1216 |
-
|
1217 |
-
/**
|
1218 |
-
* Build the URL for given domain alias, path and parameters.
|
1219 |
-
*
|
1220 |
-
* @param string $name The name of the domain
|
1221 |
-
* @param string $path Optional path (without a leading slash)
|
1222 |
-
* @param array $params Optional query parameters
|
1223 |
-
*
|
1224 |
-
* @return string The URL for the given parameters
|
1225 |
-
*/
|
1226 |
-
protected function getUrl($name, $path='', $params=array()) {
|
1227 |
-
//-
|
1228 |
-
$url = self::$DOMAIN_MAP[$name] . GRAPH_API_VERSION . '/';
|
1229 |
-
//-
|
1230 |
-
if ($path) {
|
1231 |
-
if ($path[0] === '/') {
|
1232 |
-
$path = substr($path, 1);
|
1233 |
-
}
|
1234 |
-
$url .= $path;
|
1235 |
-
}
|
1236 |
-
if ($params) {
|
1237 |
-
$url .= '?' . http_build_query($params, null, '&');
|
1238 |
-
}
|
1239 |
-
|
1240 |
-
return $url;
|
1241 |
-
}
|
1242 |
-
|
1243 |
-
/**
|
1244 |
-
* Returns the HTTP Host
|
1245 |
-
*
|
1246 |
-
* @return string The HTTP Host
|
1247 |
-
*/
|
1248 |
-
protected function getHttpHost() {
|
1249 |
-
if ($this->trustForwarded && isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
|
1250 |
-
$forwardProxies = explode(',', $_SERVER['HTTP_X_FORWARDED_HOST']);
|
1251 |
-
if (!empty($forwardProxies)) {
|
1252 |
-
return $forwardProxies[0];
|
1253 |
-
}
|
1254 |
-
}
|
1255 |
-
return $_SERVER['HTTP_HOST'];
|
1256 |
-
}
|
1257 |
-
|
1258 |
-
/**
|
1259 |
-
* Returns the HTTP Protocol
|
1260 |
-
*
|
1261 |
-
* @return string The HTTP Protocol
|
1262 |
-
*/
|
1263 |
-
protected function getHttpProtocol() {
|
1264 |
-
if ($this->trustForwarded && isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) {
|
1265 |
-
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
|
1266 |
-
return 'https';
|
1267 |
-
}
|
1268 |
-
return 'http';
|
1269 |
-
}
|
1270 |
-
/*apache + variants specific way of checking for https*/
|
1271 |
-
if (isset($_SERVER['HTTPS']) &&
|
1272 |
-
($_SERVER['HTTPS'] === 'on' || $_SERVER['HTTPS'] == 1)) {
|
1273 |
-
return 'https';
|
1274 |
-
}
|
1275 |
-
/*nginx way of checking for https*/
|
1276 |
-
if (isset($_SERVER['SERVER_PORT']) &&
|
1277 |
-
($_SERVER['SERVER_PORT'] === '443')) {
|
1278 |
-
return 'https';
|
1279 |
-
}
|
1280 |
-
return 'http';
|
1281 |
-
}
|
1282 |
-
|
1283 |
-
/**
|
1284 |
-
* Returns the base domain used for the cookie.
|
1285 |
-
*
|
1286 |
-
* @return string The base domain
|
1287 |
-
*/
|
1288 |
-
protected function getBaseDomain() {
|
1289 |
-
// The base domain is stored in the metadata cookie if not we fallback
|
1290 |
-
// to the current hostname
|
1291 |
-
$metadata = $this->getMetadataCookie();
|
1292 |
-
if (array_key_exists('base_domain', $metadata) &&
|
1293 |
-
!empty($metadata['base_domain'])) {
|
1294 |
-
return trim($metadata['base_domain'], '.');
|
1295 |
-
}
|
1296 |
-
return $this->getHttpHost();
|
1297 |
-
}
|
1298 |
-
|
1299 |
-
/**
|
1300 |
-
* Returns the Current URL, stripping it of known FB parameters that should
|
1301 |
-
* not persist.
|
1302 |
-
*
|
1303 |
-
* @return string The current URL
|
1304 |
-
*/
|
1305 |
-
protected function getCurrentUrl() {
|
1306 |
-
$protocol = $this->getHttpProtocol() . '://';
|
1307 |
-
$host = $this->getHttpHost();
|
1308 |
-
$currentUrl = $protocol.$host.$_SERVER['REQUEST_URI'];
|
1309 |
-
$parts = parse_url($currentUrl);
|
1310 |
-
|
1311 |
-
$query = '';
|
1312 |
-
if (!empty($parts['query'])) {
|
1313 |
-
// drop known fb params
|
1314 |
-
$params = explode('&', $parts['query']);
|
1315 |
-
$retained_params = array();
|
1316 |
-
foreach ($params as $param) {
|
1317 |
-
if ($this->shouldRetainParam($param)) {
|
1318 |
-
$retained_params[] = $param;
|
1319 |
-
}
|
1320 |
-
}
|
1321 |
-
|
1322 |
-
if (!empty($retained_params)) {
|
1323 |
-
$query = '?'.implode($retained_params, '&');
|
1324 |
-
}
|
1325 |
-
}
|
1326 |
-
|
1327 |
-
// use port if non default
|
1328 |
-
$port =
|
1329 |
-
isset($parts['port']) &&
|
1330 |
-
(($protocol === 'http://' && $parts['port'] !== 80) ||
|
1331 |
-
($protocol === 'https://' && $parts['port'] !== 443))
|
1332 |
-
? ':' . $parts['port'] : '';
|
1333 |
-
|
1334 |
-
// rebuild
|
1335 |
-
return $protocol . $parts['host'] . $port . $parts['path'] . $query;
|
1336 |
-
}
|
1337 |
-
|
1338 |
-
/**
|
1339 |
-
* Returns true if and only if the key or key/value pair should
|
1340 |
-
* be retained as part of the query string. This amounts to
|
1341 |
-
* a brute-force search of the very small list of Facebook-specific
|
1342 |
-
* params that should be stripped out.
|
1343 |
-
*
|
1344 |
-
* @param string $param A key or key/value pair within a URL's query (e.g.
|
1345 |
-
* 'foo=a', 'foo=', or 'foo'.
|
1346 |
-
*
|
1347 |
-
* @return boolean
|
1348 |
-
*/
|
1349 |
-
protected function shouldRetainParam($param) {
|
1350 |
-
foreach (self::$DROP_QUERY_PARAMS as $drop_query_param) {
|
1351 |
-
if ($param === $drop_query_param ||
|
1352 |
-
strpos($param, $drop_query_param.'=') === 0) {
|
1353 |
-
return false;
|
1354 |
-
}
|
1355 |
-
}
|
1356 |
-
|
1357 |
-
return true;
|
1358 |
-
}
|
1359 |
-
|
1360 |
-
/**
|
1361 |
-
* Analyzes the supplied result to see if it was thrown
|
1362 |
-
* because the access token is no longer valid. If that is
|
1363 |
-
* the case, then we destroy the session.
|
1364 |
-
*
|
1365 |
-
* @param array $result A record storing the error message returned
|
1366 |
-
* by a failed API call.
|
1367 |
-
*/
|
1368 |
-
protected function throwAPIException($result) {
|
1369 |
-
$e = new FacebookApiException($result);
|
1370 |
-
switch ($e->getType()) {
|
1371 |
-
// OAuth 2.0 Draft 00 style
|
1372 |
-
case 'OAuthException':
|
1373 |
-
// OAuth 2.0 Draft 10 style
|
1374 |
-
case 'invalid_token':
|
1375 |
-
// REST server errors are just Exceptions
|
1376 |
-
case 'Exception':
|
1377 |
-
$message = $e->getMessage();
|
1378 |
-
if ((strpos($message, 'Error validating access token') !== false) ||
|
1379 |
-
(strpos($message, 'Invalid OAuth access token') !== false) ||
|
1380 |
-
(strpos($message, 'An active access token must be used') !== false)
|
1381 |
-
) {
|
1382 |
-
$this->destroySession();
|
1383 |
-
}
|
1384 |
-
break;
|
1385 |
-
}
|
1386 |
-
|
1387 |
-
throw $e;
|
1388 |
-
}
|
1389 |
-
|
1390 |
-
|
1391 |
-
/**
|
1392 |
-
* Prints to the error log if you aren't in command line mode.
|
1393 |
-
*
|
1394 |
-
* @param string $msg Log message
|
1395 |
-
*/
|
1396 |
-
protected static function errorLog($msg) {
|
1397 |
-
// disable error log if we are running in a CLI environment
|
1398 |
-
// @codeCoverageIgnoreStart
|
1399 |
-
if (php_sapi_name() != 'cli') {
|
1400 |
-
error_log($msg);
|
1401 |
-
}
|
1402 |
-
// uncomment this if you want to see the errors on the page
|
1403 |
-
// print 'error_log: '.$msg."\n";
|
1404 |
-
// @codeCoverageIgnoreEnd
|
1405 |
-
}
|
1406 |
-
|
1407 |
-
/**
|
1408 |
-
* Base64 encoding that doesn't need to be urlencode()ed.
|
1409 |
-
* Exactly the same as base64_encode except it uses
|
1410 |
-
* - instead of +
|
1411 |
-
* _ instead of /
|
1412 |
-
* No padded =
|
1413 |
-
*
|
1414 |
-
* @param string $input base64UrlEncoded input
|
1415 |
-
*
|
1416 |
-
* @return string The decoded string
|
1417 |
-
*/
|
1418 |
-
protected static function base64UrlDecode($input) {
|
1419 |
-
return base64_decode(strtr($input, '-_', '+/'));
|
1420 |
-
}
|
1421 |
-
|
1422 |
-
/**
|
1423 |
-
* Base64 encoding that doesn't need to be urlencode()ed.
|
1424 |
-
* Exactly the same as base64_encode except it uses
|
1425 |
-
* - instead of +
|
1426 |
-
* _ instead of /
|
1427 |
-
*
|
1428 |
-
* @param string $input The input to encode
|
1429 |
-
* @return string The base64Url encoded input, as a string.
|
1430 |
-
*/
|
1431 |
-
protected static function base64UrlEncode($input) {
|
1432 |
-
$str = strtr(base64_encode($input), '+/', '-_');
|
1433 |
-
$str = str_replace('=', '', $str);
|
1434 |
-
return $str;
|
1435 |
-
}
|
1436 |
-
|
1437 |
-
/**
|
1438 |
-
* Destroy the current session
|
1439 |
-
*/
|
1440 |
-
public function destroySession() {
|
1441 |
-
$this->accessToken = null;
|
1442 |
-
$this->signedRequest = null;
|
1443 |
-
$this->user = null;
|
1444 |
-
$this->clearAllPersistentData();
|
1445 |
-
|
1446 |
-
// Javascript sets a cookie that will be used in getSignedRequest that we
|
1447 |
-
// need to clear if we can
|
1448 |
-
$cookie_name = $this->getSignedRequestCookieName();
|
1449 |
-
if (array_key_exists($cookie_name, $_COOKIE)) {
|
1450 |
-
unset($_COOKIE[$cookie_name]);
|
1451 |
-
if (!headers_sent()) {
|
1452 |
-
$base_domain = $this->getBaseDomain();
|
1453 |
-
setcookie($cookie_name, '', 1, '/', '.'.$base_domain);
|
1454 |
-
} else {
|
1455 |
-
// @codeCoverageIgnoreStart
|
1456 |
-
self::errorLog(
|
1457 |
-
'There exists a cookie that we wanted to clear that we couldn\'t '.
|
1458 |
-
'clear because headers was already sent. Make sure to do the first '.
|
1459 |
-
'API call before outputing anything.'
|
1460 |
-
);
|
1461 |
-
// @codeCoverageIgnoreEnd
|
1462 |
-
}
|
1463 |
-
}
|
1464 |
-
}
|
1465 |
-
|
1466 |
-
/**
|
1467 |
-
* Parses the metadata cookie that our Javascript API set
|
1468 |
-
*
|
1469 |
-
* @return array an array mapping key to value
|
1470 |
-
*/
|
1471 |
-
protected function getMetadataCookie() {
|
1472 |
-
$cookie_name = $this->getMetadataCookieName();
|
1473 |
-
if (!array_key_exists($cookie_name, $_COOKIE)) {
|
1474 |
-
return array();
|
1475 |
-
}
|
1476 |
-
|
1477 |
-
// The cookie value can be wrapped in "-characters so remove them
|
1478 |
-
$cookie_value = trim($_COOKIE[$cookie_name], '"');
|
1479 |
-
|
1480 |
-
if (empty($cookie_value)) {
|
1481 |
-
return array();
|
1482 |
-
}
|
1483 |
-
|
1484 |
-
$parts = explode('&', $cookie_value);
|
1485 |
-
$metadata = array();
|
1486 |
-
foreach ($parts as $part) {
|
1487 |
-
$pair = explode('=', $part, 2);
|
1488 |
-
if (!empty($pair[0])) {
|
1489 |
-
$metadata[urldecode($pair[0])] =
|
1490 |
-
(count($pair) > 1) ? urldecode($pair[1]) : '';
|
1491 |
-
}
|
1492 |
-
}
|
1493 |
-
|
1494 |
-
return $metadata;
|
1495 |
-
}
|
1496 |
-
|
1497 |
-
/**
|
1498 |
-
* Finds whether the given domain is allowed or not
|
1499 |
-
*
|
1500 |
-
* @param string $big The value to be checked against $small
|
1501 |
-
* @param string $small The input string
|
1502 |
-
*
|
1503 |
-
* @return boolean Returns TRUE if $big matches $small
|
1504 |
-
*/
|
1505 |
-
protected static function isAllowedDomain($big, $small) {
|
1506 |
-
if ($big === $small) {
|
1507 |
-
return true;
|
1508 |
-
}
|
1509 |
-
return self::endsWith($big, '.'.$small);
|
1510 |
-
}
|
1511 |
-
|
1512 |
-
/**
|
1513 |
-
* Checks if $big string ends with $small string
|
1514 |
-
*
|
1515 |
-
* @param string $big The value to be checked against $small
|
1516 |
-
* @param string $small The input string
|
1517 |
-
*
|
1518 |
-
* @return boolean TRUE if $big ends with $small
|
1519 |
-
*/
|
1520 |
-
protected static function endsWith($big, $small) {
|
1521 |
-
$len = strlen($small);
|
1522 |
-
if ($len === 0) {
|
1523 |
-
return true;
|
1524 |
-
}
|
1525 |
-
return substr($big, -$len) === $small;
|
1526 |
-
}
|
1527 |
-
|
1528 |
-
/**
|
1529 |
-
* Each of the following four methods should be overridden in
|
1530 |
-
* a concrete subclass, as they are in the provided Facebook class.
|
1531 |
-
* The Facebook class uses PHP sessions to provide a primitive
|
1532 |
-
* persistent store, but another subclass--one that you implement--
|
1533 |
-
* might use a database, memcache, or an in-memory cache.
|
1534 |
-
*
|
1535 |
-
* @see Facebook
|
1536 |
-
*/
|
1537 |
-
|
1538 |
-
/**
|
1539 |
-
* Stores the given ($key, $value) pair, so that future calls to
|
1540 |
-
* getPersistentData($key) return $value. This call may be in another request.
|
1541 |
-
*
|
1542 |
-
* @param string $key
|
1543 |
-
* @param array $value
|
1544 |
-
*
|
1545 |
-
* @return void
|
1546 |
-
*/
|
1547 |
-
abstract protected function setPersistentData($key, $value);
|
1548 |
-
|
1549 |
-
/**
|
1550 |
-
* Get the data for $key, persisted by BaseFacebook::setPersistentData()
|
1551 |
-
*
|
1552 |
-
* @param string $key The key of the data to retrieve
|
1553 |
-
* @param boolean $default The default value to return if $key is not found
|
1554 |
-
*
|
1555 |
-
* @return mixed
|
1556 |
-
*/
|
1557 |
-
abstract protected function getPersistentData($key, $default = false);
|
1558 |
-
|
1559 |
-
/**
|
1560 |
-
* Clear the data with $key from the persistent storage
|
1561 |
-
*
|
1562 |
-
* @param string $key
|
1563 |
-
*
|
1564 |
-
* @return void
|
1565 |
-
*/
|
1566 |
-
abstract protected function clearPersistentData($key);
|
1567 |
-
|
1568 |
-
/**
|
1569 |
-
* Clear all data from the persistent storage
|
1570 |
-
*
|
1571 |
-
* @return void
|
1572 |
-
*/
|
1573 |
-
abstract protected function clearAllPersistentData();
|
1574 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
hybridauth/Hybrid/thirdparty/Facebook/facebook.php
CHANGED
@@ -1,228 +1,614 @@
|
|
1 |
<?php
|
2 |
/**
|
3 |
-
* Copyright
|
4 |
*
|
5 |
-
*
|
6 |
-
*
|
7 |
-
*
|
|
|
8 |
*
|
9 |
-
*
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
*
|
11 |
-
* Unless required by applicable law or agreed to in writing, software
|
12 |
-
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
13 |
-
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
14 |
-
* License for the specific language governing permissions and limitations
|
15 |
-
* under the License.
|
16 |
*/
|
|
|
17 |
|
18 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
|
20 |
/**
|
21 |
-
*
|
22 |
-
*
|
|
|
23 |
*/
|
24 |
-
class Facebook
|
25 |
{
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
|
225 |
-
|
226 |
-
|
227 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
228 |
}
|
1 |
<?php
|
2 |
/**
|
3 |
+
* Copyright 2017 Facebook, Inc.
|
4 |
*
|
5 |
+
* You are hereby granted a non-exclusive, worldwide, royalty-free license to
|
6 |
+
* use, copy, modify, and distribute this software in source code or binary
|
7 |
+
* form for use in connection with the web services and APIs provided by
|
8 |
+
* Facebook.
|
9 |
*
|
10 |
+
* As with any software that integrates with the Facebook platform, your use
|
11 |
+
* of this software is subject to the Facebook Developer Principles and
|
12 |
+
* Policies [http://developers.facebook.com/policy/]. This copyright notice
|
13 |
+
* shall be included in all copies or substantial portions of the software.
|
14 |
+
*
|
15 |
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
18 |
+
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
20 |
+
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
21 |
+
* DEALINGS IN THE SOFTWARE.
|
22 |
*
|
|
|
|
|
|
|
|
|
|
|
23 |
*/
|
24 |
+
namespace Facebook;
|
25 |
|
26 |
+
use Facebook\Authentication\AccessToken;
|
27 |
+
use Facebook\Authentication\OAuth2Client;
|
28 |
+
use Facebook\FileUpload\FacebookFile;
|
29 |
+
use Facebook\FileUpload\FacebookResumableUploader;
|
30 |
+
use Facebook\FileUpload\FacebookTransferChunk;
|
31 |
+
use Facebook\FileUpload\FacebookVideo;
|
32 |
+
use Facebook\GraphNodes\GraphEdge;
|
33 |
+
use Facebook\Url\UrlDetectionInterface;
|
34 |
+
use Facebook\Url\FacebookUrlDetectionHandler;
|
35 |
+
use Facebook\PseudoRandomString\PseudoRandomStringGeneratorFactory;
|
36 |
+
use Facebook\PseudoRandomString\PseudoRandomStringGeneratorInterface;
|
37 |
+
use Facebook\HttpClients\HttpClientsFactory;
|
38 |
+
use Facebook\PersistentData\PersistentDataFactory;
|
39 |
+
use Facebook\PersistentData\PersistentDataInterface;
|
40 |
+
use Facebook\Helpers\FacebookCanvasHelper;
|
41 |
+
use Facebook\Helpers\FacebookJavaScriptHelper;
|
42 |
+
use Facebook\Helpers\FacebookPageTabHelper;
|
43 |
+
use Facebook\Helpers\FacebookRedirectLoginHelper;
|
44 |
+
use Facebook\Exceptions\FacebookSDKException;
|
45 |
|
46 |
/**
|
47 |
+
* Class Facebook
|
48 |
+
*
|
49 |
+
* @package Facebook
|
50 |
*/
|
51 |
+
class Facebook
|
52 |
{
|
53 |
+
/**
|
54 |
+
* @const string Version number of the Facebook PHP SDK.
|
55 |
+
*/
|
56 |
+
const VERSION = '5.4.4';
|
57 |
+
|
58 |
+
/**
|
59 |
+
* @const string Default Graph API version for requests.
|
60 |
+
*/
|
61 |
+
const DEFAULT_GRAPH_VERSION = 'v2.8';
|
62 |
+
|
63 |
+
/**
|
64 |
+
* @const string The name of the environment variable that contains the app ID.
|
65 |
+
*/
|
66 |
+
const APP_ID_ENV_NAME = 'FACEBOOK_APP_ID';
|
67 |
+
|
68 |
+
/**
|
69 |
+
* @const string The name of the environment variable that contains the app secret.
|
70 |
+
*/
|
71 |
+
const APP_SECRET_ENV_NAME = 'FACEBOOK_APP_SECRET';
|
72 |
+
|
73 |
+
/**
|
74 |
+
* @var FacebookApp The FacebookApp entity.
|
75 |
+
*/
|
76 |
+
protected $app;
|
77 |
+
|
78 |
+
/**
|
79 |
+
* @var FacebookClient The Facebook client service.
|
80 |
+
*/
|
81 |
+
protected $client;
|
82 |
+
|
83 |
+
/**
|
84 |
+
* @var OAuth2Client The OAuth 2.0 client service.
|
85 |
+
*/
|
86 |
+
protected $oAuth2Client;
|
87 |
+
|
88 |
+
/**
|
89 |
+
* @var UrlDetectionInterface|null The URL detection handler.
|
90 |
+
*/
|
91 |
+
protected $urlDetectionHandler;
|
92 |
+
|
93 |
+
/**
|
94 |
+
* @var PseudoRandomStringGeneratorInterface|null The cryptographically secure pseudo-random string generator.
|
95 |
+
*/
|
96 |
+
protected $pseudoRandomStringGenerator;
|
97 |
+
|
98 |
+
/**
|
99 |
+
* @var AccessToken|null The default access token to use with requests.
|
100 |
+
*/
|
101 |
+
protected $defaultAccessToken;
|
102 |
+
|
103 |
+
/**
|
104 |
+
* @var string|null The default Graph version we want to use.
|
105 |
+
*/
|
106 |
+
protected $defaultGraphVersion;
|
107 |
+
|
108 |
+
/**
|
109 |
+
* @var PersistentDataInterface|null The persistent data handler.
|
110 |
+
*/
|
111 |
+
protected $persistentDataHandler;
|
112 |
+
|
113 |
+
/**
|
114 |
+
* @var FacebookResponse|FacebookBatchResponse|null Stores the last request made to Graph.
|
115 |
+
*/
|
116 |
+
protected $lastResponse;
|
117 |
+
|
118 |
+
/**
|
119 |
+
* Instantiates a new Facebook super-class object.
|
120 |
+
*
|
121 |
+
* @param array $config
|
122 |
+
*
|
123 |
+
* @throws FacebookSDKException
|
124 |
+
*/
|
125 |
+
public function __construct(array $config = [])
|
126 |
+
{
|
127 |
+
$config = array_merge([
|
128 |
+
'app_id' => getenv(static::APP_ID_ENV_NAME),
|
129 |
+
'app_secret' => getenv(static::APP_SECRET_ENV_NAME),
|
130 |
+
'default_graph_version' => static::DEFAULT_GRAPH_VERSION,
|
131 |
+
'enable_beta_mode' => false,
|
132 |
+
'http_client_handler' => null,
|
133 |
+
'persistent_data_handler' => null,
|
134 |
+
'pseudo_random_string_generator' => null,
|
135 |
+
'url_detection_handler' => null,
|
136 |
+
], $config);
|
137 |
+
|
138 |
+
if (!$config['app_id']) {
|
139 |
+
throw new FacebookSDKException('Required "app_id" key not supplied in config and could not find fallback environment variable "' . static::APP_ID_ENV_NAME . '"');
|
140 |
+
}
|
141 |
+
if (!$config['app_secret']) {
|
142 |
+
throw new FacebookSDKException('Required "app_secret" key not supplied in config and could not find fallback environment variable "' . static::APP_SECRET_ENV_NAME . '"');
|
143 |
+
}
|
144 |
+
|
145 |
+
$this->app = new FacebookApp($config['app_id'], $config['app_secret']);
|
146 |
+
$this->client = new FacebookClient(
|
147 |
+
HttpClientsFactory::createHttpClient($config['http_client_handler']),
|
148 |
+
$config['enable_beta_mode']
|
149 |
+
);
|
150 |
+
$this->pseudoRandomStringGenerator = PseudoRandomStringGeneratorFactory::createPseudoRandomStringGenerator(
|
151 |
+
$config['pseudo_random_string_generator']
|
152 |
+
);
|
153 |
+
$this->setUrlDetectionHandler($config['url_detection_handler'] ?: new FacebookUrlDetectionHandler());
|
154 |
+
$this->persistentDataHandler = PersistentDataFactory::createPersistentDataHandler(
|
155 |
+
$config['persistent_data_handler']
|
156 |
+
);
|
157 |
+
|
158 |
+
if (isset($config['default_access_token'])) {
|
159 |
+
$this->setDefaultAccessToken($config['default_access_token']);
|
160 |
+
}
|
161 |
+
|
162 |
+
// @todo v6: Throw an InvalidArgumentException if "default_graph_version" is not set
|
163 |
+
$this->defaultGraphVersion = $config['default_graph_version'];
|
164 |
+
}
|
165 |
+
|
166 |
+
/**
|
167 |
+
* Returns the FacebookApp entity.
|
168 |
+
*
|
169 |
+
* @return FacebookApp
|
170 |
+
*/
|
171 |
+
public function getApp()
|
172 |
+
{
|
173 |
+
return $this->app;
|
174 |
+
}
|
175 |
+
|
176 |
+
/**
|
177 |
+
* Returns the FacebookClient service.
|
178 |
+
*
|
179 |
+
* @return FacebookClient
|
180 |
+
*/
|
181 |
+
public function getClient()
|
182 |
+
{
|
183 |
+
return $this->client;
|
184 |
+
}
|
185 |
+
|
186 |
+
/**
|
187 |
+
* Returns the OAuth 2.0 client service.
|
188 |
+
*
|
189 |
+
* @return OAuth2Client
|
190 |
+
*/
|
191 |
+
public function getOAuth2Client()
|
192 |
+
{
|
193 |
+
if (!$this->oAuth2Client instanceof OAuth2Client) {
|
194 |
+
$app = $this->getApp();
|
195 |
+
$client = $this->getClient();
|
196 |
+
$this->oAuth2Client = new OAuth2Client($app, $client, $this->defaultGraphVersion);
|
197 |
+
}
|
198 |
+
|
199 |
+
return $this->oAuth2Client;
|
200 |
+
}
|
201 |
+
|
202 |
+
/**
|
203 |
+
* Returns the last response returned from Graph.
|
204 |
+
*
|
205 |
+
* @return FacebookResponse|FacebookBatchResponse|null
|
206 |
+
*/
|
207 |
+
public function getLastResponse()
|
208 |
+
{
|
209 |
+
return $this->lastResponse;
|
210 |
+
}
|
211 |
+
|
212 |
+
/**
|
213 |
+
* Returns the URL detection handler.
|
214 |
+
*
|
215 |
+
* @return UrlDetectionInterface
|
216 |
+
*/
|
217 |
+
public function getUrlDetectionHandler()
|
218 |
+
{
|
219 |
+
return $this->urlDetectionHandler;
|
220 |
+
}
|
221 |
+
|
222 |
+
/**
|
223 |
+
* Changes the URL detection handler.
|
224 |
+
*
|
225 |
+
* @param UrlDetectionInterface $urlDetectionHandler
|
226 |
+
*/
|
227 |
+
private function setUrlDetectionHandler(UrlDetectionInterface $urlDetectionHandler)
|
228 |
+
{
|
229 |
+
$this->urlDetectionHandler = $urlDetectionHandler;
|
230 |
+
}
|
231 |
+
|
232 |
+
/**
|
233 |
+
* Returns the default AccessToken entity.
|
234 |
+
*
|
235 |
+
* @return AccessToken|null
|
236 |
+
*/
|
237 |
+
public function getDefaultAccessToken()
|
238 |
+
{
|
239 |
+
return $this->defaultAccessToken;
|
240 |
+
}
|
241 |
+
|
242 |
+
/**
|
243 |
+
* Sets the default access token to use with requests.
|
244 |
+
*
|
245 |
+
* @param AccessToken|string $accessToken The access token to save.
|
246 |
+
*
|
247 |
+
* @throws \InvalidArgumentException
|
248 |
+
*/
|
249 |
+
public function setDefaultAccessToken($accessToken)
|
250 |
+
{
|
251 |
+
if (is_string($accessToken)) {
|
252 |
+
$this->defaultAccessToken = new AccessToken($accessToken);
|
253 |
+
|
254 |
+
return;
|
255 |
+
}
|
256 |
+
|
257 |
+
if ($accessToken instanceof AccessToken) {
|
258 |
+
$this->defaultAccessToken = $accessToken;
|
259 |
+
|
260 |
+
return;
|
261 |
+
}
|
262 |
+
|
263 |
+
throw new \InvalidArgumentException('The default access token must be of type "string" or Facebook\AccessToken');
|
264 |
+
}
|
265 |
+
|
266 |
+
/**
|
267 |
+
* Returns the default Graph version.
|
268 |
+
*
|
269 |
+
* @return string
|
270 |
+
*/
|
271 |
+
public function getDefaultGraphVersion()
|
272 |
+
{
|
273 |
+
return $this->defaultGraphVersion;
|
274 |
+
}
|
275 |
+
|
276 |
+
/**
|
277 |
+
* Returns the redirect login helper.
|
278 |
+
*
|
279 |
+
* @return FacebookRedirectLoginHelper
|
280 |
+
*/
|
281 |
+
public function getRedirectLoginHelper()
|
282 |
+
{
|
283 |
+
return new FacebookRedirectLoginHelper(
|
284 |
+
$this->getOAuth2Client(),
|
285 |
+
$this->persistentDataHandler,
|
286 |
+
$this->urlDetectionHandler,
|
287 |
+
$this->pseudoRandomStringGenerator
|
288 |
+
);
|
289 |
+
}
|
290 |
+
|
291 |
+
/**
|
292 |
+
* Returns the JavaScript helper.
|
293 |
+
*
|
294 |
+
* @return FacebookJavaScriptHelper
|
295 |
+
*/
|
296 |
+
public function getJavaScriptHelper()
|
297 |
+
{
|
298 |
+
return new FacebookJavaScriptHelper($this->app, $this->client, $this->defaultGraphVersion);
|
299 |
+
}
|
300 |
+
|
301 |
+
/**
|
302 |
+
* Returns the canvas helper.
|
303 |
+
*
|
304 |
+
* @return FacebookCanvasHelper
|
305 |
+
*/
|
306 |
+
public function getCanvasHelper()
|
307 |
+
{
|
308 |
+
return new FacebookCanvasHelper($this->app, $this->client, $this->defaultGraphVersion);
|
309 |
+
}
|
310 |
+
|
311 |
+
/**
|
312 |
+
* Returns the page tab helper.
|
313 |
+
*
|
314 |
+
* @return FacebookPageTabHelper
|
315 |
+
*/
|
316 |
+
public function getPageTabHelper()
|
317 |
+
{
|
318 |
+
return new FacebookPageTabHelper($this->app, $this->client, $this->defaultGraphVersion);
|
319 |
+
}
|
320 |
+
|
321 |
+
/**
|
322 |
+
* Sends a GET request to Graph and returns the result.
|
323 |
+
*
|
324 |
+
* @param string $endpoint
|
325 |
+
* @param AccessToken|string|null $accessToken
|
326 |
+
* @param string|null $eTag
|
327 |
+
* @param string|null $graphVersion
|
328 |
+
*
|
329 |
+
* @return FacebookResponse
|
330 |
+
*
|
331 |
+
* @throws FacebookSDKException
|
332 |
+
*/
|
333 |
+
public function get($endpoint, $accessToken = null, $eTag = null, $graphVersion = null)
|
334 |
+
{
|
335 |
+
return $this->sendRequest(
|
336 |
+
'GET',
|
337 |
+
$endpoint,
|
338 |
+
$params = [],
|
339 |
+
$accessToken,
|
340 |
+
$eTag,
|
341 |
+
$graphVersion
|
342 |
+
);
|
343 |
+
}
|
344 |
+
|
345 |
+
/**
|
346 |
+
* Sends a POST request to Graph and returns the result.
|
347 |
+
*
|
348 |
+
* @param string $endpoint
|
349 |
+
* @param array $params
|
350 |
+
* @param AccessToken|string|null $accessToken
|
351 |
+
* @param string|null $eTag
|
352 |
+
* @param string|null $graphVersion
|
353 |
+
*
|
354 |
+
* @return FacebookResponse
|
355 |
+
*
|
356 |
+
* @throws FacebookSDKException
|
357 |
+
*/
|
358 |
+
public function post($endpoint, array $params = [], $accessToken = null, $eTag = null, $graphVersion = null)
|
359 |
+
{
|
360 |
+
return $this->sendRequest(
|
361 |
+
'POST',
|
362 |
+
$endpoint,
|
363 |
+
$params,
|
364 |
+
$accessToken,
|
365 |
+
$eTag,
|
366 |
+
$graphVersion
|
367 |
+
);
|
368 |
+
}
|
369 |
+
|
370 |
+
/**
|
371 |
+
* Sends a DELETE request to Graph and returns the result.
|
372 |
+
*
|
373 |
+
* @param string $endpoint
|
374 |
+
* @param array $params
|
375 |
+
* @param AccessToken|string|null $accessToken
|
376 |
+
* @param string|null $eTag
|
377 |
+
* @param string|null $graphVersion
|
378 |
+
*
|
379 |
+
* @return FacebookResponse
|
380 |
+
*
|
381 |
+
* @throws FacebookSDKException
|
382 |
+
*/
|
383 |
+
public function delete($endpoint, array $params = [], $accessToken = null, $eTag = null, $graphVersion = null)
|
384 |
+
{
|
385 |
+
return $this->sendRequest(
|
386 |
+
'DELETE',
|
387 |
+
$endpoint,
|
388 |
+
$params,
|
389 |
+
$accessToken,
|
390 |
+
$eTag,
|
391 |
+
$graphVersion
|
392 |
+
);
|
393 |
+
}
|
394 |
+
|
395 |
+
/**
|
396 |
+
* Sends a request to Graph for the next page of results.
|
397 |
+
*
|
398 |
+
* @param GraphEdge $graphEdge The GraphEdge to paginate over.
|
399 |
+
*
|
400 |
+
* @return GraphEdge|null
|
401 |
+
*
|
402 |
+
* @throws FacebookSDKException
|
403 |
+
*/
|
404 |
+
public function next(GraphEdge $graphEdge)
|
405 |
+
{
|
406 |
+
return $this->getPaginationResults($graphEdge, 'next');
|
407 |
+
}
|
408 |
+
|
409 |
+
/**
|
410 |
+
* Sends a request to Graph for the previous page of results.
|
411 |
+
*
|
412 |
+
* @param GraphEdge $graphEdge The GraphEdge to paginate over.
|
413 |
+
*
|
414 |
+
* @return GraphEdge|null
|
415 |
+
*
|
416 |
+
* @throws FacebookSDKException
|
417 |
+
*/
|
418 |
+
public function previous(GraphEdge $graphEdge)
|
419 |
+
{
|
420 |
+
return $this->getPaginationResults($graphEdge, 'previous');
|
421 |
+
}
|
422 |
+
|
423 |
+
/**
|
424 |
+
* Sends a request to Graph for the next page of results.
|
425 |
+
*
|
426 |
+
* @param GraphEdge $graphEdge The GraphEdge to paginate over.
|
427 |
+
* @param string $direction The direction of the pagination: next|previous.
|
428 |
+
*
|
429 |
+
* @return GraphEdge|null
|
430 |
+
*
|
431 |
+
* @throws FacebookSDKException
|
432 |
+
*/
|
433 |
+
public function getPaginationResults(GraphEdge $graphEdge, $direction)
|
434 |
+
{
|
435 |
+
$paginationRequest = $graphEdge->getPaginationRequest($direction);
|
436 |
+
if (!$paginationRequest) {
|
437 |
+
return null;
|
438 |
+
}
|
439 |
+
|
440 |
+
$this->lastResponse = $this->client->sendRequest($paginationRequest);
|
441 |
+
|
442 |
+
// Keep the same GraphNode subclass
|
443 |
+
$subClassName = $graphEdge->getSubClassName();
|
444 |
+
$graphEdge = $this->lastResponse->getGraphEdge($subClassName, false);
|
445 |
+
|
446 |
+
return count($graphEdge) > 0 ? $graphEdge : null;
|
447 |
+
}
|
448 |
+
|
449 |
+
/**
|
450 |
+
* Sends a request to Graph and returns the result.
|
451 |
+
*
|
452 |
+
* @param string $method
|
453 |
+
* @param string $endpoint
|
454 |
+
* @param array $params
|
455 |
+
* @param AccessToken|string|null $accessToken
|
456 |
+
* @param string|null $eTag
|
457 |
+
* @param string|null $graphVersion
|
458 |
+
*
|
459 |
+
* @return FacebookResponse
|
460 |
+
*
|
461 |
+
* @throws FacebookSDKException
|
462 |
+
*/
|
463 |
+
public function sendRequest($method, $endpoint, array $params = [], $accessToken = null, $eTag = null, $graphVersion = null)
|
464 |
+
{
|
465 |
+
$accessToken = $accessToken ?: $this->defaultAccessToken;
|
466 |
+
$graphVersion = $graphVersion ?: $this->defaultGraphVersion;
|
467 |
+
$request = $this->request($method, $endpoint, $params, $accessToken, $eTag, $graphVersion);
|
468 |
+
|
469 |
+
return $this->lastResponse = $this->client->sendRequest($request);
|
470 |
+
}
|
471 |
+
|
472 |
+
/**
|
473 |
+
* Sends a batched request to Graph and returns the result.
|
474 |
+
*
|
475 |
+
* @param array $requests
|
476 |
+
* @param AccessToken|string|null $accessToken
|
477 |
+
* @param string|null $graphVersion
|
478 |
+
*
|
479 |
+
* @return FacebookBatchResponse
|
480 |
+
*
|
481 |
+
* @throws FacebookSDKException
|
482 |
+
*/
|
483 |
+
public function sendBatchRequest(array $requests, $accessToken = null, $graphVersion = null)
|
484 |
+
{
|
485 |
+
$accessToken = $accessToken ?: $this->defaultAccessToken;
|
486 |
+
$graphVersion = $graphVersion ?: $this->defaultGraphVersion;
|
487 |
+
$batchRequest = new FacebookBatchRequest(
|
488 |
+
$this->app,
|
489 |
+
$requests,
|
490 |
+
$accessToken,
|
491 |
+
$graphVersion
|
492 |
+
);
|
493 |
+
|
494 |
+
return $this->lastResponse = $this->client->sendBatchRequest($batchRequest);
|
495 |
+
}
|
496 |
+
|
497 |
+
/**
|
498 |
+
* Instantiates a new FacebookRequest entity.
|
499 |
+
*
|
500 |
+
* @param string $method
|
501 |
+
* @param string $endpoint
|
502 |
+
* @param array $params
|
503 |
+
* @param AccessToken|string|null $accessToken
|
504 |
+
* @param string|null $eTag
|
505 |
+
* @param string|null $graphVersion
|
506 |
+
*
|
507 |
+
* @return FacebookRequest
|
508 |
+
*
|
509 |
+
* @throws FacebookSDKException
|
510 |
+
*/
|
511 |
+
public function request($method, $endpoint, array $params = [], $accessToken = null, $eTag = null, $graphVersion = null)
|
512 |
+
{
|
513 |
+
$accessToken = $accessToken ?: $this->defaultAccessToken;
|
514 |
+
$graphVersion = $graphVersion ?: $this->defaultGraphVersion;
|
515 |
+
|
516 |
+
return new FacebookRequest(
|
517 |
+
$this->app,
|
518 |
+
$accessToken,
|
519 |
+
$method,
|
520 |
+
$endpoint,
|
521 |
+
$params,
|
522 |
+
$eTag,
|
523 |
+
$graphVersion
|
524 |
+
);
|
525 |
+
}
|
526 |
+
|
527 |
+
/**
|
528 |
+
* Factory to create FacebookFile's.
|
529 |
+
*
|
530 |
+
* @param string $pathToFile
|
531 |
+
*
|
532 |
+
* @return FacebookFile
|
533 |
+
*
|
534 |
+
* @throws FacebookSDKException
|
535 |
+
*/
|
536 |
+
public function fileToUpload($pathToFile)
|
537 |
+
{
|
538 |
+
return new FacebookFile($pathToFile);
|
539 |
+
}
|
540 |
+
|
541 |
+
/**
|
542 |
+
* Factory to create FacebookVideo's.
|
543 |
+
*
|
544 |
+
* @param string $pathToFile
|
545 |
+
*
|
546 |
+
* @return FacebookVideo
|
547 |
+
*
|
548 |
+
* @throws FacebookSDKException
|
549 |
+
*/
|
550 |
+
public function videoToUpload($pathToFile)
|
551 |
+
{
|
552 |
+
return new FacebookVideo($pathToFile);
|
553 |
+
}
|
554 |
+
|
555 |
+
/**
|
556 |
+
* Upload a video in chunks.
|
557 |
+
*
|
558 |
+
* @param int $target The id of the target node before the /videos edge.
|
559 |
+
* @param string $pathToFile The full path to the file.
|
560 |
+
* @param array $metadata The metadata associated with the video file.
|
561 |
+
* @param string|null $accessToken The access token.
|
562 |
+
* @param int $maxTransferTries The max times to retry a failed upload chunk.
|
563 |
+
* @param string|null $graphVersion The Graph API version to use.
|
564 |
+
*
|
565 |
+
* @return array
|
566 |
+
*
|
567 |
+
* @throws FacebookSDKException
|
568 |
+
*/
|
569 |
+
public function uploadVideo($target, $pathToFile, $metadata = [], $accessToken = null, $maxTransferTries = 5, $graphVersion = null)
|
570 |
+
{
|
571 |
+
$accessToken = $accessToken ?: $this->defaultAccessToken;
|
572 |
+
$graphVersion = $graphVersion ?: $this->defaultGraphVersion;
|
573 |
+
|
574 |
+
$uploader = new FacebookResumableUploader($this->app, $this->client, $accessToken, $graphVersion);
|
575 |
+
$endpoint = '/'.$target.'/videos';
|
576 |
+
$file = $this->videoToUpload($pathToFile);
|
577 |
+
$chunk = $uploader->start($endpoint, $file);
|
578 |
+
|
579 |
+
do {
|
580 |
+
$chunk = $this->maxTriesTransfer($uploader, $endpoint, $chunk, $maxTransferTries);
|
581 |
+
} while (!$chunk->isLastChunk());
|
582 |
+
|
583 |
+
return [
|
584 |
+
'video_id' => $chunk->getVideoId(),
|
585 |
+
'success' => $uploader->finish($endpoint, $chunk->getUploadSessionId(), $metadata),
|
586 |
+
];
|
587 |
+
}
|
588 |
+
|
589 |
+
/**
|
590 |
+
* Attempts to upload a chunk of a file in $retryCountdown tries.
|
591 |
+
*
|
592 |
+
* @param FacebookResumableUploader $uploader
|
593 |
+
* @param string $endpoint
|
594 |
+
* @param FacebookTransferChunk $chunk
|
595 |
+
* @param int $retryCountdown
|
596 |
+
*
|
597 |
+
* @return FacebookTransferChunk
|
598 |
+
*
|
599 |
+
* @throws FacebookSDKException
|
600 |
+
*/
|
601 |
+
private function maxTriesTransfer(FacebookResumableUploader $uploader, $endpoint, FacebookTransferChunk $chunk, $retryCountdown)
|
602 |
+
{
|
603 |
+
$newChunk = $uploader->transfer($endpoint, $chunk, $retryCountdown < 1);
|
604 |
+
|
605 |
+
if ($newChunk !== $chunk) {
|
606 |
+
return $newChunk;
|
607 |
+
}
|
608 |
+
|
609 |
+
$retryCountdown--;
|
610 |
+
|
611 |
+
// If transfer() returned the same chunk entity, the transfer failed but is resumable.
|
612 |
+
return $this->maxTriesTransfer($uploader, $endpoint, $chunk, $retryCountdown);
|
613 |
+
}
|
614 |
}
|
hybridauth/Hybrid/thirdparty/Facebook/fb_ca_chain_bundle.crt
DELETED
@@ -1,3920 +0,0 @@
|
|
1 |
-
##
|
2 |
-
## ca-bundle.crt -- Bundle of CA Root Certificates
|
3 |
-
##
|
4 |
-
## Certificate data from Mozilla as of: Thu Oct 18 19:05:59 2012
|
5 |
-
##
|
6 |
-
## This is a bundle of X.509 certificates of public Certificate Authorities
|
7 |
-
## (CA). These were automatically extracted from Mozilla's root certificates
|
8 |
-
## file (certdata.txt). This file can be found in the mozilla source tree:
|
9 |
-
## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1
|
10 |
-
##
|
11 |
-
## It contains the certificates in PEM format and therefore
|
12 |
-
## can be directly used with curl / libcurl / php_curl, or with
|
13 |
-
## an Apache+mod_ssl webserver for SSL client authentication.
|
14 |
-
## Just configure this file as the SSLCACertificateFile.
|
15 |
-
##
|
16 |
-
|
17 |
-
# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.86 $ $Date: 2012/10/18 16:26:52 $
|
18 |
-
|
19 |
-
GTE CyberTrust Global Root
|
20 |
-
==========================
|
21 |
-
-----BEGIN CERTIFICATE-----
|
22 |
-
MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg
|
23 |
-
Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG
|
24 |
-
A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz
|
25 |
-
MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL
|
26 |
-
Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0
|
27 |
-
IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u
|
28 |
-
sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql
|
29 |
-
HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID
|
30 |
-
AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW
|
31 |
-
M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF
|
32 |
-
NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
|
33 |
-
-----END CERTIFICATE-----
|
34 |
-
|
35 |
-
Thawte Server CA
|
36 |
-
================
|
37 |
-
-----BEGIN CERTIFICATE-----
|
38 |
-
MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
|
39 |
-
DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
|
40 |
-
dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE
|
41 |
-
AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j
|
42 |
-
b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV
|
43 |
-
BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u
|
44 |
-
c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG
|
45 |
-
A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0
|
46 |
-
ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl
|
47 |
-
/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7
|
48 |
-
1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR
|
49 |
-
MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J
|
50 |
-
GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ
|
51 |
-
GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc=
|
52 |
-
-----END CERTIFICATE-----
|
53 |
-
|
54 |
-
Thawte Premium Server CA
|
55 |
-
========================
|
56 |
-
-----BEGIN CERTIFICATE-----
|
57 |
-
MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT
|
58 |
-
DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
|
59 |
-
dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE
|
60 |
-
AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl
|
61 |
-
ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT
|
62 |
-
AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU
|
63 |
-
VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2
|
64 |
-
aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ
|
65 |
-
cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2
|
66 |
-
aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh
|
67 |
-
Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/
|
68 |
-
qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm
|
69 |
-
SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf
|
70 |
-
8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t
|
71 |
-
UCemDaYj+bvLpgcUQg==
|
72 |
-
-----END CERTIFICATE-----
|
73 |
-
|
74 |
-
Equifax Secure CA
|
75 |
-
=================
|
76 |
-
-----BEGIN CERTIFICATE-----
|
77 |
-
MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE
|
78 |
-
ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
|
79 |
-
MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT
|
80 |
-
B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB
|
81 |
-
nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR
|
82 |
-
fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW
|
83 |
-
8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG
|
84 |
-
A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE
|
85 |
-
CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG
|
86 |
-
A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS
|
87 |
-
spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB
|
88 |
-
Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961
|
89 |
-
zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB
|
90 |
-
BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95
|
91 |
-
70+sB3c4
|
92 |
-
-----END CERTIFICATE-----
|
93 |
-
|
94 |
-
Digital Signature Trust Co. Global CA 1
|
95 |
-
=======================================
|
96 |
-
-----BEGIN CERTIFICATE-----
|
97 |
-
MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
|
98 |
-
ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy
|
99 |
-
MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
|
100 |
-
IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA
|
101 |
-
A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE
|
102 |
-
NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i
|
103 |
-
o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
|
104 |
-
BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
|
105 |
-
dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
|
106 |
-
IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY
|
107 |
-
MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM
|
108 |
-
BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
|
109 |
-
ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq
|
110 |
-
kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4
|
111 |
-
RbyhkwS7hp86W0N6w4pl
|
112 |
-
-----END CERTIFICATE-----
|
113 |
-
|
114 |
-
Digital Signature Trust Co. Global CA 3
|
115 |
-
=======================================
|
116 |
-
-----BEGIN CERTIFICATE-----
|
117 |
-
MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE
|
118 |
-
ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy
|
119 |
-
MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs
|
120 |
-
IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA
|
121 |
-
A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD
|
122 |
-
VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS
|
123 |
-
xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo
|
124 |
-
BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0
|
125 |
-
dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
|
126 |
-
IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY
|
127 |
-
MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM
|
128 |
-
BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB
|
129 |
-
AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi
|
130 |
-
up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1
|
131 |
-
mPnHfxsb1gYgAlihw6ID
|
132 |
-
-----END CERTIFICATE-----
|
133 |
-
|
134 |
-
Verisign Class 3 Public Primary Certification Authority
|
135 |
-
=======================================================
|
136 |
-
-----BEGIN CERTIFICATE-----
|
137 |
-
MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx
|
138 |
-
FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
|
139 |
-
IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
|
140 |
-
XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
|
141 |
-
IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
|
142 |
-
A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
|
143 |
-
f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
|
144 |
-
hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA
|
145 |
-
TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah
|
146 |
-
WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf
|
147 |
-
Tqj/ZA1k
|
148 |
-
-----END CERTIFICATE-----
|
149 |
-
|
150 |
-
Verisign Class 1 Public Primary Certification Authority - G2
|
151 |
-
============================================================
|
152 |
-
-----BEGIN CERTIFICATE-----
|
153 |
-
MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
|
154 |
-
MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy
|
155 |
-
eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
|
156 |
-
biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
|
157 |
-
dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
|
158 |
-
MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFy
|
159 |
-
eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
|
160 |
-
biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
|
161 |
-
dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgd
|
162 |
-
k4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIq
|
163 |
-
WpDBucSmFc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQAB
|
164 |
-
MA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9ZrbWB85a7FkCMM
|
165 |
-
XErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2uluIncrKTdcu1OofdPvAbT6shkdHvC
|
166 |
-
lUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68DzFc6PLZ
|
167 |
-
-----END CERTIFICATE-----
|
168 |
-
|
169 |
-
Verisign Class 2 Public Primary Certification Authority - G2
|
170 |
-
============================================================
|
171 |
-
-----BEGIN CERTIFICATE-----
|
172 |
-
MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQswCQYDVQQGEwJV
|
173 |
-
UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h
|
174 |
-
cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp
|
175 |
-
Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1
|
176 |
-
c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJV
|
177 |
-
UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1h
|
178 |
-
cnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNp
|
179 |
-
Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1
|
180 |
-
c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjx
|
181 |
-
nNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRC
|
182 |
-
wiNPStjwDqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEA
|
183 |
-
ATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/7aHmZuovCfTK
|
184 |
-
1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAXrXfMSTWqz9iP0b63GJZHc2pUIjRk
|
185 |
-
LbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnInjBJ7xUS0rg==
|
186 |
-
-----END CERTIFICATE-----
|
187 |
-
|
188 |
-
Verisign Class 3 Public Primary Certification Authority - G2
|
189 |
-
============================================================
|
190 |
-
-----BEGIN CERTIFICATE-----
|
191 |
-
MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
|
192 |
-
MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
|
193 |
-
eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
|
194 |
-
biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
|
195 |
-
dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
|
196 |
-
MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
|
197 |
-
eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
|
198 |
-
biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
|
199 |
-
dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO
|
200 |
-
FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71
|
201 |
-
lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB
|
202 |
-
MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT
|
203 |
-
1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD
|
204 |
-
Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9
|
205 |
-
-----END CERTIFICATE-----
|
206 |
-
|
207 |
-
GlobalSign Root CA
|
208 |
-
==================
|
209 |
-
-----BEGIN CERTIFICATE-----
|
210 |
-
MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
|
211 |
-
GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
|
212 |
-
b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
|
213 |
-
BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
|
214 |
-
VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
|
215 |
-
DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
|
216 |
-
THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
|
217 |
-
Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
|
218 |
-
c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
|
219 |
-
gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
|
220 |
-
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
|
221 |
-
AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
|
222 |
-
Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
|
223 |
-
j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
|
224 |
-
hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
|
225 |
-
X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
|
226 |
-
-----END CERTIFICATE-----
|
227 |
-
|
228 |
-
GlobalSign Root CA - R2
|
229 |
-
=======================
|
230 |
-
-----BEGIN CERTIFICATE-----
|
231 |
-
MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
|
232 |
-
YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
|
233 |
-
bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
|
234 |
-
aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
|
235 |
-
bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
|
236 |
-
ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
|
237 |
-
s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
|
238 |
-
S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
|
239 |
-
TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
|
240 |
-
ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
|
241 |
-
FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
|
242 |
-
YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
|
243 |
-
BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
|
244 |
-
9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
|
245 |
-
01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
|
246 |
-
9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
|
247 |
-
TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
|
248 |
-
-----END CERTIFICATE-----
|
249 |
-
|
250 |
-
ValiCert Class 1 VA
|
251 |
-
===================
|
252 |
-
-----BEGIN CERTIFICATE-----
|
253 |
-
MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
|
254 |
-
b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
|
255 |
-
YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
|
256 |
-
bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy
|
257 |
-
MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
|
258 |
-
d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg
|
259 |
-
UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
|
260 |
-
LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
|
261 |
-
A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi
|
262 |
-
GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm
|
263 |
-
DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG
|
264 |
-
lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX
|
265 |
-
icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP
|
266 |
-
Orf1LXLI
|
267 |
-
-----END CERTIFICATE-----
|
268 |
-
|
269 |
-
ValiCert Class 2 VA
|
270 |
-
===================
|
271 |
-
-----BEGIN CERTIFICATE-----
|
272 |
-
MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
|
273 |
-
b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
|
274 |
-
YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
|
275 |
-
bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
|
276 |
-
MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
|
277 |
-
d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg
|
278 |
-
UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
|
279 |
-
LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
|
280 |
-
A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC
|
281 |
-
CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf
|
282 |
-
ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ
|
283 |
-
SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV
|
284 |
-
UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8
|
285 |
-
W9ViH0Pd
|
286 |
-
-----END CERTIFICATE-----
|
287 |
-
|
288 |
-
RSA Root Certificate 1
|
289 |
-
======================
|
290 |
-
-----BEGIN CERTIFICATE-----
|
291 |
-
MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
|
292 |
-
b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
|
293 |
-
YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
|
294 |
-
bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
|
295 |
-
MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
|
296 |
-
d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg
|
297 |
-
UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
|
298 |
-
LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
|
299 |
-
A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td
|
300 |
-
3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H
|
301 |
-
BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs
|
302 |
-
3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF
|
303 |
-
V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r
|
304 |
-
on+jjBXu
|
305 |
-
-----END CERTIFICATE-----
|
306 |
-
|
307 |
-
Verisign Class 1 Public Primary Certification Authority - G3
|
308 |
-
============================================================
|
309 |
-
-----BEGIN CERTIFICATE-----
|
310 |
-
MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
|
311 |
-
UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
|
312 |
-
cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
|
313 |
-
IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
|
314 |
-
dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
|
315 |
-
CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
|
316 |
-
dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
|
317 |
-
cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkg
|
318 |
-
Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
|
319 |
-
ggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/E
|
320 |
-
bRrsC+MO8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJ
|
321 |
-
rKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7PoBMAGrgnoeS+
|
322 |
-
Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP26KbqxzcSXKMpHgLZ2x87tNcPVkeB
|
323 |
-
FQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
|
324 |
-
q2aN17O6x5q25lXQBfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N
|
325 |
-
y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3
|
326 |
-
ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrspSCAaWihT37h
|
327 |
-
a88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/Pc
|
328 |
-
D98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g==
|
329 |
-
-----END CERTIFICATE-----
|
330 |
-
|
331 |
-
Verisign Class 2 Public Primary Certification Authority - G3
|
332 |
-
============================================================
|
333 |
-
-----BEGIN CERTIFICATE-----
|
334 |
-
MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJBgNVBAYTAlVT
|
335 |
-
MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29y
|
336 |
-
azE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ug
|
337 |
-
b25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0
|
338 |
-
aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJ
|
339 |
-
BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1
|
340 |
-
c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y
|
341 |
-
aXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBD
|
342 |
-
ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
|
343 |
-
AQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6
|
344 |
-
tW8UvxDOJxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7
|
345 |
-
C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQHgiBVrKtaaNS
|
346 |
-
0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjNqWm6o+sdDZykIKbBoMXRRkwXbdKs
|
347 |
-
Zj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0
|
348 |
-
JhU8wI1NQ0kdvekhktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf
|
349 |
-
0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU
|
350 |
-
sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RIsH/7NiXaldDx
|
351 |
-
JBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//j
|
352 |
-
GHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q
|
353 |
-
-----END CERTIFICATE-----
|
354 |
-
|
355 |
-
Verisign Class 3 Public Primary Certification Authority - G3
|
356 |
-
============================================================
|
357 |
-
-----BEGIN CERTIFICATE-----
|
358 |
-
MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
|
359 |
-
UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
|
360 |
-
cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
|
361 |
-
IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
|
362 |
-
dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
|
363 |
-
CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
|
364 |
-
dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
|
365 |
-
cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
|
366 |
-
Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
|
367 |
-
ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
|
368 |
-
EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
|
369 |
-
cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
|
370 |
-
EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
|
371 |
-
055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
|
372 |
-
ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
|
373 |
-
j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
|
374 |
-
/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
|
375 |
-
xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
|
376 |
-
t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
|
377 |
-
-----END CERTIFICATE-----
|
378 |
-
|
379 |
-
Verisign Class 4 Public Primary Certification Authority - G3
|
380 |
-
============================================================
|
381 |
-
-----BEGIN CERTIFICATE-----
|
382 |
-
MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
|
383 |
-
UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
|
384 |
-
cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
|
385 |
-
IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
|
386 |
-
dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
|
387 |
-
CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
|
388 |
-
dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
|
389 |
-
cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg
|
390 |
-
Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
|
391 |
-
ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS
|
392 |
-
tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM
|
393 |
-
8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW
|
394 |
-
Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX
|
395 |
-
Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
|
396 |
-
j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt
|
397 |
-
mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
|
398 |
-
fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd
|
399 |
-
RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG
|
400 |
-
UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
|
401 |
-
-----END CERTIFICATE-----
|
402 |
-
|
403 |
-
Entrust.net Secure Server CA
|
404 |
-
============================
|
405 |
-
-----BEGIN CERTIFICATE-----
|
406 |
-
MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV
|
407 |
-
BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg
|
408 |
-
cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl
|
409 |
-
ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv
|
410 |
-
cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG
|
411 |
-
A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi
|
412 |
-
eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p
|
413 |
-
dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0
|
414 |
-
aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ
|
415 |
-
aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5
|
416 |
-
gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw
|
417 |
-
ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw
|
418 |
-
CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l
|
419 |
-
dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
|
420 |
-
bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl
|
421 |
-
cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
|
422 |
-
dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw
|
423 |
-
NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow
|
424 |
-
HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA
|
425 |
-
BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN
|
426 |
-
Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9
|
427 |
-
n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
|
428 |
-
-----END CERTIFICATE-----
|
429 |
-
|
430 |
-
Entrust.net Premium 2048 Secure Server CA
|
431 |
-
=========================================
|
432 |
-
-----BEGIN CERTIFICATE-----
|
433 |
-
MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
|
434 |
-
ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
|
435 |
-
bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
|
436 |
-
BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
|
437 |
-
NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
|
438 |
-
d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
|
439 |
-
MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
|
440 |
-
ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
|
441 |
-
MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
|
442 |
-
Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
|
443 |
-
hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
|
444 |
-
nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
|
445 |
-
VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC
|
446 |
-
AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER
|
447 |
-
gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B
|
448 |
-
AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo
|
449 |
-
oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS
|
450 |
-
o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z
|
451 |
-
2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX
|
452 |
-
OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ==
|
453 |
-
-----END CERTIFICATE-----
|
454 |
-
|
455 |
-
Baltimore CyberTrust Root
|
456 |
-
=========================
|
457 |
-
-----BEGIN CERTIFICATE-----
|
458 |
-
MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
|
459 |
-
ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
|
460 |
-
ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
|
461 |
-
SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
|
462 |
-
dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
|
463 |
-
uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
|
464 |
-
UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
|
465 |
-
G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
|
466 |
-
XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
|
467 |
-
l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
|
468 |
-
VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
|
469 |
-
BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
|
470 |
-
cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
|
471 |
-
hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
|
472 |
-
Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
|
473 |
-
RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
|
474 |
-
-----END CERTIFICATE-----
|
475 |
-
|
476 |
-
Equifax Secure Global eBusiness CA
|
477 |
-
==================================
|
478 |
-
-----BEGIN CERTIFICATE-----
|
479 |
-
MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
|
480 |
-
RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp
|
481 |
-
bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx
|
482 |
-
HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds
|
483 |
-
b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV
|
484 |
-
PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN
|
485 |
-
qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn
|
486 |
-
hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j
|
487 |
-
BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs
|
488 |
-
MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN
|
489 |
-
I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY
|
490 |
-
NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
|
491 |
-
-----END CERTIFICATE-----
|
492 |
-
|
493 |
-
Equifax Secure eBusiness CA 1
|
494 |
-
=============================
|
495 |
-
-----BEGIN CERTIFICATE-----
|
496 |
-
MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
|
497 |
-
RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB
|
498 |
-
LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE
|
499 |
-
ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz
|
500 |
-
IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ
|
501 |
-
1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a
|
502 |
-
IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk
|
503 |
-
MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW
|
504 |
-
Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF
|
505 |
-
AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5
|
506 |
-
lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+
|
507 |
-
KpYrtWKmpj29f5JZzVoqgrI3eQ==
|
508 |
-
-----END CERTIFICATE-----
|
509 |
-
|
510 |
-
Equifax Secure eBusiness CA 2
|
511 |
-
=============================
|
512 |
-
-----BEGIN CERTIFICATE-----
|
513 |
-
MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE
|
514 |
-
ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y
|
515 |
-
MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT
|
516 |
-
DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB
|
517 |
-
nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn
|
518 |
-
2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5
|
519 |
-
BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG
|
520 |
-
A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx
|
521 |
-
JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG
|
522 |
-
A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e
|
523 |
-
uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB
|
524 |
-
Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1
|
525 |
-
jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia
|
526 |
-
78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm
|
527 |
-
V+GRMOrN
|
528 |
-
-----END CERTIFICATE-----
|
529 |
-
|
530 |
-
AddTrust Low-Value Services Root
|
531 |
-
================================
|
532 |
-
-----BEGIN CERTIFICATE-----
|
533 |
-
MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
|
534 |
-
QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU
|
535 |
-
cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw
|
536 |
-
CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO
|
537 |
-
ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB
|
538 |
-
AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6
|
539 |
-
54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr
|
540 |
-
oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1
|
541 |
-
Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui
|
542 |
-
GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w
|
543 |
-
HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD
|
544 |
-
AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT
|
545 |
-
RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw
|
546 |
-
HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt
|
547 |
-
ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph
|
548 |
-
iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
|
549 |
-
eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr
|
550 |
-
mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj
|
551 |
-
ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
|
552 |
-
-----END CERTIFICATE-----
|
553 |
-
|
554 |
-
AddTrust External Root
|
555 |
-
======================
|
556 |
-
-----BEGIN CERTIFICATE-----
|
557 |
-
MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
|
558 |
-
QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
|
559 |
-
VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
|
560 |
-
NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
|
561 |
-
cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
|
562 |
-
Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
|
563 |
-
+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
|
564 |
-
Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
|
565 |
-
aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
|
566 |
-
2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
|
567 |
-
7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
|
568 |
-
BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
|
569 |
-
VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
|
570 |
-
VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
|
571 |
-
IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
|
572 |
-
j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
|
573 |
-
6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
|
574 |
-
e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
|
575 |
-
G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
|
576 |
-
-----END CERTIFICATE-----
|
577 |
-
|
578 |
-
AddTrust Public Services Root
|
579 |
-
=============================
|
580 |
-
-----BEGIN CERTIFICATE-----
|
581 |
-
MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
|
582 |
-
QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU
|
583 |
-
cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ
|
584 |
-
BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l
|
585 |
-
dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF
|
586 |
-
AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu
|
587 |
-
nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i
|
588 |
-
d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG
|
589 |
-
Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw
|
590 |
-
HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G
|
591 |
-
A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
|
592 |
-
/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux
|
593 |
-
FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G
|
594 |
-
A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4
|
595 |
-
JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL
|
596 |
-
+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
|
597 |
-
GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9
|
598 |
-
Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H
|
599 |
-
EufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
|
600 |
-
-----END CERTIFICATE-----
|
601 |
-
|
602 |
-
AddTrust Qualified Certificates Root
|
603 |
-
====================================
|
604 |
-
-----BEGIN CERTIFICATE-----
|
605 |
-
MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
|
606 |
-
QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU
|
607 |
-
cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx
|
608 |
-
CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ
|
609 |
-
IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG
|
610 |
-
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx
|
611 |
-
64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3
|
612 |
-
KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o
|
613 |
-
L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR
|
614 |
-
wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU
|
615 |
-
MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/
|
616 |
-
BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE
|
617 |
-
BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y
|
618 |
-
azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD
|
619 |
-
ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG
|
620 |
-
GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
|
621 |
-
dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze
|
622 |
-
RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB
|
623 |
-
iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=
|
624 |
-
-----END CERTIFICATE-----
|
625 |
-
|
626 |
-
Entrust Root Certification Authority
|
627 |
-
====================================
|
628 |
-
-----BEGIN CERTIFICATE-----
|
629 |
-
MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
|
630 |
-
BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
|
631 |
-
b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
|
632 |
-
A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
|
633 |
-
MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
|
634 |
-
MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
|
635 |
-
Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
|
636 |
-
dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
|
637 |
-
ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
|
638 |
-
A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
|
639 |
-
Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
|
640 |
-
j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
|
641 |
-
rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
|
642 |
-
DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
|
643 |
-
MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
|
644 |
-
hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
|
645 |
-
A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
|
646 |
-
Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
|
647 |
-
v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
|
648 |
-
W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
|
649 |
-
tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
|
650 |
-
-----END CERTIFICATE-----
|
651 |
-
|
652 |
-
RSA Security 2048 v3
|
653 |
-
====================
|
654 |
-
-----BEGIN CERTIFICATE-----
|
655 |
-
MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK
|
656 |
-
ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy
|
657 |
-
MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb
|
658 |
-
BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
|
659 |
-
AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7
|
660 |
-
Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb
|
661 |
-
WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH
|
662 |
-
KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP
|
663 |
-
+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/
|
664 |
-
MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E
|
665 |
-
FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY
|
666 |
-
v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj
|
667 |
-
0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj
|
668 |
-
VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395
|
669 |
-
nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA
|
670 |
-
pKnXwiJPZ9d37CAFYd4=
|
671 |
-
-----END CERTIFICATE-----
|
672 |
-
|
673 |
-
GeoTrust Global CA
|
674 |
-
==================
|
675 |
-
-----BEGIN CERTIFICATE-----
|
676 |
-
MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
|
677 |
-
Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
|
678 |
-
MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
|
679 |
-
LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
|
680 |
-
CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
|
681 |
-
BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
|
682 |
-
8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
|
683 |
-
T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
|
684 |
-
vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
|
685 |
-
AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
|
686 |
-
DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
|
687 |
-
zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
|
688 |
-
d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
|
689 |
-
mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
|
690 |
-
XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
|
691 |
-
Mw==
|
692 |
-
-----END CERTIFICATE-----
|
693 |
-
|
694 |
-
GeoTrust Global CA 2
|
695 |
-
====================
|
696 |
-
-----BEGIN CERTIFICATE-----
|
697 |
-
MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
|
698 |
-
R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw
|
699 |
-
MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
|
700 |
-
LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
|
701 |
-
ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/
|
702 |
-
NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k
|
703 |
-
LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA
|
704 |
-
Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b
|
705 |
-
HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF
|
706 |
-
MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH
|
707 |
-
K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7
|
708 |
-
srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh
|
709 |
-
ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL
|
710 |
-
OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC
|
711 |
-
x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF
|
712 |
-
H4z1Ir+rzoPz4iIprn2DQKi6bA==
|
713 |
-
-----END CERTIFICATE-----
|
714 |
-
|
715 |
-
GeoTrust Universal CA
|
716 |
-
=====================
|
717 |
-
-----BEGIN CERTIFICATE-----
|
718 |
-
MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
|
719 |
-
R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1
|
720 |
-
MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu
|
721 |
-
Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
|
722 |
-
ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t
|
723 |
-
JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e
|
724 |
-
RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs
|
725 |
-
7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d
|
726 |
-
8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V
|
727 |
-
qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga
|
728 |
-
Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB
|
729 |
-
Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu
|
730 |
-
KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08
|
731 |
-
ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0
|
732 |
-
XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB
|
733 |
-
hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
|
734 |
-
aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2
|
735 |
-
qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL
|
736 |
-
oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK
|
737 |
-
xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF
|
738 |
-
KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2
|
739 |
-
DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK
|
740 |
-
xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU
|
741 |
-
p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI
|
742 |
-
P/rmMuGNG2+k5o7Y+SlIis5z/iw=
|
743 |
-
-----END CERTIFICATE-----
|
744 |
-
|
745 |
-
GeoTrust Universal CA 2
|
746 |
-
=======================
|
747 |
-
-----BEGIN CERTIFICATE-----
|
748 |
-
MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
|
749 |
-
R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0
|
750 |
-
MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg
|
751 |
-
SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA
|
752 |
-
A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0
|
753 |
-
DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17
|
754 |
-
j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q
|
755 |
-
JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a
|
756 |
-
QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2
|
757 |
-
WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP
|
758 |
-
20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn
|
759 |
-
ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC
|
760 |
-
SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG
|
761 |
-
8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2
|
762 |
-
+/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E
|
763 |
-
BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
|
764 |
-
dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ
|
765 |
-
4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+
|
766 |
-
mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq
|
767 |
-
A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg
|
768 |
-
Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP
|
769 |
-
pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d
|
770 |
-
FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp
|
771 |
-
gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm
|
772 |
-
X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
|
773 |
-
-----END CERTIFICATE-----
|
774 |
-
|
775 |
-
UTN-USER First-Network Applications
|
776 |
-
===================================
|
777 |
-
-----BEGIN CERTIFICATE-----
|
778 |
-
MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCBozELMAkGA1UE
|
779 |
-
BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
|
780 |
-
IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzAp
|
781 |
-
BgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5
|
782 |
-
WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5T
|
783 |
-
YWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
|
784 |
-
dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBB
|
785 |
-
cHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZVhawGNFug
|
786 |
-
mliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4Cj
|
787 |
-
DUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXu
|
788 |
-
Ozr0hAReYFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwi
|
789 |
-
P8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7igEL66S/ozjIE
|
790 |
-
j3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8w
|
791 |
-
HQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9j
|
792 |
-
cmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G
|
793 |
-
CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y
|
794 |
-
IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6LzsQCv4AdRWOOTK
|
795 |
-
RIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4Qp
|
796 |
-
xFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAq
|
797 |
-
DbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjisH8SE
|
798 |
-
-----END CERTIFICATE-----
|
799 |
-
|
800 |
-
America Online Root Certification Authority 1
|
801 |
-
=============================================
|
802 |
-
-----BEGIN CERTIFICATE-----
|
803 |
-
MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
|
804 |
-
QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
|
805 |
-
Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG
|
806 |
-
A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
|
807 |
-
T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD
|
808 |
-
ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG
|
809 |
-
v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z
|
810 |
-
DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh
|
811 |
-
sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP
|
812 |
-
8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T
|
813 |
-
AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z
|
814 |
-
o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf
|
815 |
-
GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF
|
816 |
-
VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft
|
817 |
-
3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g
|
818 |
-
Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds
|
819 |
-
sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7
|
820 |
-
-----END CERTIFICATE-----
|
821 |
-
|
822 |
-
America Online Root Certification Authority 2
|
823 |
-
=============================================
|
824 |
-
-----BEGIN CERTIFICATE-----
|
825 |
-
MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
|
826 |
-
QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
|
827 |
-
Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG
|
828 |
-
A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
|
829 |
-
T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD
|
830 |
-
ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en
|
831 |
-
fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8
|
832 |
-
f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO
|
833 |
-
qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN
|
834 |
-
RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0
|
835 |
-
gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn
|
836 |
-
6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid
|
837 |
-
FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6
|
838 |
-
Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj
|
839 |
-
B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op
|
840 |
-
aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE
|
841 |
-
AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY
|
842 |
-
T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p
|
843 |
-
+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg
|
844 |
-
JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy
|
845 |
-
zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO
|
846 |
-
ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh
|
847 |
-
1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf
|
848 |
-
GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff
|
849 |
-
Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP
|
850 |
-
cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk=
|
851 |
-
-----END CERTIFICATE-----
|
852 |
-
|
853 |
-
Visa eCommerce Root
|
854 |
-
===================
|
855 |
-
-----BEGIN CERTIFICATE-----
|
856 |
-
MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG
|
857 |
-
EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug
|
858 |
-
QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2
|
859 |
-
WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm
|
860 |
-
VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
|
861 |
-
bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL
|
862 |
-
F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b
|
863 |
-
RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0
|
864 |
-
TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI
|
865 |
-
/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs
|
866 |
-
GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
|
867 |
-
MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc
|
868 |
-
CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW
|
869 |
-
YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz
|
870 |
-
zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
|
871 |
-
YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
|
872 |
-
398znM/jra6O1I7mT1GvFpLgXPYHDw==
|
873 |
-
-----END CERTIFICATE-----
|
874 |
-
|
875 |
-
Certum Root CA
|
876 |
-
==============
|
877 |
-
-----BEGIN CERTIFICATE-----
|
878 |
-
MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK
|
879 |
-
ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla
|
880 |
-
Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u
|
881 |
-
by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x
|
882 |
-
wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL
|
883 |
-
kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ
|
884 |
-
89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K
|
885 |
-
Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P
|
886 |
-
NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq
|
887 |
-
hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+
|
888 |
-
GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg
|
889 |
-
GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/
|
890 |
-
0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS
|
891 |
-
qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==
|
892 |
-
-----END CERTIFICATE-----
|
893 |
-
|
894 |
-
Comodo AAA Services root
|
895 |
-
========================
|
896 |
-
-----BEGIN CERTIFICATE-----
|
897 |
-
MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
|
898 |
-
R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
|
899 |
-
TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
|
900 |
-
MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
|
901 |
-
c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
|
902 |
-
BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
|
903 |
-
ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
|
904 |
-
C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
|
905 |
-
i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
|
906 |
-
Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
|
907 |
-
Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
|
908 |
-
Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
|
909 |
-
BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
|
910 |
-
cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
|
911 |
-
LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
|
912 |
-
7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
|
913 |
-
Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
|
914 |
-
8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
|
915 |
-
12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
|
916 |
-
-----END CERTIFICATE-----
|
917 |
-
|
918 |
-
Comodo Secure Services root
|
919 |
-
===========================
|
920 |
-
-----BEGIN CERTIFICATE-----
|
921 |
-
MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
|
922 |
-
R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
|
923 |
-
TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw
|
924 |
-
MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu
|
925 |
-
Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi
|
926 |
-
BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
|
927 |
-
ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP
|
928 |
-
9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc
|
929 |
-
rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC
|
930 |
-
oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V
|
931 |
-
p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E
|
932 |
-
FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
|
933 |
-
gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj
|
934 |
-
YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm
|
935 |
-
aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm
|
936 |
-
4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
|
937 |
-
Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL
|
938 |
-
DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw
|
939 |
-
pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H
|
940 |
-
RR3B7Hzs/Sk=
|
941 |
-
-----END CERTIFICATE-----
|
942 |
-
|
943 |
-
Comodo Trusted Services root
|
944 |
-
============================
|
945 |
-
-----BEGIN CERTIFICATE-----
|
946 |
-
MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
|
947 |
-
R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
|
948 |
-
TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw
|
949 |
-
MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h
|
950 |
-
bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw
|
951 |
-
IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC
|
952 |
-
AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7
|
953 |
-
3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y
|
954 |
-
/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6
|
955 |
-
juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS
|
956 |
-
ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud
|
957 |
-
DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
|
958 |
-
/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp
|
959 |
-
ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl
|
960 |
-
cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw
|
961 |
-
uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
|
962 |
-
pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA
|
963 |
-
BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l
|
964 |
-
R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O
|
965 |
-
9y5Xt5hwXsjEeLBi
|
966 |
-
-----END CERTIFICATE-----
|
967 |
-
|
968 |
-
QuoVadis Root CA
|
969 |
-
================
|
970 |
-
-----BEGIN CERTIFICATE-----
|
971 |
-
MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
|
972 |
-
ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
|
973 |
-
eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
|
974 |
-
MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
|
975 |
-
cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
|
976 |
-
EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
|
977 |
-
AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
|
978 |
-
J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
|
979 |
-
F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
|
980 |
-
YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
|
981 |
-
AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
|
982 |
-
PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
|
983 |
-
ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
|
984 |
-
MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
|
985 |
-
YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
|
986 |
-
ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
|
987 |
-
Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
|
988 |
-
Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
|
989 |
-
BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
|
990 |
-
FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
|
991 |
-
aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
|
992 |
-
tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
|
993 |
-
fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
|
994 |
-
LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
|
995 |
-
gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
|
996 |
-
5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
|
997 |
-
5nrQNiOKSnQ2+Q==
|
998 |
-
-----END CERTIFICATE-----
|
999 |
-
|
1000 |
-
QuoVadis Root CA 2
|
1001 |
-
==================
|
1002 |
-
-----BEGIN CERTIFICATE-----
|
1003 |
-
MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
|
1004 |
-
EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx
|
1005 |
-
ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
|
1006 |
-
aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC
|
1007 |
-
DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6
|
1008 |
-
XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk
|
1009 |
-
lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB
|
1010 |
-
lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy
|
1011 |
-
lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt
|
1012 |
-
66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn
|
1013 |
-
wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh
|
1014 |
-
D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy
|
1015 |
-
BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie
|
1016 |
-
J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud
|
1017 |
-
DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU
|
1018 |
-
a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
|
1019 |
-
ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv
|
1020 |
-
Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3
|
1021 |
-
UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm
|
1022 |
-
VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK
|
1023 |
-
+JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW
|
1024 |
-
IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1
|
1025 |
-
WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X
|
1026 |
-
f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II
|
1027 |
-
4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8
|
1028 |
-
VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
|
1029 |
-
-----END CERTIFICATE-----
|
1030 |
-
|
1031 |
-
QuoVadis Root CA 3
|
1032 |
-
==================
|
1033 |
-
-----BEGIN CERTIFICATE-----
|
1034 |
-
MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
|
1035 |
-
EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
|
1036 |
-
OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
|
1037 |
-
aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
|
1038 |
-
DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
|
1039 |
-
DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
|
1040 |
-
KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
|
1041 |
-
DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
|
1042 |
-
BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
|
1043 |
-
p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
|
1044 |
-
nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
|
1045 |
-
MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
|
1046 |
-
Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
|
1047 |
-
uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
|
1048 |
-
BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
|
1049 |
-
YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
|
1050 |
-
aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
|
1051 |
-
BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
|
1052 |
-
VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
|
1053 |
-
ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
|
1054 |
-
AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
|
1055 |
-
qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
|
1056 |
-
hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
|
1057 |
-
POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
|
1058 |
-
Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
|
1059 |
-
8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
|
1060 |
-
bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
|
1061 |
-
g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
|
1062 |
-
vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
|
1063 |
-
qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
|
1064 |
-
-----END CERTIFICATE-----
|
1065 |
-
|
1066 |
-
Security Communication Root CA
|
1067 |
-
==============================
|
1068 |
-
-----BEGIN CERTIFICATE-----
|
1069 |
-
MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
|
1070 |
-
U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
|
1071 |
-
HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
|
1072 |
-
U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
|
1073 |
-
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
|
1074 |
-
8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
|
1075 |
-
DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
|
1076 |
-
5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
|
1077 |
-
DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
|
1078 |
-
JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
|
1079 |
-
DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
|
1080 |
-
0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
|
1081 |
-
mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
|
1082 |
-
s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
|
1083 |
-
6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
|
1084 |
-
FL39vmwLAw==
|
1085 |
-
-----END CERTIFICATE-----
|
1086 |
-
|
1087 |
-
Sonera Class 1 Root CA
|
1088 |
-
======================
|
1089 |
-
-----BEGIN CERTIFICATE-----
|
1090 |
-
MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
|
1091 |
-
U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAxMDQwNjEwNDkxM1oXDTIxMDQw
|
1092 |
-
NjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
|
1093 |
-
IENsYXNzMSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H88
|
1094 |
-
7dF+2rDNbS82rDTG29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9
|
1095 |
-
EJUkoVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk3w0LBUXl
|
1096 |
-
0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBLqdReLjVQCfOAl/QMF645
|
1097 |
-
2F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIINnvmLVz5MxxftLItyM19yejhW1ebZrgUa
|
1098 |
-
HXVFsculJRwSVzb9IjcCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZT
|
1099 |
-
iFIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE9
|
1100 |
-
28Jj2VuXZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0HDjxV
|
1101 |
-
yhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VOTzF2nBBhjrZTOqMR
|
1102 |
-
vq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2UvkVrCqIexVmiUefkl98HVrhq4uz2P
|
1103 |
-
qYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4wzMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9Z
|
1104 |
-
IRlXvVWa
|
1105 |
-
-----END CERTIFICATE-----
|
1106 |
-
|
1107 |
-
Sonera Class 2 Root CA
|
1108 |
-
======================
|
1109 |
-
-----BEGIN CERTIFICATE-----
|
1110 |
-
MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
|
1111 |
-
U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
|
1112 |
-
NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
|
1113 |
-
IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
|
1114 |
-
/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
|
1115 |
-
dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
|
1116 |
-
f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
|
1117 |
-
tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
|
1118 |
-
nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
|
1119 |
-
XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
|
1120 |
-
0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
|
1121 |
-
cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
|
1122 |
-
Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
|
1123 |
-
EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
|
1124 |
-
llpwrN9M
|
1125 |
-
-----END CERTIFICATE-----
|
1126 |
-
|
1127 |
-
Staat der Nederlanden Root CA
|
1128 |
-
=============================
|
1129 |
-
-----BEGIN CERTIFICATE-----
|
1130 |
-
MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE
|
1131 |
-
ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g
|
1132 |
-
Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w
|
1133 |
-
HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh
|
1134 |
-
bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt
|
1135 |
-
vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P
|
1136 |
-
jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca
|
1137 |
-
C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth
|
1138 |
-
vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6
|
1139 |
-
22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV
|
1140 |
-
HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v
|
1141 |
-
dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN
|
1142 |
-
BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR
|
1143 |
-
EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw
|
1144 |
-
MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y
|
1145 |
-
nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR
|
1146 |
-
iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
|
1147 |
-
-----END CERTIFICATE-----
|
1148 |
-
|
1149 |
-
TDC Internet Root CA
|
1150 |
-
====================
|
1151 |
-
-----BEGIN CERTIFICATE-----
|
1152 |
-
MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE
|
1153 |
-
ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx
|
1154 |
-
NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu
|
1155 |
-
ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
|
1156 |
-
MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j
|
1157 |
-
xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL
|
1158 |
-
znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc
|
1159 |
-
5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6
|
1160 |
-
otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI
|
1161 |
-
AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM
|
1162 |
-
VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM
|
1163 |
-
MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC
|
1164 |
-
AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe
|
1165 |
-
UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G
|
1166 |
-
CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m
|
1167 |
-
gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+
|
1168 |
-
2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb
|
1169 |
-
O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU
|
1170 |
-
Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l
|
1171 |
-
-----END CERTIFICATE-----
|
1172 |
-
|
1173 |
-
TDC OCES Root CA
|
1174 |
-
================
|
1175 |
-
-----BEGIN CERTIFICATE-----
|
1176 |
-
MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJESzEMMAoGA1UE
|
1177 |
-
ChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5
|
1178 |
-
MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIB
|
1179 |
-
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuH
|
1180 |
-
nEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0
|
1181 |
-
zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvV
|
1182 |
-
iGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBde
|
1183 |
-
dObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO
|
1184 |
-
3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB
|
1185 |
-
5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5k
|
1186 |
-
ay9yZXBvc2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBm
|
1187 |
-
cmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4xLiBDZXJ0aWZp
|
1188 |
-
Y2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x
|
1189 |
-
LjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEM
|
1190 |
-
MAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm
|
1191 |
-
aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy
|
1192 |
-
MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647
|
1193 |
-
+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6
|
1194 |
-
NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4
|
1195 |
-
A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYsc
|
1196 |
-
A+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9
|
1197 |
-
AOoBmbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1
|
1198 |
-
AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2LqL19iUw==
|
1199 |
-
-----END CERTIFICATE-----
|
1200 |
-
|
1201 |
-
UTN DATACorp SGC Root CA
|
1202 |
-
========================
|
1203 |
-
-----BEGIN CERTIFICATE-----
|
1204 |
-
MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE
|
1205 |
-
BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
|
1206 |
-
IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ
|
1207 |
-
BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa
|
1208 |
-
MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w
|
1209 |
-
HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy
|
1210 |
-
dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC
|
1211 |
-
AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys
|
1212 |
-
raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo
|
1213 |
-
wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA
|
1214 |
-
9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv
|
1215 |
-
33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud
|
1216 |
-
DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9
|
1217 |
-
BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD
|
1218 |
-
LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3
|
1219 |
-
DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
|
1220 |
-
Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0
|
1221 |
-
I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx
|
1222 |
-
EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP
|
1223 |
-
DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI
|
1224 |
-
-----END CERTIFICATE-----
|
1225 |
-
|
1226 |
-
UTN USERFirst Email Root CA
|
1227 |
-
===========================
|
1228 |
-
-----BEGIN CERTIFICATE-----
|
1229 |
-
MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE
|
1230 |
-
BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
|
1231 |
-
IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0
|
1232 |
-
BgNVBAMTLVVUTi1VU0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05
|
1233 |
-
OTA3MDkxNzI4NTBaFw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQx
|
1234 |
-
FzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsx
|
1235 |
-
ITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJz
|
1236 |
-
dC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWlsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
|
1237 |
-
MIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3BYHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIx
|
1238 |
-
B8dOtINknS4p1aJkxIW9hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8
|
1239 |
-
om+rWV6lL8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLmSGHG
|
1240 |
-
TPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM1tZUOt4KpLoDd7Nl
|
1241 |
-
yP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws6wIDAQABo4G5MIG2MAsGA1UdDwQE
|
1242 |
-
AwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNV
|
1243 |
-
HR8EUTBPME2gS6BJhkdodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGll
|
1244 |
-
bnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH
|
1245 |
-
AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u7mFVbwQ+zzne
|
1246 |
-
xRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0xtcgBEXkzYABurorbs6q15L+
|
1247 |
-
5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQrfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarV
|
1248 |
-
NZ1yQAOJujEdxRBoUp7fooXFXAimeOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZ
|
1249 |
-
w7JHpsIyYdfHb0gkUSeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ=
|
1250 |
-
-----END CERTIFICATE-----
|
1251 |
-
|
1252 |
-
UTN USERFirst Hardware Root CA
|
1253 |
-
==============================
|
1254 |
-
-----BEGIN CERTIFICATE-----
|
1255 |
-
MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE
|
1256 |
-
BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
|
1257 |
-
IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd
|
1258 |
-
BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx
|
1259 |
-
OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0
|
1260 |
-
eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz
|
1261 |
-
ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3
|
1262 |
-
DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI
|
1263 |
-
wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd
|
1264 |
-
tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8
|
1265 |
-
i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf
|
1266 |
-
Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw
|
1267 |
-
gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF
|
1268 |
-
lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF
|
1269 |
-
UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF
|
1270 |
-
BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
|
1271 |
-
//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW
|
1272 |
-
XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2
|
1273 |
-
lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn
|
1274 |
-
iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67
|
1275 |
-
nfhmqA==
|
1276 |
-
-----END CERTIFICATE-----
|
1277 |
-
|
1278 |
-
UTN USERFirst Object Root CA
|
1279 |
-
============================
|
1280 |
-
-----BEGIN CERTIFICATE-----
|
1281 |
-
MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UE
|
1282 |
-
BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
|
1283 |
-
IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAb
|
1284 |
-
BgNVBAMTFFVUTi1VU0VSRmlyc3QtT2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAz
|
1285 |
-
NlowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkx
|
1286 |
-
HjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3dy51c2Vy
|
1287 |
-
dHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCCASIwDQYJKoZIhvcNAQEB
|
1288 |
-
BQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicPHxzfOpuCaDDASmEd8S8O+r5596Uj71VR
|
1289 |
-
loTN2+O5bj4x2AogZ8f02b+U60cEPgLOKqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQ
|
1290 |
-
w5ujm9M89RKZd7G3CeBo5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vu
|
1291 |
-
lBe3/IW+pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehbkkj7
|
1292 |
-
RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUCAwEAAaOBrzCBrDAL
|
1293 |
-
BgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU2u1kdBScFDyr3ZmpvVsoTYs8
|
1294 |
-
ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmly
|
1295 |
-
c3QtT2JqZWN0LmNybDApBgNVHSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQw
|
1296 |
-
DQYJKoZIhvcNAQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw
|
1297 |
-
NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXBmMiKVl0+7kNO
|
1298 |
-
PmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU4U3GDZlDAQ0Slox4nb9QorFE
|
1299 |
-
qmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK581OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCG
|
1300 |
-
hU3IfdeLA/5u1fedFqySLKAj5ZyRUh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g=
|
1301 |
-
-----END CERTIFICATE-----
|
1302 |
-
|
1303 |
-
Camerfirma Chambers of Commerce Root
|
1304 |
-
====================================
|
1305 |
-
-----BEGIN CERTIFICATE-----
|
1306 |
-
MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
|
1307 |
-
QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
|
1308 |
-
ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx
|
1309 |
-
NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp
|
1310 |
-
cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn
|
1311 |
-
MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC
|
1312 |
-
AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU
|
1313 |
-
xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH
|
1314 |
-
NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW
|
1315 |
-
DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV
|
1316 |
-
d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud
|
1317 |
-
EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v
|
1318 |
-
cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P
|
1319 |
-
AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh
|
1320 |
-
bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD
|
1321 |
-
VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
|
1322 |
-
aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi
|
1323 |
-
fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD
|
1324 |
-
L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN
|
1325 |
-
UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n
|
1326 |
-
ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1
|
1327 |
-
erfutGWaIZDgqtCYvDi1czyL+Nw=
|
1328 |
-
-----END CERTIFICATE-----
|
1329 |
-
|
1330 |
-
Camerfirma Global Chambersign Root
|
1331 |
-
==================================
|
1332 |
-
-----BEGIN CERTIFICATE-----
|
1333 |
-
MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
|
1334 |
-
QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
|
1335 |
-
ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx
|
1336 |
-
NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt
|
1337 |
-
YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg
|
1338 |
-
MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw
|
1339 |
-
ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J
|
1340 |
-
1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O
|
1341 |
-
by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl
|
1342 |
-
6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c
|
1343 |
-
8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/
|
1344 |
-
BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j
|
1345 |
-
aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B
|
1346 |
-
Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj
|
1347 |
-
aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y
|
1348 |
-
ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
|
1349 |
-
bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA
|
1350 |
-
PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y
|
1351 |
-
gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ
|
1352 |
-
PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4
|
1353 |
-
IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes
|
1354 |
-
t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
|
1355 |
-
-----END CERTIFICATE-----
|
1356 |
-
|
1357 |
-
NetLock Qualified (Class QA) Root
|
1358 |
-
=================================
|
1359 |
-
-----BEGIN CERTIFICATE-----
|
1360 |
-
MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUxETAPBgNVBAcT
|
1361 |
-
CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
|
1362 |
-
BAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQDEzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVn
|
1363 |
-
eXpvaSAoQ2xhc3MgUUEpIFRhbnVzaXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0
|
1364 |
-
bG9jay5odTAeFw0wMzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTER
|
1365 |
-
MA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNhZ2kgS2Z0
|
1366 |
-
LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5ldExvY2sgTWlub3NpdGV0
|
1367 |
-
dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZhbnlraWFkbzEeMBwGCSqGSIb3DQEJARYP
|
1368 |
-
aW5mb0BuZXRsb2NrLmh1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRV
|
1369 |
-
CacbvWy5FPSKAtt2/GoqeKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e
|
1370 |
-
8ia6AFQer7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO53Lhb
|
1371 |
-
m+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWdvLrqOU+L73Sa58XQ
|
1372 |
-
0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0lmT+1fMptsK6ZmfoIYOcZwvK9UdPM
|
1373 |
-
0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4ICwDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV
|
1374 |
-
HQ8BAf8EBAMCAQYwggJ1BglghkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2
|
1375 |
-
YW55IGEgTmV0TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh
|
1376 |
-
biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQgZWxla3Ryb25p
|
1377 |
-
a3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywgdmFsYW1pbnQgZWxmb2dhZGFz
|
1378 |
-
YW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwg
|
1379 |
-
YXogQWx0YWxhbm9zIFN6ZXJ6b2Rlc2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kg
|
1380 |
-
ZWxqYXJhcyBtZWd0ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczov
|
1381 |
-
L3d3dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0BuZXRsb2Nr
|
1382 |
-
Lm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0
|
1383 |
-
aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMg
|
1384 |
-
YXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0
|
1385 |
-
IGluZm9AbmV0bG9jay5uZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3
|
1386 |
-
DQEBBQUAA4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQMznN
|
1387 |
-
wNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+NFAwLvt/MpqNPfMg
|
1388 |
-
W/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCRVCHnpgu0mfVRQdzNo0ci2ccBgcTc
|
1389 |
-
R08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR
|
1390 |
-
5qq5aKrN9p2QdRLqOBrKROi3macqaJVmlaut74nLYKkGEsaUR+ko
|
1391 |
-
-----END CERTIFICATE-----
|
1392 |
-
|
1393 |
-
NetLock Notary (Class A) Root
|
1394 |
-
=============================
|
1395 |
-
-----BEGIN CERTIFICATE-----
|
1396 |
-
MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI
|
1397 |
-
EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
|
1398 |
-
dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j
|
1399 |
-
ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX
|
1400 |
-
DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH
|
1401 |
-
EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD
|
1402 |
-
VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz
|
1403 |
-
cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM
|
1404 |
-
D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ
|
1405 |
-
z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC
|
1406 |
-
/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7
|
1407 |
-
tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6
|
1408 |
-
4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG
|
1409 |
-
A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC
|
1410 |
-
Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv
|
1411 |
-
bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu
|
1412 |
-
IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn
|
1413 |
-
LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0
|
1414 |
-
ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz
|
1415 |
-
IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh
|
1416 |
-
IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu
|
1417 |
-
b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh
|
1418 |
-
bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg
|
1419 |
-
Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp
|
1420 |
-
bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5
|
1421 |
-
ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP
|
1422 |
-
ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB
|
1423 |
-
CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr
|
1424 |
-
KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM
|
1425 |
-
8CgHrTwXZoi1/baI
|
1426 |
-
-----END CERTIFICATE-----
|
1427 |
-
|
1428 |
-
NetLock Business (Class B) Root
|
1429 |
-
===============================
|
1430 |
-
-----BEGIN CERTIFICATE-----
|
1431 |
-
MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT
|
1432 |
-
CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
|
1433 |
-
BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg
|
1434 |
-
VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD
|
1435 |
-
VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv
|
1436 |
-
bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg
|
1437 |
-
VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
|
1438 |
-
iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S
|
1439 |
-
o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr
|
1440 |
-
1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV
|
1441 |
-
HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ
|
1442 |
-
RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh
|
1443 |
-
dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0
|
1444 |
-
ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv
|
1445 |
-
c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg
|
1446 |
-
YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh
|
1447 |
-
c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz
|
1448 |
-
Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA
|
1449 |
-
bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl
|
1450 |
-
IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2
|
1451 |
-
YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj
|
1452 |
-
cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM
|
1453 |
-
43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR
|
1454 |
-
stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI
|
1455 |
-
-----END CERTIFICATE-----
|
1456 |
-
|
1457 |
-
NetLock Express (Class C) Root
|
1458 |
-
==============================
|
1459 |
-
-----BEGIN CERTIFICATE-----
|
1460 |
-
MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT
|
1461 |
-
CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
|
1462 |
-
BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD
|
1463 |
-
KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ
|
1464 |
-
BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
|
1465 |
-
dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j
|
1466 |
-
ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB
|
1467 |
-
jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z
|
1468 |
-
W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63
|
1469 |
-
euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw
|
1470 |
-
DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN
|
1471 |
-
RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn
|
1472 |
-
YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB
|
1473 |
-
IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i
|
1474 |
-
aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0
|
1475 |
-
ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs
|
1476 |
-
ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo
|
1477 |
-
dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y
|
1478 |
-
emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k
|
1479 |
-
IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ
|
1480 |
-
UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg
|
1481 |
-
YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2
|
1482 |
-
xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW
|
1483 |
-
gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A==
|
1484 |
-
-----END CERTIFICATE-----
|
1485 |
-
|
1486 |
-
XRamp Global CA Root
|
1487 |
-
====================
|
1488 |
-
-----BEGIN CERTIFICATE-----
|
1489 |
-
MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
|
1490 |
-
BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
|
1491 |
-
dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
|
1492 |
-
dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
|
1493 |
-
HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
|
1494 |
-
U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
|
1495 |
-
dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
|
1496 |
-
IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
|
1497 |
-
foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
|
1498 |
-
zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
|
1499 |
-
AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
|
1500 |
-
xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
|
1501 |
-
EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
|
1502 |
-
oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
|
1503 |
-
AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
|
1504 |
-
/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
|
1505 |
-
qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
|
1506 |
-
nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
|
1507 |
-
8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
|
1508 |
-
-----END CERTIFICATE-----
|
1509 |
-
|
1510 |
-
Go Daddy Class 2 CA
|
1511 |
-
===================
|
1512 |
-
-----BEGIN CERTIFICATE-----
|
1513 |
-
MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
|
1514 |
-
VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
|
1515 |
-
ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
|
1516 |
-
A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
|
1517 |
-
RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
|
1518 |
-
ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
|
1519 |
-
2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
|
1520 |
-
qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
|
1521 |
-
YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
|
1522 |
-
vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
|
1523 |
-
BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
|
1524 |
-
atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
|
1525 |
-
MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
|
1526 |
-
A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
|
1527 |
-
PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
|
1528 |
-
I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
|
1529 |
-
HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
|
1530 |
-
Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
|
1531 |
-
vZ8=
|
1532 |
-
-----END CERTIFICATE-----
|
1533 |
-
|
1534 |
-
Starfield Class 2 CA
|
1535 |
-
====================
|
1536 |
-
-----BEGIN CERTIFICATE-----
|
1537 |
-
MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
|
1538 |
-
U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
|
1539 |
-
Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
|
1540 |
-
MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
|
1541 |
-
A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
|
1542 |
-
SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
|
1543 |
-
bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
|
1544 |
-
JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
|
1545 |
-
epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
|
1546 |
-
F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
|
1547 |
-
MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
|
1548 |
-
hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
|
1549 |
-
bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
|
1550 |
-
QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
|
1551 |
-
afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
|
1552 |
-
PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
|
1553 |
-
xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
|
1554 |
-
KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
|
1555 |
-
QBFGmh95DmK/D5fs4C8fF5Q=
|
1556 |
-
-----END CERTIFICATE-----
|
1557 |
-
|
1558 |
-
StartCom Certification Authority
|
1559 |
-
================================
|
1560 |
-
-----BEGIN CERTIFICATE-----
|
1561 |
-
MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
|
1562 |
-
U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
|
1563 |
-
ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
|
1564 |
-
NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
|
1565 |
-
LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
|
1566 |
-
U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
|
1567 |
-
ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
|
1568 |
-
o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
|
1569 |
-
Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
|
1570 |
-
eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
|
1571 |
-
2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
|
1572 |
-
6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
|
1573 |
-
osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
|
1574 |
-
untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
|
1575 |
-
UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
|
1576 |
-
37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
|
1577 |
-
FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0
|
1578 |
-
Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj
|
1579 |
-
YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH
|
1580 |
-
AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw
|
1581 |
-
Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg
|
1582 |
-
U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5
|
1583 |
-
LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl
|
1584 |
-
cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh
|
1585 |
-
cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT
|
1586 |
-
dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC
|
1587 |
-
AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh
|
1588 |
-
3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm
|
1589 |
-
vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk
|
1590 |
-
fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3
|
1591 |
-
fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ
|
1592 |
-
EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
|
1593 |
-
yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl
|
1594 |
-
1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/
|
1595 |
-
lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro
|
1596 |
-
g14=
|
1597 |
-
-----END CERTIFICATE-----
|
1598 |
-
|
1599 |
-
Taiwan GRCA
|
1600 |
-
===========
|
1601 |
-
-----BEGIN CERTIFICATE-----
|
1602 |
-
MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG
|
1603 |
-
EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X
|
1604 |
-
DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv
|
1605 |
-
dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD
|
1606 |
-
ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN
|
1607 |
-
w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5
|
1608 |
-
BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O
|
1609 |
-
1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO
|
1610 |
-
htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov
|
1611 |
-
J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7
|
1612 |
-
Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t
|
1613 |
-
B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB
|
1614 |
-
O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8
|
1615 |
-
lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV
|
1616 |
-
HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2
|
1617 |
-
09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
|
1618 |
-
TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj
|
1619 |
-
Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2
|
1620 |
-
Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU
|
1621 |
-
D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz
|
1622 |
-
DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk
|
1623 |
-
Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk
|
1624 |
-
7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ
|
1625 |
-
CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy
|
1626 |
-
+fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS
|
1627 |
-
-----END CERTIFICATE-----
|
1628 |
-
|
1629 |
-
Firmaprofesional Root CA
|
1630 |
-
========================
|
1631 |
-
-----BEGIN CERTIFICATE-----
|
1632 |
-
MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT
|
1633 |
-
GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp
|
1634 |
-
Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA
|
1635 |
-
ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL
|
1636 |
-
MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT
|
1637 |
-
OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2
|
1638 |
-
ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB
|
1639 |
-
AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V
|
1640 |
-
j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH
|
1641 |
-
lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf
|
1642 |
-
3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8
|
1643 |
-
NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww
|
1644 |
-
KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG
|
1645 |
-
AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud
|
1646 |
-
DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD
|
1647 |
-
ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq
|
1648 |
-
u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf
|
1649 |
-
wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm
|
1650 |
-
7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG
|
1651 |
-
VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA=
|
1652 |
-
-----END CERTIFICATE-----
|
1653 |
-
|
1654 |
-
Wells Fargo Root CA
|
1655 |
-
===================
|
1656 |
-
-----BEGIN CERTIFICATE-----
|
1657 |
-
MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV
|
1658 |
-
BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv
|
1659 |
-
cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
|
1660 |
-
MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl
|
1661 |
-
bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv
|
1662 |
-
MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
|
1663 |
-
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX
|
1664 |
-
x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3
|
1665 |
-
E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5
|
1666 |
-
OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j
|
1667 |
-
sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj
|
1668 |
-
YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF
|
1669 |
-
BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD
|
1670 |
-
ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv
|
1671 |
-
m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R
|
1672 |
-
OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx
|
1673 |
-
x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023
|
1674 |
-
tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s=
|
1675 |
-
-----END CERTIFICATE-----
|
1676 |
-
|
1677 |
-
Swisscom Root CA 1
|
1678 |
-
==================
|
1679 |
-
-----BEGIN CERTIFICATE-----
|
1680 |
-
MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG
|
1681 |
-
EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy
|
1682 |
-
dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4
|
1683 |
-
MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln
|
1684 |
-
aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC
|
1685 |
-
IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM
|
1686 |
-
MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF
|
1687 |
-
NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe
|
1688 |
-
AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC
|
1689 |
-
b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn
|
1690 |
-
7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN
|
1691 |
-
cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp
|
1692 |
-
WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5
|
1693 |
-
haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY
|
1694 |
-
MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw
|
1695 |
-
HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j
|
1696 |
-
BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9
|
1697 |
-
MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn
|
1698 |
-
jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ
|
1699 |
-
MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H
|
1700 |
-
VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl
|
1701 |
-
vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl
|
1702 |
-
OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3
|
1703 |
-
1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq
|
1704 |
-
nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy
|
1705 |
-
x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW
|
1706 |
-
NY6E0F/6MBr1mmz0DlP5OlvRHA==
|
1707 |
-
-----END CERTIFICATE-----
|
1708 |
-
|
1709 |
-
DigiCert Assured ID Root CA
|
1710 |
-
===========================
|
1711 |
-
-----BEGIN CERTIFICATE-----
|
1712 |
-
MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
|
1713 |
-
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
|
1714 |
-
IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
|
1715 |
-
MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
|
1716 |
-
ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
|
1717 |
-
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
|
1718 |
-
9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
|
1719 |
-
UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
|
1720 |
-
/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
|
1721 |
-
oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
|
1722 |
-
GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
|
1723 |
-
66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
|
1724 |
-
hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
|
1725 |
-
EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
|
1726 |
-
SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
|
1727 |
-
8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
|
1728 |
-
+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
|
1729 |
-
-----END CERTIFICATE-----
|
1730 |
-
|
1731 |
-
DigiCert Global Root CA
|
1732 |
-
=======================
|
1733 |
-
-----BEGIN CERTIFICATE-----
|
1734 |
-
MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
|
1735 |
-
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
|
1736 |
-
HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
|
1737 |
-
MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
|
1738 |
-
dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
|
1739 |
-
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
|
1740 |
-
TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
|
1741 |
-
BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
|
1742 |
-
4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
|
1743 |
-
7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
|
1744 |
-
o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
|
1745 |
-
8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
|
1746 |
-
BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
|
1747 |
-
EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
|
1748 |
-
tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
|
1749 |
-
UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
|
1750 |
-
CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
|
1751 |
-
-----END CERTIFICATE-----
|
1752 |
-
|
1753 |
-
DigiCert High Assurance EV Root CA
|
1754 |
-
==================================
|
1755 |
-
-----BEGIN CERTIFICATE-----
|
1756 |
-
MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
|
1757 |
-
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
|
1758 |
-
KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
|
1759 |
-
MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
|
1760 |
-
MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
|
1761 |
-
Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
|
1762 |
-
Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
|
1763 |
-
OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
|
1764 |
-
MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
|
1765 |
-
NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
|
1766 |
-
h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
|
1767 |
-
Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
|
1768 |
-
JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
|
1769 |
-
V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
|
1770 |
-
myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
|
1771 |
-
mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
|
1772 |
-
vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
|
1773 |
-
-----END CERTIFICATE-----
|
1774 |
-
|
1775 |
-
Certplus Class 2 Primary CA
|
1776 |
-
===========================
|
1777 |
-
-----BEGIN CERTIFICATE-----
|
1778 |
-
MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE
|
1779 |
-
BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN
|
1780 |
-
OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy
|
1781 |
-
dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
|
1782 |
-
ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR
|
1783 |
-
5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ
|
1784 |
-
Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO
|
1785 |
-
YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e
|
1786 |
-
e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME
|
1787 |
-
CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ
|
1788 |
-
YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t
|
1789 |
-
L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD
|
1790 |
-
P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R
|
1791 |
-
TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+
|
1792 |
-
7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW
|
1793 |
-
//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
|
1794 |
-
l7+ijrRU
|
1795 |
-
-----END CERTIFICATE-----
|
1796 |
-
|
1797 |
-
DST Root CA X3
|
1798 |
-
==============
|
1799 |
-
-----BEGIN CERTIFICATE-----
|
1800 |
-
MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
|
1801 |
-
ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
|
1802 |
-
DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
|
1803 |
-
cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
|
1804 |
-
ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
|
1805 |
-
rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
|
1806 |
-
UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
|
1807 |
-
xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
|
1808 |
-
utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
|
1809 |
-
AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
|
1810 |
-
MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
|
1811 |
-
dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
|
1812 |
-
GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
|
1813 |
-
RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
|
1814 |
-
fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
|
1815 |
-
-----END CERTIFICATE-----
|
1816 |
-
|
1817 |
-
DST ACES CA X6
|
1818 |
-
==============
|
1819 |
-
-----BEGIN CERTIFICATE-----
|
1820 |
-
MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG
|
1821 |
-
EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT
|
1822 |
-
MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha
|
1823 |
-
MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE
|
1824 |
-
CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC
|
1825 |
-
AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI
|
1826 |
-
DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa
|
1827 |
-
pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow
|
1828 |
-
GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy
|
1829 |
-
MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud
|
1830 |
-
EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu
|
1831 |
-
Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy
|
1832 |
-
dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU
|
1833 |
-
CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2
|
1834 |
-
5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t
|
1835 |
-
Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
|
1836 |
-
nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs
|
1837 |
-
vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3
|
1838 |
-
oKfN5XozNmr6mis=
|
1839 |
-
-----END CERTIFICATE-----
|
1840 |
-
|
1841 |
-
TURKTRUST Certificate Services Provider Root 1
|
1842 |
-
==============================================
|
1843 |
-
-----BEGIN CERTIFICATE-----
|
1844 |
-
MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
|
1845 |
-
bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP
|
1846 |
-
MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0
|
1847 |
-
acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx
|
1848 |
-
MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg
|
1849 |
-
U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB
|
1850 |
-
TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC
|
1851 |
-
aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC
|
1852 |
-
AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX
|
1853 |
-
yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i
|
1854 |
-
Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ
|
1855 |
-
8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4
|
1856 |
-
W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME
|
1857 |
-
BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46
|
1858 |
-
sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE
|
1859 |
-
q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy
|
1860 |
-
B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY
|
1861 |
-
nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H
|
1862 |
-
-----END CERTIFICATE-----
|
1863 |
-
|
1864 |
-
TURKTRUST Certificate Services Provider Root 2
|
1865 |
-
==============================================
|
1866 |
-
-----BEGIN CERTIFICATE-----
|
1867 |
-
MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF
|
1868 |
-
bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
|
1869 |
-
MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
|
1870 |
-
QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN
|
1871 |
-
MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr
|
1872 |
-
dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G
|
1873 |
-
A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
|
1874 |
-
acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G
|
1875 |
-
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe
|
1876 |
-
LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI
|
1877 |
-
x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g
|
1878 |
-
QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr
|
1879 |
-
5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB
|
1880 |
-
AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G
|
1881 |
-
A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt
|
1882 |
-
Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4
|
1883 |
-
Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+
|
1884 |
-
hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P
|
1885 |
-
9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5
|
1886 |
-
UrbnBEI=
|
1887 |
-
-----END CERTIFICATE-----
|
1888 |
-
|
1889 |
-
SwissSign Platinum CA - G2
|
1890 |
-
==========================
|
1891 |
-
-----BEGIN CERTIFICATE-----
|
1892 |
-
MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UEBhMCQ0gxFTAT
|
1893 |
-
BgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWduIFBsYXRpbnVtIENBIC0gRzIw
|
1894 |
-
HhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAwWjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMM
|
1895 |
-
U3dpc3NTaWduIEFHMSMwIQYDVQQDExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJ
|
1896 |
-
KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu
|
1897 |
-
669yIIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2HtnIuJpX+UF
|
1898 |
-
eNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+6ixuEFGSzH7VozPY1kne
|
1899 |
-
WCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5objM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIo
|
1900 |
-
j5+saCB9bzuohTEJfwvH6GXp43gOCWcwizSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/6
|
1901 |
-
8++QHkwFix7qepF6w9fl+zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34T
|
1902 |
-
aNhxKFrYzt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaPpZjy
|
1903 |
-
domyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtFKwH3HBqi7Ri6Cr2D
|
1904 |
-
+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuWae5ogObnmLo2t/5u7Su9IPhlGdpV
|
1905 |
-
CX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMBAAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud
|
1906 |
-
EwEB/wQFMAMBAf8wHQYDVR0OBBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCv
|
1907 |
-
zAeHFUdvOMW0ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW
|
1908 |
-
IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUAA4ICAQAIhab1
|
1909 |
-
Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0uMoI3LQwnkAHFmtllXcBrqS3
|
1910 |
-
NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4
|
1911 |
-
U99REJNi54Av4tHgvI42Rncz7Lj7jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8
|
1912 |
-
KV2LwUvJ4ooTHbG/u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl
|
1913 |
-
9x8DYSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1puEa+S1B
|
1914 |
-
aYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXaicYwu+uPyyIIoK6q8QNs
|
1915 |
-
OktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbGDI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSY
|
1916 |
-
Mdp08YSTcU1f+2BY0fvEwW2JorsgH51xkcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAci
|
1917 |
-
IfNAChs0B0QTwoRqjt8ZWr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g==
|
1918 |
-
-----END CERTIFICATE-----
|
1919 |
-
|
1920 |
-
SwissSign Gold CA - G2
|
1921 |
-
======================
|
1922 |
-
-----BEGIN CERTIFICATE-----
|
1923 |
-
MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw
|
1924 |
-
EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN
|
1925 |
-
MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp
|
1926 |
-
c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B
|
1927 |
-
AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq
|
1928 |
-
t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C
|
1929 |
-
jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg
|
1930 |
-
vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF
|
1931 |
-
ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR
|
1932 |
-
AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend
|
1933 |
-
jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO
|
1934 |
-
peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR
|
1935 |
-
7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi
|
1936 |
-
GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw
|
1937 |
-
AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64
|
1938 |
-
OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
|
1939 |
-
L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm
|
1940 |
-
5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr
|
1941 |
-
44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf
|
1942 |
-
Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m
|
1943 |
-
Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp
|
1944 |
-
mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk
|
1945 |
-
vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf
|
1946 |
-
KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br
|
1947 |
-
NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj
|
1948 |
-
viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
|
1949 |
-
-----END CERTIFICATE-----
|
1950 |
-
|
1951 |
-
SwissSign Silver CA - G2
|
1952 |
-
========================
|
1953 |
-
-----BEGIN CERTIFICATE-----
|
1954 |
-
MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT
|
1955 |
-
BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X
|
1956 |
-
DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3
|
1957 |
-
aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG
|
1958 |
-
9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644
|
1959 |
-
N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm
|
1960 |
-
+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH
|
1961 |
-
6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu
|
1962 |
-
MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h
|
1963 |
-
qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5
|
1964 |
-
FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs
|
1965 |
-
ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc
|
1966 |
-
celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X
|
1967 |
-
CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
|
1968 |
-
BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB
|
1969 |
-
tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
|
1970 |
-
cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P
|
1971 |
-
4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F
|
1972 |
-
kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L
|
1973 |
-
3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx
|
1974 |
-
/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa
|
1975 |
-
DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP
|
1976 |
-
e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu
|
1977 |
-
WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ
|
1978 |
-
DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub
|
1979 |
-
DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
|
1980 |
-
-----END CERTIFICATE-----
|
1981 |
-
|
1982 |
-
GeoTrust Primary Certification Authority
|
1983 |
-
========================================
|
1984 |
-
-----BEGIN CERTIFICATE-----
|
1985 |
-
MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
|
1986 |
-
EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
|
1987 |
-
ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
|
1988 |
-
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
|
1989 |
-
cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
|
1990 |
-
CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
|
1991 |
-
b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
|
1992 |
-
nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
|
1993 |
-
RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
|
1994 |
-
tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
|
1995 |
-
AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
|
1996 |
-
hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
|
1997 |
-
Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
|
1998 |
-
NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
|
1999 |
-
Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
|
2000 |
-
1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
|
2001 |
-
-----END CERTIFICATE-----
|
2002 |
-
|
2003 |
-
thawte Primary Root CA
|
2004 |
-
======================
|
2005 |
-
-----BEGIN CERTIFICATE-----
|
2006 |
-
MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
|
2007 |
-
BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
|
2008 |
-
aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
|
2009 |
-
cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
|
2010 |
-
MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
|
2011 |
-
SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
|
2012 |
-
KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
|
2013 |
-
FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
|
2014 |
-
oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
|
2015 |
-
1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
|
2016 |
-
q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
|
2017 |
-
aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
|
2018 |
-
afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
|
2019 |
-
VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
|
2020 |
-
AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
|
2021 |
-
uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
|
2022 |
-
xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
|
2023 |
-
jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
|
2024 |
-
z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
|
2025 |
-
-----END CERTIFICATE-----
|
2026 |
-
|
2027 |
-
VeriSign Class 3 Public Primary Certification Authority - G5
|
2028 |
-
============================================================
|
2029 |
-
-----BEGIN CERTIFICATE-----
|
2030 |
-
MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
|
2031 |
-
BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
|
2032 |
-
ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
|
2033 |
-
IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
|
2034 |
-
ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
|
2035 |
-
yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
|
2036 |
-
biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
|
2037 |
-
dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
|
2038 |
-
YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
|
2039 |
-
ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
|
2040 |
-
j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
|
2041 |
-
Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
|
2042 |
-
Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
|
2043 |
-
fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
|
2044 |
-
BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
|
2045 |
-
Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
|
2046 |
-
aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
|
2047 |
-
SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
|
2048 |
-
X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
|
2049 |
-
KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
|
2050 |
-
Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
|
2051 |
-
ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
|
2052 |
-
-----END CERTIFICATE-----
|
2053 |
-
|
2054 |
-
SecureTrust CA
|
2055 |
-
==============
|
2056 |
-
-----BEGIN CERTIFICATE-----
|
2057 |
-
MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
|
2058 |
-
EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
|
2059 |
-
dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
|
2060 |
-
BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
|
2061 |
-
ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
|
2062 |
-
OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
|
2063 |
-
DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
|
2064 |
-
GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
|
2065 |
-
01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
|
2066 |
-
ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
|
2067 |
-
BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
|
2068 |
-
aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
|
2069 |
-
KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
|
2070 |
-
SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
|
2071 |
-
mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
|
2072 |
-
nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
|
2073 |
-
3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
|
2074 |
-
-----END CERTIFICATE-----
|
2075 |
-
|
2076 |
-
Secure Global CA
|
2077 |
-
================
|
2078 |
-
-----BEGIN CERTIFICATE-----
|
2079 |
-
MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
|
2080 |
-
EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
|
2081 |
-
bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
|
2082 |
-
MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
|
2083 |
-
Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
|
2084 |
-
YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
|
2085 |
-
bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
|
2086 |
-
8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
|
2087 |
-
HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
|
2088 |
-
0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
|
2089 |
-
EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
|
2090 |
-
oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
|
2091 |
-
MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
|
2092 |
-
OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
|
2093 |
-
CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
|
2094 |
-
3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
|
2095 |
-
f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
|
2096 |
-
-----END CERTIFICATE-----
|
2097 |
-
|
2098 |
-
COMODO Certification Authority
|
2099 |
-
==============================
|
2100 |
-
-----BEGIN CERTIFICATE-----
|
2101 |
-
MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
|
2102 |
-
BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
|
2103 |
-
A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
|
2104 |
-
dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
|
2105 |
-
MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
|
2106 |
-
T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
|
2107 |
-
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
|
2108 |
-
+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
|
2109 |
-
xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
|
2110 |
-
4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
|
2111 |
-
1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
|
2112 |
-
rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
|
2113 |
-
BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
|
2114 |
-
b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
|
2115 |
-
AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
|
2116 |
-
OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
|
2117 |
-
RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
|
2118 |
-
IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
|
2119 |
-
+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
|
2120 |
-
-----END CERTIFICATE-----
|
2121 |
-
|
2122 |
-
Network Solutions Certificate Authority
|
2123 |
-
=======================================
|
2124 |
-
-----BEGIN CERTIFICATE-----
|
2125 |
-
MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
|
2126 |
-
EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
|
2127 |
-
IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
|
2128 |
-
MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
|
2129 |
-
MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
|
2130 |
-
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
|
2131 |
-
jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
|
2132 |
-
aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
|
2133 |
-
crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
|
2134 |
-
/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
|
2135 |
-
AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
|
2136 |
-
BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
|
2137 |
-
bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
|
2138 |
-
A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
|
2139 |
-
4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
|
2140 |
-
GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
|
2141 |
-
wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
|
2142 |
-
ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
|
2143 |
-
-----END CERTIFICATE-----
|
2144 |
-
|
2145 |
-
WellsSecure Public Root Certificate Authority
|
2146 |
-
=============================================
|
2147 |
-
-----BEGIN CERTIFICATE-----
|
2148 |
-
MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM
|
2149 |
-
F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw
|
2150 |
-
NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
|
2151 |
-
MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl
|
2152 |
-
bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD
|
2153 |
-
VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
|
2154 |
-
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1
|
2155 |
-
iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13
|
2156 |
-
i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8
|
2157 |
-
bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB
|
2158 |
-
K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB
|
2159 |
-
AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu
|
2160 |
-
cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm
|
2161 |
-
lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB
|
2162 |
-
i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww
|
2163 |
-
GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
|
2164 |
-
Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI
|
2165 |
-
K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0
|
2166 |
-
bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj
|
2167 |
-
qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es
|
2168 |
-
E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ
|
2169 |
-
tylv2G0xffX8oRAHh84vWdw+WNs=
|
2170 |
-
-----END CERTIFICATE-----
|
2171 |
-
|
2172 |
-
COMODO ECC Certification Authority
|
2173 |
-
==================================
|
2174 |
-
-----BEGIN CERTIFICATE-----
|
2175 |
-
MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
|
2176 |
-
R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
|
2177 |
-
ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
|
2178 |
-
dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
|
2179 |
-
GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
|
2180 |
-
Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
|
2181 |
-
b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
|
2182 |
-
4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
|
2183 |
-
wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
|
2184 |
-
BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
|
2185 |
-
FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
|
2186 |
-
U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
|
2187 |
-
-----END CERTIFICATE-----
|
2188 |
-
|
2189 |
-
IGC/A
|
2190 |
-
=====
|
2191 |
-
-----BEGIN CERTIFICATE-----
|
2192 |
-
MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD
|
2193 |
-
VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE
|
2194 |
-
Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy
|
2195 |
-
MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI
|
2196 |
-
EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT
|
2197 |
-
STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB
|
2198 |
-
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2
|
2199 |
-
TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW
|
2200 |
-
So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy
|
2201 |
-
HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd
|
2202 |
-
frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ
|
2203 |
-
tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB
|
2204 |
-
egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC
|
2205 |
-
iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK
|
2206 |
-
q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q
|
2207 |
-
MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg
|
2208 |
-
Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI
|
2209 |
-
lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF
|
2210 |
-
0mBWWg==
|
2211 |
-
-----END CERTIFICATE-----
|
2212 |
-
|
2213 |
-
Security Communication EV RootCA1
|
2214 |
-
=================================
|
2215 |
-
-----BEGIN CERTIFICATE-----
|
2216 |
-
MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
|
2217 |
-
U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh
|
2218 |
-
dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE
|
2219 |
-
BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl
|
2220 |
-
Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
|
2221 |
-
AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO
|
2222 |
-
/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX
|
2223 |
-
WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z
|
2224 |
-
ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4
|
2225 |
-
bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK
|
2226 |
-
9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
|
2227 |
-
SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm
|
2228 |
-
iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG
|
2229 |
-
Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW
|
2230 |
-
mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW
|
2231 |
-
T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
|
2232 |
-
-----END CERTIFICATE-----
|
2233 |
-
|
2234 |
-
OISTE WISeKey Global Root GA CA
|
2235 |
-
===============================
|
2236 |
-
-----BEGIN CERTIFICATE-----
|
2237 |
-
MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
|
2238 |
-
BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
|
2239 |
-
A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
|
2240 |
-
bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
|
2241 |
-
VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
|
2242 |
-
IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
|
2243 |
-
IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
|
2244 |
-
Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
|
2245 |
-
Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
|
2246 |
-
d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
|
2247 |
-
/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
|
2248 |
-
LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
|
2249 |
-
AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
|
2250 |
-
KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
|
2251 |
-
MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
|
2252 |
-
+vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
|
2253 |
-
hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
|
2254 |
-
okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
|
2255 |
-
-----END CERTIFICATE-----
|
2256 |
-
|
2257 |
-
S-TRUST Authentication and Encryption Root CA 2005 PN
|
2258 |
-
=====================================================
|
2259 |
-
-----BEGIN CERTIFICATE-----
|
2260 |
-
MIIEezCCA2OgAwIBAgIQNxkY5lNUfBq1uMtZWts1tzANBgkqhkiG9w0BAQUFADCBrjELMAkGA1UE
|
2261 |
-
BhMCREUxIDAeBgNVBAgTF0JhZGVuLVd1ZXJ0dGVtYmVyZyAoQlcpMRIwEAYDVQQHEwlTdHV0dGdh
|
2262 |
-
cnQxKTAnBgNVBAoTIERldXRzY2hlciBTcGFya2Fzc2VuIFZlcmxhZyBHbWJIMT4wPAYDVQQDEzVT
|
2263 |
-
LVRSVVNUIEF1dGhlbnRpY2F0aW9uIGFuZCBFbmNyeXB0aW9uIFJvb3QgQ0EgMjAwNTpQTjAeFw0w
|
2264 |
-
NTA2MjIwMDAwMDBaFw0zMDA2MjEyMzU5NTlaMIGuMQswCQYDVQQGEwJERTEgMB4GA1UECBMXQmFk
|
2265 |
-
ZW4tV3VlcnR0ZW1iZXJnIChCVykxEjAQBgNVBAcTCVN0dXR0Z2FydDEpMCcGA1UEChMgRGV1dHNj
|
2266 |
-
aGVyIFNwYXJrYXNzZW4gVmVybGFnIEdtYkgxPjA8BgNVBAMTNVMtVFJVU1QgQXV0aGVudGljYXRp
|
2267 |
-
b24gYW5kIEVuY3J5cHRpb24gUm9vdCBDQSAyMDA1OlBOMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
|
2268 |
-
MIIBCgKCAQEA2bVKwdMz6tNGs9HiTNL1toPQb9UY6ZOvJ44TzbUlNlA0EmQpoVXhOmCTnijJ4/Ob
|
2269 |
-
4QSwI7+Vio5bG0F/WsPoTUzVJBY+h0jUJ67m91MduwwA7z5hca2/OnpYH5Q9XIHV1W/fuJvS9eXL
|
2270 |
-
g3KSwlOyggLrra1fFi2SU3bxibYs9cEv4KdKb6AwajLrmnQDaHgTncovmwsdvs91DSaXm8f1Xgqf
|
2271 |
-
eN+zvOyauu9VjxuapgdjKRdZYgkqeQd3peDRF2npW932kKvimAoA0SVtnteFhy+S8dF2g08LOlk3
|
2272 |
-
KC8zpxdQ1iALCvQm+Z845y2kuJuJja2tyWp9iRe79n+Ag3rm7QIDAQABo4GSMIGPMBIGA1UdEwEB
|
2273 |
-
/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTVFJv
|
2274 |
-
bmxpbmUxLTIwNDgtNTAdBgNVHQ4EFgQUD8oeXHngovMpttKFswtKtWXsa1IwHwYDVR0jBBgwFoAU
|
2275 |
-
D8oeXHngovMpttKFswtKtWXsa1IwDQYJKoZIhvcNAQEFBQADggEBAK8B8O0ZPCjoTVy7pWMciDMD
|
2276 |
-
pwCHpB8gq9Yc4wYfl35UvbfRssnV2oDsF9eK9XvCAPbpEW+EoFolMeKJ+aQAPzFoLtU96G7m1R08
|
2277 |
-
P7K9n3frndOMusDXtk3sU5wPBG7qNWdX4wple5A64U8+wwCSersFiXOMy6ZNwPv2AtawB6MDwidA
|
2278 |
-
nwzkhYItr5pCHdDHjfhA7p0GVxzZotiAFP7hYy0yh9WUUpY6RsZxlj33mA6ykaqP2vROJAA5Veit
|
2279 |
-
F7nTNCtKqUDMFypVZUF0Qn71wK/Ik63yGFs9iQzbRzkk+OBM8h+wPQrKBU6JIRrjKpms/H+h8Q8b
|
2280 |
-
Hz2eBIPdltkdOpQ=
|
2281 |
-
-----END CERTIFICATE-----
|
2282 |
-
|
2283 |
-
Microsec e-Szigno Root CA
|
2284 |
-
=========================
|
2285 |
-
-----BEGIN CERTIFICATE-----
|
2286 |
-
MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE
|
2287 |
-
BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL
|
2288 |
-
EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0
|
2289 |
-
MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz
|
2290 |
-
dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT
|
2291 |
-
GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
|
2292 |
-
AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG
|
2293 |
-
d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N
|
2294 |
-
oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc
|
2295 |
-
QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ
|
2296 |
-
PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb
|
2297 |
-
MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG
|
2298 |
-
IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD
|
2299 |
-
VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3
|
2300 |
-
LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A
|
2301 |
-
dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn
|
2302 |
-
AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA
|
2303 |
-
4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg
|
2304 |
-
AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA
|
2305 |
-
egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6
|
2306 |
-
Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO
|
2307 |
-
PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv
|
2308 |
-
c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h
|
2309 |
-
cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw
|
2310 |
-
IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT
|
2311 |
-
WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV
|
2312 |
-
MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER
|
2313 |
-
MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp
|
2314 |
-
Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal
|
2315 |
-
HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT
|
2316 |
-
nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE
|
2317 |
-
aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a
|
2318 |
-
86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK
|
2319 |
-
yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB
|
2320 |
-
S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=
|
2321 |
-
-----END CERTIFICATE-----
|
2322 |
-
|
2323 |
-
Certigna
|
2324 |
-
========
|
2325 |
-
-----BEGIN CERTIFICATE-----
|
2326 |
-
MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
|
2327 |
-
EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
|
2328 |
-
MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
|
2329 |
-
Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
|
2330 |
-
XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
|
2331 |
-
GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
|
2332 |
-
ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
|
2333 |
-
DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
|
2334 |
-
Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
|
2335 |
-
tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
|
2336 |
-
BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
|
2337 |
-
SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
|
2338 |
-
hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
|
2339 |
-
ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
|
2340 |
-
PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
|
2341 |
-
1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
|
2342 |
-
WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
|
2343 |
-
-----END CERTIFICATE-----
|
2344 |
-
|
2345 |
-
AC Ra\xC3\xADz Certic\xC3\xA1mara S.A.
|
2346 |
-
======================================
|
2347 |
-
-----BEGIN CERTIFICATE-----
|
2348 |
-
MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT
|
2349 |
-
AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg
|
2350 |
-
LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w
|
2351 |
-
HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+
|
2352 |
-
U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh
|
2353 |
-
IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B
|
2354 |
-
AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN
|
2355 |
-
yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU
|
2356 |
-
2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3
|
2357 |
-
4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP
|
2358 |
-
2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm
|
2359 |
-
8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf
|
2360 |
-
HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa
|
2361 |
-
Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK
|
2362 |
-
5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b
|
2363 |
-
czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
|
2364 |
-
AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g
|
2365 |
-
ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF
|
2366 |
-
BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug
|
2367 |
-
cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf
|
2368 |
-
AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX
|
2369 |
-
EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v
|
2370 |
-
/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3
|
2371 |
-
MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4
|
2372 |
-
3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk
|
2373 |
-
eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f
|
2374 |
-
/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h
|
2375 |
-
RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU
|
2376 |
-
Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ==
|
2377 |
-
-----END CERTIFICATE-----
|
2378 |
-
|
2379 |
-
TC TrustCenter Class 2 CA II
|
2380 |
-
============================
|
2381 |
-
-----BEGIN CERTIFICATE-----
|
2382 |
-
MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
|
2383 |
-
REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
|
2384 |
-
IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw
|
2385 |
-
MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
|
2386 |
-
c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE
|
2387 |
-
AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
|
2388 |
-
AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw
|
2389 |
-
IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2
|
2390 |
-
xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ
|
2391 |
-
Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u
|
2392 |
-
SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB
|
2393 |
-
/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB
|
2394 |
-
7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
|
2395 |
-
Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
|
2396 |
-
cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
|
2397 |
-
SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
|
2398 |
-
TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G
|
2399 |
-
dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ
|
2400 |
-
KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj
|
2401 |
-
TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP
|
2402 |
-
JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk
|
2403 |
-
vQ==
|
2404 |
-
-----END CERTIFICATE-----
|
2405 |
-
|
2406 |
-
TC TrustCenter Class 3 CA II
|
2407 |
-
============================
|
2408 |
-
-----BEGIN CERTIFICATE-----
|
2409 |
-
MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
|
2410 |
-
REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
|
2411 |
-
IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw
|
2412 |
-
MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
|
2413 |
-
c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE
|
2414 |
-
AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
|
2415 |
-
AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W
|
2416 |
-
yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo
|
2417 |
-
6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ
|
2418 |
-
uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk
|
2419 |
-
2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB
|
2420 |
-
/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB
|
2421 |
-
7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
|
2422 |
-
Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
|
2423 |
-
cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
|
2424 |
-
SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
|
2425 |
-
TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE
|
2426 |
-
O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8
|
2427 |
-
yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9
|
2428 |
-
IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal
|
2429 |
-
092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc
|
2430 |
-
5A==
|
2431 |
-
-----END CERTIFICATE-----
|
2432 |
-
|
2433 |
-
TC TrustCenter Universal CA I
|
2434 |
-
=============================
|
2435 |
-
-----BEGIN CERTIFICATE-----
|
2436 |
-
MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC
|
2437 |
-
REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
|
2438 |
-
IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN
|
2439 |
-
MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg
|
2440 |
-
VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw
|
2441 |
-
JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD
|
2442 |
-
ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC
|
2443 |
-
qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv
|
2444 |
-
xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw
|
2445 |
-
ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O
|
2446 |
-
gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j
|
2447 |
-
BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
|
2448 |
-
AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG
|
2449 |
-
1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy
|
2450 |
-
vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3
|
2451 |
-
ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT
|
2452 |
-
ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a
|
2453 |
-
7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY
|
2454 |
-
-----END CERTIFICATE-----
|
2455 |
-
|
2456 |
-
Deutsche Telekom Root CA 2
|
2457 |
-
==========================
|
2458 |
-
-----BEGIN CERTIFICATE-----
|
2459 |
-
MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT
|
2460 |
-
RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG
|
2461 |
-
A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5
|
2462 |
-
MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G
|
2463 |
-
A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS
|
2464 |
-
b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5
|
2465 |
-
bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI
|
2466 |
-
KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY
|
2467 |
-
AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK
|
2468 |
-
Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV
|
2469 |
-
jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV
|
2470 |
-
HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr
|
2471 |
-
E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy
|
2472 |
-
zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8
|
2473 |
-
rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G
|
2474 |
-
dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
|
2475 |
-
Cm26OWMohpLzGITY+9HPBVZkVw==
|
2476 |
-
-----END CERTIFICATE-----
|
2477 |
-
|
2478 |
-
ComSign CA
|
2479 |
-
==========
|
2480 |
-
-----BEGIN CERTIFICATE-----
|
2481 |
-
MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0MRMwEQYDVQQD
|
2482 |
-
EwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTMy
|
2483 |
-
MThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMTCkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNp
|
2484 |
-
Z24xCzAJBgNVBAYTAklMMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49q
|
2485 |
-
ROR+WCf4C9DklBKK8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTy
|
2486 |
-
P2Q298CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb2CEJKHxN
|
2487 |
-
GGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxCejVb7Us6eva1jsz/D3zk
|
2488 |
-
YDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7KpiXd3DTKaCQeQzC6zJMw9kglcq/QytNuEM
|
2489 |
-
rkvF7zuZ2SOzW120V+x0cAwqTwIDAQABo4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAy
|
2490 |
-
oDCgLoYsaHR0cDovL2ZlZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0P
|
2491 |
-
AQH/BAQDAgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRLAZs+
|
2492 |
-
VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWdfoPPbrxHbvUanlR2
|
2493 |
-
QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0McXS6hMTXcpuEfDhOZAYnKuGntewI
|
2494 |
-
mbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb
|
2495 |
-
/627HOkthIDYIb6FUtnUdLlphbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VG
|
2496 |
-
zT2ouvDzuFYkRes3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U
|
2497 |
-
AGegcQCCSA==
|
2498 |
-
-----END CERTIFICATE-----
|
2499 |
-
|
2500 |
-
ComSign Secured CA
|
2501 |
-
==================
|
2502 |
-
-----BEGIN CERTIFICATE-----
|
2503 |
-
MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE
|
2504 |
-
AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w
|
2505 |
-
NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD
|
2506 |
-
QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
|
2507 |
-
ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs
|
2508 |
-
49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH
|
2509 |
-
7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB
|
2510 |
-
kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1
|
2511 |
-
9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw
|
2512 |
-
AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t
|
2513 |
-
U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA
|
2514 |
-
j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC
|
2515 |
-
AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a
|
2516 |
-
BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp
|
2517 |
-
FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP
|
2518 |
-
51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz
|
2519 |
-
OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw==
|
2520 |
-
-----END CERTIFICATE-----
|
2521 |
-
|
2522 |
-
Cybertrust Global Root
|
2523 |
-
======================
|
2524 |
-
-----BEGIN CERTIFICATE-----
|
2525 |
-
MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
|
2526 |
-
ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
|
2527 |
-
MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
|
2528 |
-
ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
|
2529 |
-
+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
|
2530 |
-
0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
|
2531 |
-
AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
|
2532 |
-
89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
|
2533 |
-
8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
|
2534 |
-
BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
|
2535 |
-
MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
|
2536 |
-
A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
|
2537 |
-
lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
|
2538 |
-
5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
|
2539 |
-
hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
|
2540 |
-
X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
|
2541 |
-
WL1WMRJOEcgh4LMRkWXbtKaIOM5V
|
2542 |
-
-----END CERTIFICATE-----
|
2543 |
-
|
2544 |
-
ePKI Root Certification Authority
|
2545 |
-
=================================
|
2546 |
-
-----BEGIN CERTIFICATE-----
|
2547 |
-
MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG
|
2548 |
-
EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg
|
2549 |
-
Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx
|
2550 |
-
MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq
|
2551 |
-
MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B
|
2552 |
-
AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs
|
2553 |
-
IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi
|
2554 |
-
lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv
|
2555 |
-
qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX
|
2556 |
-
12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O
|
2557 |
-
WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+
|
2558 |
-
ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao
|
2559 |
-
lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/
|
2560 |
-
vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi
|
2561 |
-
Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi
|
2562 |
-
MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
|
2563 |
-
ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0
|
2564 |
-
1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq
|
2565 |
-
KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV
|
2566 |
-
xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP
|
2567 |
-
NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r
|
2568 |
-
GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE
|
2569 |
-
xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx
|
2570 |
-
gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy
|
2571 |
-
sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD
|
2572 |
-
BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=
|
2573 |
-
-----END CERTIFICATE-----
|
2574 |
-
|
2575 |
-
T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3
|
2576 |
-
=============================================================================================================================
|
2577 |
-
-----BEGIN CERTIFICATE-----
|
2578 |
-
MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH
|
2579 |
-
DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q
|
2580 |
-
aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry
|
2581 |
-
b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV
|
2582 |
-
BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg
|
2583 |
-
S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4
|
2584 |
-
MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl
|
2585 |
-
IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF
|
2586 |
-
n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl
|
2587 |
-
IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft
|
2588 |
-
dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl
|
2589 |
-
cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B
|
2590 |
-
AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO
|
2591 |
-
Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1
|
2592 |
-
xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR
|
2593 |
-
6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
|
2594 |
-
hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd
|
2595 |
-
BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
|
2596 |
-
MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4
|
2597 |
-
N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT
|
2598 |
-
y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh
|
2599 |
-
LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M
|
2600 |
-
dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=
|
2601 |
-
-----END CERTIFICATE-----
|
2602 |
-
|
2603 |
-
Buypass Class 2 CA 1
|
2604 |
-
====================
|
2605 |
-
-----BEGIN CERTIFICATE-----
|
2606 |
-
MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
|
2607 |
-
QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2
|
2608 |
-
MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
|
2609 |
-
c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI
|
2610 |
-
hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M
|
2611 |
-
cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83
|
2612 |
-
0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4
|
2613 |
-
0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R
|
2614 |
-
uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC
|
2615 |
-
MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P
|
2616 |
-
AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV
|
2617 |
-
1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt
|
2618 |
-
7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2
|
2619 |
-
fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w
|
2620 |
-
wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
|
2621 |
-
-----END CERTIFICATE-----
|
2622 |
-
|
2623 |
-
Buypass Class 3 CA 1
|
2624 |
-
====================
|
2625 |
-
-----BEGIN CERTIFICATE-----
|
2626 |
-
MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
|
2627 |
-
QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1
|
2628 |
-
MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
|
2629 |
-
c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI
|
2630 |
-
hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx
|
2631 |
-
ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0
|
2632 |
-
n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia
|
2633 |
-
AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c
|
2634 |
-
1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC
|
2635 |
-
MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P
|
2636 |
-
AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7
|
2637 |
-
pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA
|
2638 |
-
EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5
|
2639 |
-
htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj
|
2640 |
-
el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915
|
2641 |
-
-----END CERTIFICATE-----
|
2642 |
-
|
2643 |
-
EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1
|
2644 |
-
==========================================================================
|
2645 |
-
-----BEGIN CERTIFICATE-----
|
2646 |
-
MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF
|
2647 |
-
bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg
|
2648 |
-
QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe
|
2649 |
-
Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p
|
2650 |
-
ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt
|
2651 |
-
IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG
|
2652 |
-
SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by
|
2653 |
-
X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b
|
2654 |
-
gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr
|
2655 |
-
eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ
|
2656 |
-
TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy
|
2657 |
-
Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn
|
2658 |
-
uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI
|
2659 |
-
qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm
|
2660 |
-
ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0
|
2661 |
-
Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
|
2662 |
-
/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW
|
2663 |
-
Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t
|
2664 |
-
FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm
|
2665 |
-
zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k
|
2666 |
-
XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT
|
2667 |
-
bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU
|
2668 |
-
RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK
|
2669 |
-
1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt
|
2670 |
-
2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ
|
2671 |
-
Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9
|
2672 |
-
AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT
|
2673 |
-
-----END CERTIFICATE-----
|
2674 |
-
|
2675 |
-
certSIGN ROOT CA
|
2676 |
-
================
|
2677 |
-
-----BEGIN CERTIFICATE-----
|
2678 |
-
MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
|
2679 |
-
VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
|
2680 |
-
Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
|
2681 |
-
CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
|
2682 |
-
JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
|
2683 |
-
rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
|
2684 |
-
ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
|
2685 |
-
0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
|
2686 |
-
AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
|
2687 |
-
Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
|
2688 |
-
AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
|
2689 |
-
SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
|
2690 |
-
x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
|
2691 |
-
vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
|
2692 |
-
TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
|
2693 |
-
-----END CERTIFICATE-----
|
2694 |
-
|
2695 |
-
CNNIC ROOT
|
2696 |
-
==========
|
2697 |
-
-----BEGIN CERTIFICATE-----
|
2698 |
-
MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE
|
2699 |
-
ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw
|
2700 |
-
OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw
|
2701 |
-
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD
|
2702 |
-
o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz
|
2703 |
-
VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT
|
2704 |
-
VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or
|
2705 |
-
czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK
|
2706 |
-
y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC
|
2707 |
-
wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S
|
2708 |
-
lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5
|
2709 |
-
Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM
|
2710 |
-
O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8
|
2711 |
-
BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2
|
2712 |
-
G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m
|
2713 |
-
mxE=
|
2714 |
-
-----END CERTIFICATE-----
|
2715 |
-
|
2716 |
-
ApplicationCA - Japanese Government
|
2717 |
-
===================================
|
2718 |
-
-----BEGIN CERTIFICATE-----
|
2719 |
-
MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT
|
2720 |
-
SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw
|
2721 |
-
MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl
|
2722 |
-
cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
|
2723 |
-
CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4
|
2724 |
-
fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN
|
2725 |
-
wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE
|
2726 |
-
jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu
|
2727 |
-
nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU
|
2728 |
-
WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV
|
2729 |
-
BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD
|
2730 |
-
vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs
|
2731 |
-
o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g
|
2732 |
-
/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD
|
2733 |
-
io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW
|
2734 |
-
dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL
|
2735 |
-
rosot4LKGAfmt1t06SAZf7IbiVQ=
|
2736 |
-
-----END CERTIFICATE-----
|
2737 |
-
|
2738 |
-
GeoTrust Primary Certification Authority - G3
|
2739 |
-
=============================================
|
2740 |
-
-----BEGIN CERTIFICATE-----
|
2741 |
-
MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE
|
2742 |
-
BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0
|
2743 |
-
IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy
|
2744 |
-
eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz
|
2745 |
-
NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo
|
2746 |
-
YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT
|
2747 |
-
LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
|
2748 |
-
hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j
|
2749 |
-
K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE
|
2750 |
-
c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C
|
2751 |
-
IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu
|
2752 |
-
dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC
|
2753 |
-
MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr
|
2754 |
-
2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9
|
2755 |
-
cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE
|
2756 |
-
Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
|
2757 |
-
AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s
|
2758 |
-
t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt
|
2759 |
-
-----END CERTIFICATE-----
|
2760 |
-
|
2761 |
-
thawte Primary Root CA - G2
|
2762 |
-
===========================
|
2763 |
-
-----BEGIN CERTIFICATE-----
|
2764 |
-
MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC
|
2765 |
-
VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu
|
2766 |
-
IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg
|
2767 |
-
Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV
|
2768 |
-
MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG
|
2769 |
-
b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt
|
2770 |
-
IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS
|
2771 |
-
LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5
|
2772 |
-
8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
|
2773 |
-
mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN
|
2774 |
-
G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K
|
2775 |
-
rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
|
2776 |
-
-----END CERTIFICATE-----
|
2777 |
-
|
2778 |
-
thawte Primary Root CA - G3
|
2779 |
-
===========================
|
2780 |
-
-----BEGIN CERTIFICATE-----
|
2781 |
-
MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE
|
2782 |
-
BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
|
2783 |
-
aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
|
2784 |
-
cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w
|
2785 |
-
ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
|
2786 |
-
d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD
|
2787 |
-
VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG
|
2788 |
-
A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
|
2789 |
-
MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At
|
2790 |
-
P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC
|
2791 |
-
+BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY
|
2792 |
-
7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW
|
2793 |
-
vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E
|
2794 |
-
BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ
|
2795 |
-
KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK
|
2796 |
-
A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
|
2797 |
-
t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC
|
2798 |
-
8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm
|
2799 |
-
er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=
|
2800 |
-
-----END CERTIFICATE-----
|
2801 |
-
|
2802 |
-
GeoTrust Primary Certification Authority - G2
|
2803 |
-
=============================================
|
2804 |
-
-----BEGIN CERTIFICATE-----
|
2805 |
-
MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
|
2806 |
-
VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
|
2807 |
-
Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
|
2808 |
-
ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
|
2809 |
-
OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
|
2810 |
-
MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
|
2811 |
-
b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
|
2812 |
-
BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
|
2813 |
-
KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
|
2814 |
-
VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
|
2815 |
-
EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
|
2816 |
-
ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
|
2817 |
-
npaqBA+K
|
2818 |
-
-----END CERTIFICATE-----
|
2819 |
-
|
2820 |
-
VeriSign Universal Root Certification Authority
|
2821 |
-
===============================================
|
2822 |
-
-----BEGIN CERTIFICATE-----
|
2823 |
-
MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
|
2824 |
-
BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
|
2825 |
-
ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
|
2826 |
-
IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
|
2827 |
-
IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
|
2828 |
-
UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
|
2829 |
-
cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
|
2830 |
-
IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
|
2831 |
-
aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
|
2832 |
-
1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
|
2833 |
-
MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
|
2834 |
-
9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
|
2835 |
-
AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
|
2836 |
-
tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
|
2837 |
-
CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
|
2838 |
-
a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
|
2839 |
-
DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
|
2840 |
-
Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
|
2841 |
-
Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
|
2842 |
-
P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
|
2843 |
-
wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
|
2844 |
-
mJO37M2CYfE45k+XmCpajQ==
|
2845 |
-
-----END CERTIFICATE-----
|
2846 |
-
|
2847 |
-
VeriSign Class 3 Public Primary Certification Authority - G4
|
2848 |
-
============================================================
|
2849 |
-
-----BEGIN CERTIFICATE-----
|
2850 |
-
MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
|
2851 |
-
VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
|
2852 |
-
b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
|
2853 |
-
ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
|
2854 |
-
YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
|
2855 |
-
MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
|
2856 |
-
cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
|
2857 |
-
b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
|
2858 |
-
IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
|
2859 |
-
Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
|
2860 |
-
rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
|
2861 |
-
/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
|
2862 |
-
HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
|
2863 |
-
Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
|
2864 |
-
A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
|
2865 |
-
AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
|
2866 |
-
-----END CERTIFICATE-----
|
2867 |
-
|
2868 |
-
NetLock Arany (Class Gold) Főtanúsítvány
|
2869 |
-
============================================
|
2870 |
-
-----BEGIN CERTIFICATE-----
|
2871 |
-
MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
|
2872 |
-
A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
|
2873 |
-
dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
|
2874 |
-
cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
|
2875 |
-
MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
|
2876 |
-
ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
|
2877 |
-
biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
|
2878 |
-
c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
|
2879 |
-
0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
|
2880 |
-
/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
|
2881 |
-
H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
|
2882 |
-
fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
|
2883 |
-
neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
|
2884 |
-
BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
|
2885 |
-
qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
|
2886 |
-
YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
|
2887 |
-
bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
|
2888 |
-
NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
|
2889 |
-
dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
|
2890 |
-
-----END CERTIFICATE-----
|
2891 |
-
|
2892 |
-
Staat der Nederlanden Root CA - G2
|
2893 |
-
==================================
|
2894 |
-
-----BEGIN CERTIFICATE-----
|
2895 |
-
MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
|
2896 |
-
CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
|
2897 |
-
Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC
|
2898 |
-
TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
|
2899 |
-
ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ
|
2900 |
-
5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn
|
2901 |
-
vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj
|
2902 |
-
CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil
|
2903 |
-
e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR
|
2904 |
-
OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI
|
2905 |
-
CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65
|
2906 |
-
48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi
|
2907 |
-
trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737
|
2908 |
-
qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB
|
2909 |
-
AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC
|
2910 |
-
ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
|
2911 |
-
HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA
|
2912 |
-
A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz
|
2913 |
-
+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj
|
2914 |
-
f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN
|
2915 |
-
kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk
|
2916 |
-
CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF
|
2917 |
-
URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb
|
2918 |
-
CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h
|
2919 |
-
oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV
|
2920 |
-
IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm
|
2921 |
-
66+KAQ==
|
2922 |
-
-----END CERTIFICATE-----
|
2923 |
-
|
2924 |
-
CA Disig
|
2925 |
-
========
|
2926 |
-
-----BEGIN CERTIFICATE-----
|
2927 |
-
MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK
|
2928 |
-
QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw
|
2929 |
-
MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz
|
2930 |
-
bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3
|
2931 |
-
DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm
|
2932 |
-
GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD
|
2933 |
-
Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo
|
2934 |
-
hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt
|
2935 |
-
ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w
|
2936 |
-
gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P
|
2937 |
-
AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz
|
2938 |
-
aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff
|
2939 |
-
ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa
|
2940 |
-
BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t
|
2941 |
-
WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3
|
2942 |
-
mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/
|
2943 |
-
CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K
|
2944 |
-
ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA
|
2945 |
-
4Z7CRneC9VkGjCFMhwnN5ag=
|
2946 |
-
-----END CERTIFICATE-----
|
2947 |
-
|
2948 |
-
Juur-SK
|
2949 |
-
=======
|
2950 |
-
-----BEGIN CERTIFICATE-----
|
2951 |
-
MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA
|
2952 |
-
c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw
|
2953 |
-
DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG
|
2954 |
-
SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy
|
2955 |
-
aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
|
2956 |
-
ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf
|
2957 |
-
TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC
|
2958 |
-
+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw
|
2959 |
-
UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa
|
2960 |
-
Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF
|
2961 |
-
MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD
|
2962 |
-
HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh
|
2963 |
-
AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA
|
2964 |
-
cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr
|
2965 |
-
AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw
|
2966 |
-
cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE
|
2967 |
-
FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G
|
2968 |
-
A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo
|
2969 |
-
ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL
|
2970 |
-
abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678
|
2971 |
-
IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh
|
2972 |
-
Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2
|
2973 |
-
yyqcjg==
|
2974 |
-
-----END CERTIFICATE-----
|
2975 |
-
|
2976 |
-
Hongkong Post Root CA 1
|
2977 |
-
=======================
|
2978 |
-
-----BEGIN CERTIFICATE-----
|
2979 |
-
MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
|
2980 |
-
DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
|
2981 |
-
NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
|
2982 |
-
IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
|
2983 |
-
AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
|
2984 |
-
ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
|
2985 |
-
auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
|
2986 |
-
qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
|
2987 |
-
V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
|
2988 |
-
HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
|
2989 |
-
h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
|
2990 |
-
l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
|
2991 |
-
IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
|
2992 |
-
T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
|
2993 |
-
c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
|
2994 |
-
-----END CERTIFICATE-----
|
2995 |
-
|
2996 |
-
SecureSign RootCA11
|
2997 |
-
===================
|
2998 |
-
-----BEGIN CERTIFICATE-----
|
2999 |
-
MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
|
3000 |
-
SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
|
3001 |
-
b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
|
3002 |
-
KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
|
3003 |
-
cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
|
3004 |
-
TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
|
3005 |
-
wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
|
3006 |
-
g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
|
3007 |
-
O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
|
3008 |
-
bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
|
3009 |
-
t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
|
3010 |
-
OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
|
3011 |
-
bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
|
3012 |
-
Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
|
3013 |
-
y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
|
3014 |
-
lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
|
3015 |
-
-----END CERTIFICATE-----
|
3016 |
-
|
3017 |
-
ACEDICOM Root
|
3018 |
-
=============
|
3019 |
-
-----BEGIN CERTIFICATE-----
|
3020 |
-
MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD
|
3021 |
-
T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4
|
3022 |
-
MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG
|
3023 |
-
A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF
|
3024 |
-
AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk
|
3025 |
-
WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD
|
3026 |
-
YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew
|
3027 |
-
MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb
|
3028 |
-
m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk
|
3029 |
-
HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT
|
3030 |
-
xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2
|
3031 |
-
3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9
|
3032 |
-
2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq
|
3033 |
-
TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz
|
3034 |
-
4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU
|
3035 |
-
9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv
|
3036 |
-
bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg
|
3037 |
-
aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP
|
3038 |
-
eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk
|
3039 |
-
zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1
|
3040 |
-
ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI
|
3041 |
-
KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq
|
3042 |
-
nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE
|
3043 |
-
I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp
|
3044 |
-
MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o
|
3045 |
-
tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA==
|
3046 |
-
-----END CERTIFICATE-----
|
3047 |
-
|
3048 |
-
Verisign Class 1 Public Primary Certification Authority
|
3049 |
-
=======================================================
|
3050 |
-
-----BEGIN CERTIFICATE-----
|
3051 |
-
MIICPDCCAaUCED9pHoGc8JpK83P/uUii5N0wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx
|
3052 |
-
FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmltYXJ5
|
3053 |
-
IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow
|
3054 |
-
XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAx
|
3055 |
-
IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
|
3056 |
-
A4GNADCBiQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0fzGVuDLDQ
|
3057 |
-
VoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHiTkVWaR94AoDa3EeRKbs2
|
3058 |
-
yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFgVKTk8d6Pa
|
3059 |
-
XCUDfGD67gmZPCcQcMgMCeazh88K4hiWNWLMv5sneYlfycQJ9M61Hd8qveXbhpxoJeUwfLaJFf5n
|
3060 |
-
0a3hUKw8fGJLj7qE1xIVGx/KXQ/BUpQqEZnae88MNhPVNdwQGVnqlMEAv3WP2fr9dgTbYruQagPZ
|
3061 |
-
RjXZ+Hxb
|
3062 |
-
-----END CERTIFICATE-----
|
3063 |
-
|
3064 |
-
Verisign Class 3 Public Primary Certification Authority
|
3065 |
-
=======================================================
|
3066 |
-
-----BEGIN CERTIFICATE-----
|
3067 |
-
MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx
|
3068 |
-
FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
|
3069 |
-
IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow
|
3070 |
-
XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
|
3071 |
-
IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
|
3072 |
-
A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
|
3073 |
-
f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
|
3074 |
-
hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky
|
3075 |
-
CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX
|
3076 |
-
bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/
|
3077 |
-
D/xwzoiQ
|
3078 |
-
-----END CERTIFICATE-----
|
3079 |
-
|
3080 |
-
Microsec e-Szigno Root CA 2009
|
3081 |
-
==============================
|
3082 |
-
-----BEGIN CERTIFICATE-----
|
3083 |
-
MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
|
3084 |
-
MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
|
3085 |
-
c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
|
3086 |
-
dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
|
3087 |
-
BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
|
3088 |
-
U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
|
3089 |
-
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
|
3090 |
-
fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
|
3091 |
-
0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
|
3092 |
-
pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
|
3093 |
-
1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
|
3094 |
-
AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
|
3095 |
-
QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
|
3096 |
-
FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
|
3097 |
-
lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
|
3098 |
-
I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
|
3099 |
-
tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
|
3100 |
-
yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
|
3101 |
-
LXpUq3DDfSJlgnCW
|
3102 |
-
-----END CERTIFICATE-----
|
3103 |
-
|
3104 |
-
E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi
|
3105 |
-
===================================================
|
3106 |
-
-----BEGIN CERTIFICATE-----
|
3107 |
-
MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
|
3108 |
-
EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz
|
3109 |
-
ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3
|
3110 |
-
MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0
|
3111 |
-
cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u
|
3112 |
-
aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
|
3113 |
-
AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY
|
3114 |
-
8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y
|
3115 |
-
jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI
|
3116 |
-
JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk
|
3117 |
-
9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD
|
3118 |
-
AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG
|
3119 |
-
SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d
|
3120 |
-
F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq
|
3121 |
-
D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4
|
3122 |
-
Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq
|
3123 |
-
fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX
|
3124 |
-
-----END CERTIFICATE-----
|
3125 |
-
|
3126 |
-
GlobalSign Root CA - R3
|
3127 |
-
=======================
|
3128 |
-
-----BEGIN CERTIFICATE-----
|
3129 |
-
MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
|
3130 |
-
YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
|
3131 |
-
bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
|
3132 |
-
aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
|
3133 |
-
bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
|
3134 |
-
iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
|
3135 |
-
0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
|
3136 |
-
rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
|
3137 |
-
OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
|
3138 |
-
xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
|
3139 |
-
FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
|
3140 |
-
lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
|
3141 |
-
EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
|
3142 |
-
bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
|
3143 |
-
YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
|
3144 |
-
kpeDMdmztcpHWD9f
|
3145 |
-
-----END CERTIFICATE-----
|
3146 |
-
|
3147 |
-
TC TrustCenter Universal CA III
|
3148 |
-
===============================
|
3149 |
-
-----BEGIN CERTIFICATE-----
|
3150 |
-
MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC
|
3151 |
-
REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
|
3152 |
-
IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe
|
3153 |
-
Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU
|
3154 |
-
QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex
|
3155 |
-
KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB
|
3156 |
-
AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt
|
3157 |
-
QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO
|
3158 |
-
juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut
|
3159 |
-
CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1
|
3160 |
-
M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G
|
3161 |
-
A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
|
3162 |
-
BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA
|
3163 |
-
g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+
|
3164 |
-
KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK
|
3165 |
-
BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV
|
3166 |
-
CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq
|
3167 |
-
woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg==
|
3168 |
-
-----END CERTIFICATE-----
|
3169 |
-
|
3170 |
-
Autoridad de Certificacion Firmaprofesional CIF A62634068
|
3171 |
-
=========================================================
|
3172 |
-
-----BEGIN CERTIFICATE-----
|
3173 |
-
MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
|
3174 |
-
BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
|
3175 |
-
MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
|
3176 |
-
QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
|
3177 |
-
NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
|
3178 |
-
Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
|
3179 |
-
B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
|
3180 |
-
7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
|
3181 |
-
ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
|
3182 |
-
plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
|
3183 |
-
MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
|
3184 |
-
LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
|
3185 |
-
bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
|
3186 |
-
vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
|
3187 |
-
EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
|
3188 |
-
DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
|
3189 |
-
cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
|
3190 |
-
bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
|
3191 |
-
ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
|
3192 |
-
51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
|
3193 |
-
R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
|
3194 |
-
T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
|
3195 |
-
Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
|
3196 |
-
osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
|
3197 |
-
crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
|
3198 |
-
saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
|
3199 |
-
KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
|
3200 |
-
6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
|
3201 |
-
-----END CERTIFICATE-----
|
3202 |
-
|
3203 |
-
Izenpe.com
|
3204 |
-
==========
|
3205 |
-
-----BEGIN CERTIFICATE-----
|
3206 |
-
MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG
|
3207 |
-
EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz
|
3208 |
-
MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu
|
3209 |
-
QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ
|
3210 |
-
03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK
|
3211 |
-
ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU
|
3212 |
-
+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC
|
3213 |
-
PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT
|
3214 |
-
OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK
|
3215 |
-
F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK
|
3216 |
-
0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+
|
3217 |
-
0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB
|
3218 |
-
leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID
|
3219 |
-
AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+
|
3220 |
-
SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG
|
3221 |
-
NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
|
3222 |
-
MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
|
3223 |
-
BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l
|
3224 |
-
Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga
|
3225 |
-
kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q
|
3226 |
-
hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs
|
3227 |
-
g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5
|
3228 |
-
aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5
|
3229 |
-
nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC
|
3230 |
-
ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo
|
3231 |
-
Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z
|
3232 |
-
WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
|
3233 |
-
-----END CERTIFICATE-----
|
3234 |
-
|
3235 |
-
Chambers of Commerce Root - 2008
|
3236 |
-
================================
|
3237 |
-
-----BEGIN CERTIFICATE-----
|
3238 |
-
MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
|
3239 |
-
MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
|
3240 |
-
bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
|
3241 |
-
QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
|
3242 |
-
Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
|
3243 |
-
ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
|
3244 |
-
EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
|
3245 |
-
cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
|
3246 |
-
AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
|
3247 |
-
XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
|
3248 |
-
h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
|
3249 |
-
ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
|
3250 |
-
NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
|
3251 |
-
D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
|
3252 |
-
lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
|
3253 |
-
0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
|
3254 |
-
ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
|
3255 |
-
EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
|
3256 |
-
G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
|
3257 |
-
BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
|
3258 |
-
bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
|
3259 |
-
bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
|
3260 |
-
CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
|
3261 |
-
AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
|
3262 |
-
wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
|
3263 |
-
3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
|
3264 |
-
RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
|
3265 |
-
M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
|
3266 |
-
YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
|
3267 |
-
9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
|
3268 |
-
zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
|
3269 |
-
nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
|
3270 |
-
OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
|
3271 |
-
-----END CERTIFICATE-----
|
3272 |
-
|
3273 |
-
Global Chambersign Root - 2008
|
3274 |
-
==============================
|
3275 |
-
-----BEGIN CERTIFICATE-----
|
3276 |
-
MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
|
3277 |
-
MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
|
3278 |
-
bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
|
3279 |
-
QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
|
3280 |
-
NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
|
3281 |
-
Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
|
3282 |
-
QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
|
3283 |
-
aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
|
3284 |
-
VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
|
3285 |
-
XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
|
3286 |
-
ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
|
3287 |
-
/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
|
3288 |
-
TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
|
3289 |
-
H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
|
3290 |
-
Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
|
3291 |
-
HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
|
3292 |
-
wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
|
3293 |
-
AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
|
3294 |
-
BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
|
3295 |
-
BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
|
3296 |
-
aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
|
3297 |
-
aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
|
3298 |
-
1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
|
3299 |
-
dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
|
3300 |
-
/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
|
3301 |
-
ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
|
3302 |
-
dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
|
3303 |
-
9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
|
3304 |
-
foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
|
3305 |
-
qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
|
3306 |
-
P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
|
3307 |
-
c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
|
3308 |
-
09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
|
3309 |
-
-----END CERTIFICATE-----
|
3310 |
-
|
3311 |
-
Go Daddy Root Certificate Authority - G2
|
3312 |
-
========================================
|
3313 |
-
-----BEGIN CERTIFICATE-----
|
3314 |
-
MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
|
3315 |
-
B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
|
3316 |
-
MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
|
3317 |
-
MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
|
3318 |
-
b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
|
3319 |
-
A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
|
3320 |
-
hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
|
3321 |
-
9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
|
3322 |
-
+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
|
3323 |
-
fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
|
3324 |
-
NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
|
3325 |
-
MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
|
3326 |
-
BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
|
3327 |
-
vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
|
3328 |
-
5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
|
3329 |
-
N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
|
3330 |
-
LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
|
3331 |
-
-----END CERTIFICATE-----
|
3332 |
-
|
3333 |
-
Starfield Root Certificate Authority - G2
|
3334 |
-
=========================================
|
3335 |
-
-----BEGIN CERTIFICATE-----
|
3336 |
-
MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
|
3337 |
-
B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
|
3338 |
-
b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
|
3339 |
-
eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
|
3340 |
-
DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
|
3341 |
-
VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
|
3342 |
-
dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
|
3343 |
-
W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
|
3344 |
-
bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
|
3345 |
-
N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
|
3346 |
-
ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
|
3347 |
-
JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
|
3348 |
-
AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
|
3349 |
-
TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
|
3350 |
-
4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
|
3351 |
-
F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
|
3352 |
-
pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
|
3353 |
-
c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
|
3354 |
-
-----END CERTIFICATE-----
|
3355 |
-
|
3356 |
-
Starfield Services Root Certificate Authority - G2
|
3357 |
-
==================================================
|
3358 |
-
-----BEGIN CERTIFICATE-----
|
3359 |
-
MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
|
3360 |
-
B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
|
3361 |
-
b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
|
3362 |
-
IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
|
3363 |
-
BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
|
3364 |
-
dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
|
3365 |
-
Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
|
3366 |
-
AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
|
3367 |
-
h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
|
3368 |
-
hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
|
3369 |
-
LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
|
3370 |
-
rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
|
3371 |
-
AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
|
3372 |
-
SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
|
3373 |
-
E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
|
3374 |
-
xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
|
3375 |
-
iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
|
3376 |
-
YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
|
3377 |
-
-----END CERTIFICATE-----
|
3378 |
-
|
3379 |
-
AffirmTrust Commercial
|
3380 |
-
======================
|
3381 |
-
-----BEGIN CERTIFICATE-----
|
3382 |
-
MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
|
3383 |
-
BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
|
3384 |
-
MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
|
3385 |
-
bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
|
3386 |
-
AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
|
3387 |
-
DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
|
3388 |
-
C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
|
3389 |
-
BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
|
3390 |
-
MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
|
3391 |
-
HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
|
3392 |
-
AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
|
3393 |
-
hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
|
3394 |
-
qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
|
3395 |
-
0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
|
3396 |
-
sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
|
3397 |
-
-----END CERTIFICATE-----
|
3398 |
-
|
3399 |
-
AffirmTrust Networking
|
3400 |
-
======================
|
3401 |
-
-----BEGIN CERTIFICATE-----
|
3402 |
-
MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
|
3403 |
-
BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
|
3404 |
-
MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
|
3405 |
-
bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
|
3406 |
-
AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
|
3407 |
-
Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
|
3408 |
-
dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
|
3409 |
-
/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
|
3410 |
-
h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
|
3411 |
-
HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
|
3412 |
-
AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
|
3413 |
-
UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
|
3414 |
-
12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
|
3415 |
-
WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
|
3416 |
-
/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
|
3417 |
-
-----END CERTIFICATE-----
|
3418 |
-
|
3419 |
-
AffirmTrust Premium
|
3420 |
-
===================
|
3421 |
-
-----BEGIN CERTIFICATE-----
|
3422 |
-
MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS
|
3423 |
-
BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy
|
3424 |
-
OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy
|
3425 |
-
dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
|
3426 |
-
MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn
|
3427 |
-
BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV
|
3428 |
-
5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs
|
3429 |
-
+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd
|
3430 |
-
GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R
|
3431 |
-
p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI
|
3432 |
-
S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04
|
3433 |
-
6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5
|
3434 |
-
/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo
|
3435 |
-
+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB
|
3436 |
-
/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv
|
3437 |
-
MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
|
3438 |
-
Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC
|
3439 |
-
6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S
|
3440 |
-
L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK
|
3441 |
-
+4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV
|
3442 |
-
BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg
|
3443 |
-
IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60
|
3444 |
-
g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb
|
3445 |
-
zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==
|
3446 |
-
-----END CERTIFICATE-----
|
3447 |
-
|
3448 |
-
AffirmTrust Premium ECC
|
3449 |
-
=======================
|
3450 |
-
-----BEGIN CERTIFICATE-----
|
3451 |
-
MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
|
3452 |
-
BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
|
3453 |
-
MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
|
3454 |
-
cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
|
3455 |
-
IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
|
3456 |
-
N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
|
3457 |
-
BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
|
3458 |
-
BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
|
3459 |
-
57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
|
3460 |
-
eQ==
|
3461 |
-
-----END CERTIFICATE-----
|
3462 |
-
|
3463 |
-
Certum Trusted Network CA
|
3464 |
-
=========================
|
3465 |
-
-----BEGIN CERTIFICATE-----
|
3466 |
-
MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
|
3467 |
-
ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
|
3468 |
-
biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
|
3469 |
-
MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
|
3470 |
-
ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
|
3471 |
-
MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
|
3472 |
-
AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
|
3473 |
-
l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
|
3474 |
-
J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
|
3475 |
-
fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
|
3476 |
-
cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
|
3477 |
-
Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
|
3478 |
-
DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
|
3479 |
-
jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
|
3480 |
-
mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
|
3481 |
-
Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
|
3482 |
-
03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
|
3483 |
-
-----END CERTIFICATE-----
|
3484 |
-
|
3485 |
-
Certinomis - Autorité Racine
|
3486 |
-
=============================
|
3487 |
-
-----BEGIN CERTIFICATE-----
|
3488 |
-
MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
|
3489 |
-
Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg
|
3490 |
-
LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG
|
3491 |
-
A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw
|
3492 |
-
JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD
|
3493 |
-
ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa
|
3494 |
-
wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly
|
3495 |
-
Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw
|
3496 |
-
2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N
|
3497 |
-
jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q
|
3498 |
-
c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC
|
3499 |
-
lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb
|
3500 |
-
xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g
|
3501 |
-
530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna
|
3502 |
-
4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
|
3503 |
-
A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ
|
3504 |
-
KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x
|
3505 |
-
WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva
|
3506 |
-
R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40
|
3507 |
-
nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B
|
3508 |
-
CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv
|
3509 |
-
JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE
|
3510 |
-
qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b
|
3511 |
-
WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE
|
3512 |
-
wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/
|
3513 |
-
vgt2Fl43N+bYdJeimUV5
|
3514 |
-
-----END CERTIFICATE-----
|
3515 |
-
|
3516 |
-
Root CA Generalitat Valenciana
|
3517 |
-
==============================
|
3518 |
-
-----BEGIN CERTIFICATE-----
|
3519 |
-
MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE
|
3520 |
-
ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290
|
3521 |
-
IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3
|
3522 |
-
WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE
|
3523 |
-
CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G
|
3524 |
-
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2
|
3525 |
-
F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B
|
3526 |
-
ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ
|
3527 |
-
D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte
|
3528 |
-
JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB
|
3529 |
-
AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n
|
3530 |
-
dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB
|
3531 |
-
ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl
|
3532 |
-
AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA
|
3533 |
-
YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy
|
3534 |
-
AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA
|
3535 |
-
aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt
|
3536 |
-
AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA
|
3537 |
-
YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu
|
3538 |
-
AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA
|
3539 |
-
OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0
|
3540 |
-
dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV
|
3541 |
-
BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G
|
3542 |
-
A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S
|
3543 |
-
b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh
|
3544 |
-
TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz
|
3545 |
-
Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63
|
3546 |
-
NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH
|
3547 |
-
iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt
|
3548 |
-
+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=
|
3549 |
-
-----END CERTIFICATE-----
|
3550 |
-
|
3551 |
-
A-Trust-nQual-03
|
3552 |
-
================
|
3553 |
-
-----BEGIN CERTIFICATE-----
|
3554 |
-
MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE
|
3555 |
-
Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy
|
3556 |
-
a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R
|
3557 |
-
dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw
|
3558 |
-
RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0
|
3559 |
-
ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1
|
3560 |
-
c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA
|
3561 |
-
zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n
|
3562 |
-
yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE
|
3563 |
-
SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4
|
3564 |
-
iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V
|
3565 |
-
cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV
|
3566 |
-
eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40
|
3567 |
-
ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr
|
3568 |
-
sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd
|
3569 |
-
JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS
|
3570 |
-
mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vL
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|